From 928de5eea4a2f5683755bc249558ec8c4e16355d Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Sat, 14 Mar 2026 12:53:52 +0300 Subject: [PATCH 01/54] IGNITE-28207 IgniteClassPath creation --- .idea/inspectionProfiles/Project_Default.xml | 10 +- .../ignite/internal/util/lang/GridFunc.java | 14 ++ .../IgniteControlUtilityTestSuite2.java | 4 +- .../util/GridCommandHandlerClassPathTest.java | 73 ++++++++ .../ignite/internal/GridKernalContext.java | 6 + .../internal/GridKernalContextImpl.java | 12 ++ .../apache/ignite/internal/IgniteKernal.java | 2 + .../classpath/ClassPathProcessor.java | 169 ++++++++++++++++++ .../internal/classpath/IgniteClassPath.java | 93 ++++++++++ .../classpath/IgniteClassPathState.java | 30 ++++ .../internal/client/thin/ClientOperation.java | 3 + .../internal/client/thin/TcpIgniteClient.java | 52 ++++++ .../management/IgniteCommandRegistry.java | 4 +- .../classpath/ClassPathCommand.java | 30 ++++ .../classpath/ClassPathCreateCommand.java | 131 ++++++++++++++ .../classpath/ClassPathCreateCommandArg.java | 67 +++++++ .../classpath/ClassPathStartCreationTask.java | 51 ++++++ .../persistence/filename/NodeFileTree.java | 18 ++ .../persistence/filename/SharedFileTree.java | 8 + .../reader/StandaloneGridKernalContext.java | 6 + .../platform/client/ClientMessageParser.java | 7 + .../classpath/ClientFileUploadRequest.java | 141 +++++++++++++++ .../internal/visor/VisorOneNodeTask.java | 2 + 23 files changed, 928 insertions(+), 5 deletions(-) create mode 100644 modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCommand.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommandArg.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 0af10ada908d7..230bf03e768a9 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -369,7 +369,6 @@ - - @@ -625,7 +623,13 @@ - + + + diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java index 8bf794062ef45..6c38c62040684 100755 --- a/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java @@ -2153,4 +2153,18 @@ public static Collection emptyIfNull(@Nullable Collection col) { public static Map emptyIfNull(@Nullable Map map) { return map == null ? Collections.emptyMap() : map; } + + /** + * @param arr Array. + * @param el Element. + * @return Element index or {@code -1} if not found. + */ + public static int indexOf(T[] arr, T el) { + for (int i = 0; i < arr.length; i++) { + if (Objects.equals(arr[i], el)) + return i; + } + + return -1; + } } diff --git a/modules/control-utility/src/test/java/org/apache/ignite/testsuites/IgniteControlUtilityTestSuite2.java b/modules/control-utility/src/test/java/org/apache/ignite/testsuites/IgniteControlUtilityTestSuite2.java index d7ed2b5124613..d60fe72b6d98d 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/testsuites/IgniteControlUtilityTestSuite2.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/testsuites/IgniteControlUtilityTestSuite2.java @@ -22,6 +22,7 @@ import org.apache.ignite.util.CacheMetricsCommandTest; import org.apache.ignite.util.CdcCommandTest; import org.apache.ignite.util.CdcResendCommandTest; +import org.apache.ignite.util.GridCommandHandlerClassPathTest; import org.apache.ignite.util.GridCommandHandlerConsistencyBinaryTest; import org.apache.ignite.util.GridCommandHandlerConsistencyCountersTest; import org.apache.ignite.util.GridCommandHandlerConsistencyRepairCorrectnessAtomicTest; @@ -77,7 +78,8 @@ SecurityCommandHandlerPermissionsTest.class, - IdleVerifyDumpTest.class + IdleVerifyDumpTest.class, + GridCommandHandlerClassPathTest.class }) public class IgniteControlUtilityTestSuite2 { } diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java new file mode 100644 index 0000000000000..6b3cfad39d3ce --- /dev/null +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.util; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.stream.Collectors; +import org.junit.Test; + +import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; + +/** + * Test for --classpath command. + */ +public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractTest { + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + cleanPersistenceDir(); + + startGrids(2); + + super.beforeTestsStarted(); + } + + /** Tests --create command. */ + @Test + public void testCreate() throws Exception { + String jars = Files.list(Path.of(getClass().getClassLoader().getResource(".").getPath() + "../")) + .map(Path::toAbsolutePath) + .map(Path::toString) + .filter(f -> f.endsWith("jar")) + .collect(Collectors.joining(",")); + + Path dir = Path.of(getClass().getClassLoader().getResource(".").getPath() + "../../../core/target"); + + System.out.println("dir = " + dir); + + String coreJars = Files.list(dir) + .map(Path::toAbsolutePath) + .map(Path::toString) + .filter(f -> f.endsWith("jar")) + .collect(Collectors.joining(",")); + + jars += "," + coreJars; + + injectTestSystemOut(); + + final TestCommandHandler hnd = newCommandHandler(createTestLogger()); + + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", "mysuperapp", "--files", jars)); + + String outStr = testOut.toString(); + + stopAllGrids(); + + System.out.println(outStr); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java index 742105bf4da59..e9a0a1a14afd3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java @@ -26,6 +26,7 @@ import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.cache.query.index.IndexProcessor; import org.apache.ignite.internal.cache.transform.CacheObjectTransformerProcessor; +import org.apache.ignite.internal.classpath.ClassPathProcessor; import org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager; import org.apache.ignite.internal.managers.collision.GridCollisionManager; import org.apache.ignite.internal.managers.communication.GridIoManager; @@ -648,6 +649,11 @@ public interface GridKernalContext extends Iterable { */ public RollingUpgradeProcessor rollingUpgrade(); + /** + * @return Class path processor. + */ + public ClassPathProcessor classPath(); + /** * Executor that is in charge of processing user async continuations. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java index 2a7c7f66afa67..831d2a71b6f74 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java @@ -42,6 +42,7 @@ import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.cache.query.index.IndexProcessor; import org.apache.ignite.internal.cache.transform.CacheObjectTransformerProcessor; +import org.apache.ignite.internal.classpath.ClassPathProcessor; import org.apache.ignite.internal.maintenance.MaintenanceProcessor; import org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager; import org.apache.ignite.internal.managers.collision.GridCollisionManager; @@ -367,6 +368,10 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable @GridToStringExclude private RollingUpgradeProcessor rollUpProc; + /** Classpath processor. */ + @GridToStringExclude + private ClassPathProcessor classPathProc; + /** */ private Thread.UncaughtExceptionHandler hnd; @@ -603,6 +608,8 @@ else if (comp instanceof PerformanceStatisticsProcessor) perfStatProc = (PerformanceStatisticsProcessor)comp; else if (comp instanceof RollingUpgradeProcessor) rollUpProc = (RollingUpgradeProcessor)comp; + else if (comp instanceof ClassPathProcessor) + classPathProc = (ClassPathProcessor)comp; else if (comp instanceof IndexProcessor) indexProc = (IndexProcessor)comp; else if (!(comp instanceof DiscoveryNodeValidationProcessor @@ -1117,6 +1124,11 @@ public void recoveryMode(boolean recoveryMode) { return rollUpProc; } + /** {@inheritDoc} */ + @Override public ClassPathProcessor classPath() { + return classPathProc; + } + /** {@inheritDoc} */ @Override public Executor getAsyncContinuationExecutor() { return config().getAsyncContinuationExecutor() == null diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index ebaa9d0bbabcd..5c73d1de07c34 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -90,6 +90,7 @@ import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.cache.query.index.IndexProcessor; import org.apache.ignite.internal.cache.transform.CacheObjectTransformerProcessor; +import org.apache.ignite.internal.classpath.ClassPathProcessor; import org.apache.ignite.internal.cluster.ClusterGroupAdapter; import org.apache.ignite.internal.cluster.IgniteClusterEx; import org.apache.ignite.internal.maintenance.MaintenanceProcessor; @@ -1008,6 +1009,7 @@ public void start( startManager(new GridFailoverManager(ctx)); startManager(new GridCollisionManager(ctx)); startManager(new GridIndexingManager(ctx)); + startProcessor(new ClassPathProcessor(ctx)); // Assign discovery manager to context before other processors start so they // are able to register custom event listener. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java new file mode 100644 index 0000000000000..4b9e24f743a81 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.classpath; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.processors.GridProcessorAdapter; +import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.A; +import org.apache.ignite.internal.util.typedef.internal.U; + +import static org.apache.ignite.internal.classpath.IgniteClassPathState.CREATING; + +/** + * TODO: + * 1. How to check data integrity on start? + * Do we want to do this for txt file or for jar only? + * 2. Check and remove obsolete icp from dist on start. + * Do we want to have some flag to skip remove in this case? (if we preparing for ICP registration). + * 3. Should we include CP into snapshots and dumps? + */ +public class ClassPathProcessor extends GridProcessorAdapter { + /** Prefix for metastorage keys. */ + public static final String METASTORE_PREFIX = "classpath."; + + /** + * @param ctx Kernal context. + */ + public ClassPathProcessor(GridKernalContext ctx) { + super(ctx); + } + + /** + * Register new classpath in metastorage it same name not exists. + * Fails if exists. + * + * @param name + * @param files + * @param lengths + * @return + */ + public UUID startCreation(String name, String[] files, long[] lengths) { + assert files.length == lengths.length : "wrong arrays lengths"; + A.ensure(U.alphanumericUnderscore(name), "Classpath name must satisfy the following name pattern: a-zA-Z0-9_"); + + String key = METASTORE_PREFIX + name; + + IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths); + + try { + if (!ctx.distributedMetastorage().compareAndSet(key, null, icp)) + throw new IgniteException("Classpath alreay exists: " + name); + } + catch (IgniteCheckedException e) { + throw new IgniteException(e); + } + + try { + NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); + + File root = ft.classPath(name); + + NodeFileTree.mkdir(root, "Ignite Class Path root: " + name); + + log.info("New classpath registered [root = " + root + ", icp=" + icp + ']'); + + return icp.id(); + } + catch (Exception e) { + try { + ctx.distributedMetastorage().remove(key); + } + catch (IgniteCheckedException ex) { + log.error("Can't remove metastorage key for IgniteClassPath: " + key, e); + } + + throw e; + } + } + + /** + * @param icpID ClassPath ID. + * @param name File name. + * @param offset Offset to write data to. + * @param bytesCnt Bytes count in batch to write. + * @param batch Batch. + */ + public void uploadFilePart( + UUID icpID, + String name, + long offset, + int bytesCnt, + byte[] batch + ) throws IgniteCheckedException, IOException { + try { + IgniteClassPath icp = search(icpID); + + if (F.indexOf(icp.files(), name) == -1) + throw new IllegalArgumentException("Unknown lib [icp=" + icp.name() + ", unknown_lib=" + name + ']'); + + File lib = new File(ctx.pdsFolderResolver().fileTree().classPath(icp.name()), name); + + if (offset == 0) { + log.info("Creating new classpath file: " + lib); + + if (!lib.createNewFile()) + throw new IgniteException("File exists: " + lib); + } + + try (RandomAccessFile raf = new RandomAccessFile(lib, "rw")) { + if (raf.length() < offset) { + throw new IgniteException("Wrong offset [icp=" + icp.name() + ", lib=" + name + ", " + + "fileLength=" + raf.length() + ", offset=" + offset + ']'); + } + + raf.seek(offset); + raf.write(batch, 0, bytesCnt); + } + } + catch (Exception e) { + log.error("UploadFilePart:", e); + + throw e; + } + } + + /** + * @param icpID ClassPath ID. + * @return Class path. + * @throws IgniteCheckedException If failed. + */ + private IgniteClassPath search(UUID icpID) throws IgniteCheckedException { + IgniteClassPath[] icp = new IgniteClassPath[1]; + + ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, icp0) -> { + if (icpID.equals(((IgniteClassPath)icp0).id())) + icp[0] = (IgniteClassPath)icp0; + }); + + if (icp[0] == null) + throw new IgniteException("ClassPath not found: " + icpID); + + if (icp[0].state() != CREATING) + throw new IgniteException("ClassPath in wrong state [expected=" + CREATING + ", status=" + icp[0].state() + ']'); + + return icp[0]; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java new file mode 100644 index 0000000000000..78c2127723976 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.classpath; + +import java.io.Serializable; +import java.util.UUID; +import org.apache.ignite.internal.util.typedef.internal.S; + +/** + * Class path POJO. + */ +public class IgniteClassPath implements Serializable { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + private UUID id; + + /** */ + private String name; + + /** */ + private String[] files; + + /** */ + private long[] lengths; + + /** */ + private IgniteClassPathState state; + + /** + * @param id Unique id of classpath. + * @param name User provided name. + * @param files Files to include to classpath. + */ + public IgniteClassPath(UUID id, String name, String[] files, long[] lengths) { + this.id = id; + this.name = name; + this.files = files; + this.lengths = lengths; + this.state = IgniteClassPathState.CREATING; + } + + /** */ + public IgniteClassPathState state() { + return state; + } + + /** */ + public void state(IgniteClassPathState state) { + this.state = state; + } + + /** */ + public UUID id() { + return id; + } + + /** */ + public String name() { + return name; + } + + /** */ + public String[] files() { + return files; + } + + /** */ + public long[] lengths() { + return lengths; + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(IgniteClassPath.class, this); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java new file mode 100644 index 0000000000000..595bec09fc129 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.classpath; + +/** */ +public enum IgniteClassPathState { + /** Creationg process in progress. */ + CREATING, + + /** Ready for usage. */ + READY, + + /** Marked for removal. Newly started code can't use corresponding classpath. */ + REMOVING +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java index 112dc47c7125a..747dfd5867dff 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java @@ -294,6 +294,9 @@ public enum ClientOperation { /** IgniteSet.iterator page. */ OP_SET_ITERATOR_GET_PAGE(9023), + /** File upload. */ + FILE_UPLOAD(9030), + /** Stop warmup. */ OP_STOP_WARMUP(10000); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index b21eca8578160..21e8b45149260 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -18,12 +18,17 @@ package org.apache.ignite.internal.client.thin; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.EventListener; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; @@ -55,6 +60,7 @@ import org.apache.ignite.client.events.ClientLifecycleEventListener; import org.apache.ignite.client.events.ClientStartEvent; import org.apache.ignite.client.events.ClientStopEvent; +import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.BinaryConfiguration; import org.apache.ignite.configuration.ClientConfiguration; import org.apache.ignite.configuration.ClientTransactionConfiguration; @@ -625,6 +631,52 @@ private void retrieveBinaryConfiguration(ClientConfiguration cfg) { marsh.setBinaryConfiguration(resCfg); } + /** + * @param node Node to upload file to. + * @param icpID Classpath ID. + * @param file File to upload. + */ + public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws IOException { + List uploadNode = Collections.singletonList(node.id()); + + String name = file.getFileName().toString(); + byte[] batch = new byte[(int)(U.MB)]; + + try (InputStream fis = Files.newInputStream(file)) { + long[] offset = new long[] {0}; + int[] bytesCnt = new int[1]; + + // We want to create empty file on the server side. + bytesCnt[0] = fis.read(batch); + + do { + ch.service( + ClientOperation.FILE_UPLOAD, + ch -> { + try (BinaryWriterEx w = BinaryUtils.writer(marsh.context(), ch.out(), null)) { + w.writeUuid(node.id()); + w.writeUuid(icpID); + w.writeString(name); + w.writeLong(offset[0]); + w.writeInt(bytesCnt[0]); + w.writeByteArray(batch); + } + }, + in -> null, + uploadNode // Request can still be sent to a random (default) node. + ); + + offset[0] += bytesCnt[0]; + bytesCnt[0] = fis.read(batch); + } + while (bytesCnt[0] > 0); + + // Check all data read and sent. + if (offset[0] != Files.size(file)) + throw new IOException("Can't read all data from file"); + } + } + /** * Thin client implementation of {@link BinaryMetadataHandler}. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/IgniteCommandRegistry.java b/modules/core/src/main/java/org/apache/ignite/internal/management/IgniteCommandRegistry.java index 1f28f1cfbd24c..ec61e61f34667 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/IgniteCommandRegistry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/IgniteCommandRegistry.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.management.cache.CacheCommand; import org.apache.ignite.internal.management.cdc.CdcCommand; import org.apache.ignite.internal.management.checkpoint.CheckpointCommand; +import org.apache.ignite.internal.management.classpath.ClassPathCommand; import org.apache.ignite.internal.management.consistency.ConsistencyCommand; import org.apache.ignite.internal.management.defragmentation.DefragmentationCommand; import org.apache.ignite.internal.management.diagnostic.DiagnosticCommand; @@ -77,7 +78,8 @@ public IgniteCommandRegistry() { new DefragmentationCommand(), new PerformanceStatisticsCommand(), new CdcCommand(), - new ConsistencyCommand() + new ConsistencyCommand(), + new ClassPathCommand() ); U.loadService(CommandsProvider.class).forEach(p -> p.commands().forEach(this::register)); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCommand.java new file mode 100644 index 0000000000000..f297278661da7 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCommand.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.management.classpath; + +import org.apache.ignite.internal.management.api.CommandRegistryImpl; + +/** Command to manage IgniteClassPath. */ +public class ClassPathCommand extends CommandRegistryImpl { + /** */ + public ClassPathCommand() { + super( + new ClassPathCreateCommand() + ); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java new file mode 100644 index 0000000000000..2d25cccc642e1 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.management.classpath; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteException; +import org.apache.ignite.client.IgniteClient; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.client.thin.TcpIgniteClient; +import org.apache.ignite.internal.management.api.CommandUtils; +import org.apache.ignite.internal.management.api.NativeCommand; +import org.apache.ignite.internal.util.typedef.F; +import org.jetbrains.annotations.Nullable; + +/** + * + */ +public class ClassPathCreateCommand implements NativeCommand { + /** {@inheritDoc} */ + @Override public String description() { + return "Create ClassPath instance from set of local file"; + } + + /** {@inheritDoc} */ + @Override public Class argClass() { + return ClassPathCreateCommandArg.class; + } + + /** {@inheritDoc} */ + @Override public Void execute( + @Nullable IgniteClient client, + @Nullable Ignite ignite, + ClassPathCreateCommandArg arg, + Consumer printer + ) throws Exception { + if (client != null) { + create(client, arg, printer); + + return null; + } + + throw new UnsupportedOperationException("Creating with the Ignite instance not supported at a time."); + } + + /** */ + private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg, Consumer printer) throws Exception { + TcpIgniteClient cli = (TcpIgniteClient)client; + + List files = new ArrayList<>(arg.files.length); + long[] lengths = new long[arg.files.length]; + + for (int i = 0; i < arg.files.length; i++) { + Path f = Path.of(arg.files[i]); + + if (!Files.exists(f)) + throw new IllegalArgumentException("File not exists: " + f); + + files.add(f); + + lengths[i] = Files.size(f); + } + + arg.lengths = lengths; + // We don't want to send full path to server nodes. + // Server nodes require files names, only. + arg.files = fileNames(files); + + ClusterNode uploadNode = uploadNode(client); + + printer.accept("Upload node: " + uploadNode.id()); + + UUID icpID = CommandUtils.execute(client, null, ClassPathStartCreationTask.class, arg, Collections.singletonList(uploadNode)); + + printer.accept("New classpath registered [uploadNode=" + uploadNode.id() + ", name=" + arg.name + ", id=" + icpID.toString() + ']'); + printer.accept("Starting to upload files:"); + + for (Path file : files) { + printer.accept(String.valueOf(file.toAbsolutePath())); + cli.uploadClasspathFile(uploadNode, icpID, file); + printer.accept("DONE"); + } + } + + /** */ + private static ClusterNode uploadNode(IgniteClient client) { + Collection nodes = CommandUtils.nodes(client, null); + + if (F.isEmpty(nodes)) + throw new IgniteException("Cluster empty"); + + Collection servers = CommandUtils.servers(nodes); + + if (F.isEmpty(servers)) + throw new IgniteException("No server nodes"); + + return F.first(servers); + } + + /** */ + private static String[] fileNames(List files) { + String[] fileNames = new String[files.size()]; + + for (int i = 0; i < fileNames.length; i++) + fileNames[i] = files.get(i).getFileName().toString(); + + return fileNames; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommandArg.java new file mode 100644 index 0000000000000..586654424a80d --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommandArg.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.management.classpath; + +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.dto.IgniteDataTransferObject; +import org.apache.ignite.internal.management.api.Argument; + +/** */ +public class ClassPathCreateCommandArg extends IgniteDataTransferObject { + /** */ + private static final long serialVersionUID = 0; + + /** */ + @Order(0) + @Argument(description = "Name of the classpath") + String name; + + /** */ + @Order(1) + @Argument(description = "Files to add to classpath") + String[] files; + + /** */ + @Order(2) + long[] lengths; + + /** */ + public String name() { + return name; + } + + /** */ + public void name(String name) { + this.name = name; + } + + /** */ + public String[] files() { + return files; + } + + /** */ + public void files(String[] files) { + this.files = files; + } + + /** */ + public long[] lengths() { + return lengths; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java new file mode 100644 index 0000000000000..c7c11a1c7fce8 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.management.classpath; + +import java.util.UUID; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.visor.VisorJob; +import org.apache.ignite.internal.visor.VisorOneNodeTask; +import org.jetbrains.annotations.Nullable; + +/** */ +public class ClassPathStartCreationTask extends VisorOneNodeTask { + /** */ + private static final long serialVersionUID = 0L; + + /** {@inheritDoc} */ + @Override protected VisorJob job(ClassPathCreateCommandArg arg) { + return new ClassPathStartCreationJob(arg, debug); + } + + /** */ + private static class ClassPathStartCreationJob extends VisorJob { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + protected ClassPathStartCreationJob(@Nullable ClassPathCreateCommandArg arg, boolean debug) { + super(arg, debug); + } + + /** {@inheritDoc} */ + @Override protected UUID run(@Nullable ClassPathCreateCommandArg arg) throws IgniteException { + return ignite.context().classPath().startCreation(arg.name, arg.files, arg.lengths); + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java index 159eeb77db7c9..2100a9fe0d0f6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java @@ -295,6 +295,9 @@ public class NodeFileTree extends SharedFileTree { /** Path to the storage directory. */ private final File nodeStorage; + /** Path to the root classpath directory. */ + private final File icp; + /** * Key is the path from {@link DataStorageConfiguration#getExtraStoragePaths()}, may be relative. Value is storage. * @see DataStorageConfiguration#getExtraStoragePaths() @@ -334,6 +337,7 @@ public NodeFileTree(File root, String folderName) { this.folderName = folderName; binaryMeta = new File(binaryMetaRoot, folderName); + icp = new File(icpRoot, folderName); nodeStorage = rootRelative(DB_DIR); checkpoint = new File(nodeStorage, CHECKPOINT_DIR); wal = rootRelative(DFLT_WAL_PATH); @@ -382,6 +386,7 @@ protected NodeFileTree(IgniteConfiguration cfg, File root, String folderName, bo this.folderName = folderName; binaryMeta = new File(binaryMetaRoot, folderName); + icp = new File(icpRoot, folderName); DataStorageConfiguration dsCfg = cfg.getDataStorageConfiguration(); @@ -431,6 +436,11 @@ public File binaryMeta() { return binaryMeta; } + /** @return Root directory for Ignite class path files. */ + public File classPathRoot() { + return icp; + } + /** @return Path to the directory containing active WAL segments. */ public @Nullable File wal() { return wal; @@ -1082,6 +1092,14 @@ public File maintenanceFile() { return new File(nodeStorage, MAINTENANCE_FILE_NAME); } + /** + * @param name IgniteClassPath name. + * @return IgniteClassPath directory. + */ + public File classPath(String name) { + return new File(icp, name); + } + /** * @param includeMeta If {@code true} then include metadata directory into results. * @param filter Cache group names to filter. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/SharedFileTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/SharedFileTree.java index 33df1ed636040..199b9a00e38d4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/SharedFileTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/SharedFileTree.java @@ -36,6 +36,7 @@ * ├── db ← db (shared between all local nodes). * │ ├── binary_meta ← binaryMetaRoot (shared between all local nodes). * │ ├── marshaller ← marshaller (shared between all local nodes). + * │ ├── classpath ← classpath (shared between all local nodes). * └── snapshots ← snpsRoot (shared between all local nodes). * * @@ -48,6 +49,9 @@ public class SharedFileTree { /** Name of marshaller mappings folder. */ public static final String MARSHALLER_DIR = "marshaller"; + /** Name of classpath folder. */ + public static final String CLASSPATH_DIR = "classpath"; + /** Database default folder. */ protected static final String DB_DIR = "db"; @@ -60,6 +64,9 @@ public class SharedFileTree { /** Path to the directory containing marshaller files. */ private final File marshaller; + /** Path to the directory containing classpath files. */ + protected final File icpRoot; + /** Path to the snapshot root directory. */ private final File snpsRoot; @@ -77,6 +84,7 @@ protected SharedFileTree(File root, String snpsRoot) { marshaller = Paths.get(rootStr, DB_DIR, MARSHALLER_DIR).toFile(); binaryMetaRoot = Paths.get(rootStr, DB_DIR, BINARY_METADATA_DIR).toFile(); + icpRoot = Paths.get(rootStr, DB_DIR, CLASSPATH_DIR).toFile(); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java index 84af46b6e31d9..a14437e56ee9f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java @@ -44,6 +44,7 @@ import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.cache.query.index.IndexProcessor; import org.apache.ignite.internal.cache.transform.CacheObjectTransformerProcessor; +import org.apache.ignite.internal.classpath.ClassPathProcessor; import org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager; import org.apache.ignite.internal.managers.collision.GridCollisionManager; import org.apache.ignite.internal.managers.communication.GridIoManager; @@ -747,6 +748,11 @@ private void setField(IgniteEx kernal, String name, Object val) throws NoSuchFie return null; } + /** {@inheritDoc} */ + @Override public ClassPathProcessor classPath() { + return null; + } + /** {@inheritDoc} */ @Override public Executor getAsyncContinuationExecutor() { return null; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java index d0f54ef2136ba..4d344fc3f1216 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java @@ -76,6 +76,7 @@ import org.apache.ignite.internal.processors.platform.client.cache.ClientCacheScanQueryRequest; import org.apache.ignite.internal.processors.platform.client.cache.ClientCacheSqlFieldsQueryRequest; import org.apache.ignite.internal.processors.platform.client.cache.ClientCacheSqlQueryRequest; +import org.apache.ignite.internal.processors.platform.client.classpath.ClientFileUploadRequest; import org.apache.ignite.internal.processors.platform.client.cluster.ClientClusterChangeStateRequest; import org.apache.ignite.internal.processors.platform.client.cluster.ClientClusterGetDataCenterNodesRequest; import org.apache.ignite.internal.processors.platform.client.cluster.ClientClusterGetStateRequest; @@ -410,6 +411,9 @@ public class ClientMessageParser implements ClientListenerMessageParser { /** Get service topology. */ private static final short OP_SERVICE_GET_TOPOLOGY = 7003; + /** File upload. */ + public static final short FILE_UPLOAD = 9030; + /** Operations that are performed before a node is joined to the topology. */ /** Stop warmup. */ private static final short OP_STOP_WARMUP = 10000; @@ -735,6 +739,9 @@ public ClientListenerRequest decode(BinaryReaderEx reader) { case OP_SERVICE_GET_TOPOLOGY: return new ClientServiceTopologyRequest(reader); + case FILE_UPLOAD: + return new ClientFileUploadRequest(reader); + case OP_STOP_WARMUP: return new ClientCacheStopWarmupRequest(reader); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java new file mode 100644 index 0000000000000..2546be36b18c8 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.platform.client.classpath; + +import java.io.IOException; +import java.util.Collections; +import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.binary.BinaryRawReader; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.GridClosureCallMode; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext; +import org.apache.ignite.internal.processors.platform.client.ClientRequest; +import org.apache.ignite.internal.processors.platform.client.ClientResponse; +import org.apache.ignite.lang.IgniteCallable; +import org.apache.ignite.resources.IgniteInstanceResource; + +import static org.apache.ignite.internal.processors.task.TaskExecutionOptions.options; + +/** */ +public class ClientFileUploadRequest extends ClientRequest { + /** */ + private final FileUploadPartCallable data; + + /** + * Creates the file upload request. + * + * @param reader Reader. + */ + public ClientFileUploadRequest(BinaryRawReader reader) { + super(reader); + + data = new FileUploadPartCallable( + reader.readUuid(), + reader.readUuid(), + reader.readString(), + reader.readLong(), + reader.readInt(), + reader.readByteArray() + ); + } + + /** {@inheritDoc} */ + @Override public ClientResponse process(ClientConnectionContext ctx) { + // TODO: add backward compatibility support. + + try { + // Forward request to upload node. + if (!ctx.kernalContext().localNodeId().equals(data.uploadNodeId)) { + ClusterNode uploadNode = ctx.kernalContext().cluster().get().node(data.uploadNodeId); + + if (uploadNode == null) { + throw new IgniteException("Upload node not found [localNode=" + ctx.kernalContext().localNodeId() + + ", uploadNode=" + data.uploadNodeId + ", icp=" + data.name + ']'); + } + + ctx.kernalContext().closure().callAsync( + GridClosureCallMode.BALANCE, + data, + options(Collections.singletonList(uploadNode)).withFailoverDisabled() + ).get(); + + return new ClientResponse(requestId()); + } + + ctx.kernalContext().classPath().uploadFilePart(data.icpId, data.name, data.offset, data.bytesCnt, data.batch); + + return new ClientResponse(requestId()); + } + catch (IgniteCheckedException | IOException e) { + return new ClientResponse(requestId(), e.getMessage()); + } + } + + /** */ + private static class FileUploadPartCallable implements IgniteCallable { + /** */ + private static final long serialVersionUID = 0L; + + /** Upload node ID. */ + private final UUID uploadNodeId; + + /** ClassPath ID. */ + private final UUID icpId; + + /** File name. */ + private final String name; + + /** Offset to write data to. */ + private final long offset; + + /** Bytes count in batch to write. */ + private final int bytesCnt; + + /** Batch. */ + private final byte[] batch; + + /** */ + public FileUploadPartCallable(UUID uploadNodeId, UUID icpId, String name, long offset, int bytesCnt, byte[] batch) { + this.uploadNodeId = uploadNodeId; + this.icpId = icpId; + this.name = name; + this.offset = offset; + this.bytesCnt = bytesCnt; + this.batch = batch; + } + + /** Auto-injected grid instance. */ + @IgniteInstanceResource + private transient IgniteEx ignite; + + /** {@inheritDoc} */ + @Override public Void call() throws Exception { + UUID locNodeId = ignite.localNode().id(); + + assert uploadNodeId.equals(locNodeId) + : "Forwarded to wrong node [uploadNode=" + uploadNodeId + ", localNode=" + locNodeId + ']'; + + ignite.context().classPath().uploadFilePart(icpId, name, offset, bytesCnt, batch); + + return null; + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java index 505e615654d43..beb51c6a5d56e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java @@ -31,6 +31,8 @@ public abstract class VisorOneNodeTask extends VisorMultiNodeTask @Override protected Collection jobNodes(VisorTaskArgument arg) { Collection nodes = super.jobNodes(arg); + System.out.println("nodes = " + nodes); + assert nodes.size() == 1 : nodes; return nodes; From fae5368144c7e63c68c19f7c7f5a894f449ccc50 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Sat, 14 Mar 2026 13:20:40 +0300 Subject: [PATCH 02/54] IGNITE-28207 IgniteClassPath creation --- .idea/inspectionProfiles/Project_Default.xml | 10 +++------- .../management/classpath/ClassPathCreateCommand.java | 1 + 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 230bf03e768a9..0af10ada908d7 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -369,6 +369,7 @@ + + @@ -623,13 +625,7 @@ - - - + diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index 2d25cccc642e1..b63555d7fa464 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -97,6 +97,7 @@ private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg printer.accept("New classpath registered [uploadNode=" + uploadNode.id() + ", name=" + arg.name + ", id=" + icpID.toString() + ']'); printer.accept("Starting to upload files:"); + // TODO: add pretty print here. for (Path file : files) { printer.accept(String.valueOf(file.toAbsolutePath())); cli.uploadClasspathFile(uploadNode, icpID, file); From 78a61f50f7c71a98643ef49cf9014fea6967618a Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Sat, 14 Mar 2026 16:42:01 +0300 Subject: [PATCH 03/54] IGNITE-28207 IgniteClassPath creation --- .../apache/ignite/internal/IgniteKernal.java | 2 +- .../ClassPathDeployToAllRequest.java | 38 +++++ .../ClassPathDeployToAllResponse.java | 27 +++ .../classpath/ClassPathProcessor.java | 160 ++++++++++++++---- .../classpath/ClassPathCreateCommand.java | 2 + .../classpath/ClassPathDistributeTask.java | 62 +++++++ .../util/distributed/DistributedProcess.java | 7 +- 7 files changed, 267 insertions(+), 31 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 5c73d1de07c34..dd5176f9cb8e2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -1009,7 +1009,6 @@ public void start( startManager(new GridFailoverManager(ctx)); startManager(new GridCollisionManager(ctx)); startManager(new GridIndexingManager(ctx)); - startProcessor(new ClassPathProcessor(ctx)); // Assign discovery manager to context before other processors start so they // are able to register custom event listener. @@ -1020,6 +1019,7 @@ public void start( // Start the encryption manager after assigning the discovery manager to context, so it will be // able to register custom event listener. startManager(new GridEncryptionManager(ctx)); + startProcessor(new ClassPathProcessor(ctx)); startProcessor(new PdsConsistentIdProcessor(ctx)); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java new file mode 100644 index 0000000000000..dcf75b91eb177 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.classpath; + +import java.io.Serializable; +import java.util.UUID; +import org.apache.ignite.internal.util.distributed.DistributedProcess; + +/** + * Class path deploy to all request for {@link DistributedProcess} initiate message. + */ +public class ClassPathDeployToAllRequest implements Serializable { + /** Serial version uid. */ + private static final long serialVersionUID = 0L; + + /** Ignite class path id. */ + final UUID icpId; + + /** */ + public ClassPathDeployToAllRequest(UUID icpId) { + this.icpId = icpId; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java new file mode 100644 index 0000000000000..0bab548ff6945 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.classpath; + +import java.io.Serializable; +import org.apache.ignite.internal.util.distributed.DistributedProcess; + +/** + * Class path deploy to all response for {@link DistributedProcess} initiate message. + */ +public class ClassPathDeployToAllResponse implements Serializable { +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 4b9e24f743a81..8b515fc8a5137 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -20,17 +20,25 @@ import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.internal.util.distributed.DistributedProcess; +import org.apache.ignite.internal.util.future.GridFinishedFuture; +import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.U; +import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.classpath.IgniteClassPathState.CREATING; +import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; /** * TODO: @@ -44,37 +52,43 @@ public class ClassPathProcessor extends GridProcessorAdapter { /** Prefix for metastorage keys. */ public static final String METASTORE_PREFIX = "classpath."; + /** Distribute process that distributes new Ignite class path across all server nodes. */ + private final DistributedProcess deployToAllProc; + + /** */ + private final Map> deployToAllFuts = new ConcurrentHashMap<>(); + /** * @param ctx Kernal context. */ public ClassPathProcessor(GridKernalContext ctx) { super(ctx); + + deployToAllProc = new DistributedProcess<>( + ctx, + CLASSPATH_DEPLOY_TO_ALL, + this::startDeployToAllProcess, + this::processDeployToAllResult + ); } /** * Register new classpath in metastorage it same name not exists. * Fails if exists. * - * @param name - * @param files - * @param lengths - * @return + * @param name Class path name. + * @param files Files included. + * @param lengths Files lengths. + * @return Class path id. */ public UUID startCreation(String name, String[] files, long[] lengths) { assert files.length == lengths.length : "wrong arrays lengths"; - A.ensure(U.alphanumericUnderscore(name), "Classpath name must satisfy the following name pattern: a-zA-Z0-9_"); - String key = METASTORE_PREFIX + name; + A.ensure(U.alphanumericUnderscore(name), "Classpath name must satisfy the following name pattern: a-zA-Z0-9_"); IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths); - try { - if (!ctx.distributedMetastorage().compareAndSet(key, null, icp)) - throw new IgniteException("Classpath alreay exists: " + name); - } - catch (IgniteCheckedException e) { - throw new IgniteException(e); - } + toMetastorage(icp, null); try { NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); @@ -89,10 +103,10 @@ public UUID startCreation(String name, String[] files, long[] lengths) { } catch (Exception e) { try { - ctx.distributedMetastorage().remove(key); + ctx.distributedMetastorage().remove(metastorageKey(icp)); } catch (IgniteCheckedException ex) { - log.error("Can't remove metastorage key for IgniteClassPath: " + key, e); + log.error("Can't remove metastorage key for IgniteClassPath: " + metastorageKey(icp), e); } throw e; @@ -112,9 +126,9 @@ public void uploadFilePart( long offset, int bytesCnt, byte[] batch - ) throws IgniteCheckedException, IOException { + ) throws IOException { try { - IgniteClassPath icp = search(icpID); + IgniteClassPath icp = fromMetastorage(icpID); if (F.indexOf(icp.files(), name) == -1) throw new IllegalArgumentException("Unknown lib [icp=" + icp.name() + ", unknown_lib=" + name + ']'); @@ -145,25 +159,113 @@ public void uploadFilePart( } } + /** + * @param icpId ClassPath ID. + * @return + */ + public IgniteInternalFuture distributeToAllNodes(UUID icpId) { + GridFutureAdapter fut = new GridFutureAdapter<>(); + + synchronized (this) { + IgniteClassPath icp = fromMetastorage(icpId); + + ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId); + + if (deployToAllFuts.put(icpId, fut) != null) + return new GridFinishedFuture<>(new IllegalStateException("Distribute to all process started, already: " + icp)); + + deployToAllProc.start(icpId, req); + } + + return fut; + } + + /** + * @param req Request on snapshot creation. + * @return Future which will be completed when a snapshot has been started. + */ + private IgniteInternalFuture startDeployToAllProcess(ClassPathDeployToAllRequest req) { + IgniteClassPath icp = fromMetastorage(req.icpId); + + if (deployToAllFuts.containsKey(req.icpId)) { + log.info("Upload node skip download [icp=" + icp + ']'); + + return new GridFinishedFuture<>(new ClassPathDeployToAllResponse()); + } + + log.info("Starting download new classpath [icp=" + icp + ']'); + + return new GridFinishedFuture<>(new ClassPathDeployToAllResponse()); + } + + /** + * @param id Request id. + * @param res Results. + * @param err Errors. + */ + private void processDeployToAllResult(UUID id, Map res, Map err) { + GridFutureAdapter fut = deployToAllFuts.remove(id); + + // Only upload node manage the process. + if (fut == null) { + if (log.isDebugEnabled()) + log.debug("Unknown distribute process [id=" + id + ']'); + + return; + } + + IgniteClassPath icp = fromMetastorage(id); + + // TODO: check this exception not failed all node. + if (!fut.onDone("OK")) { + throw new IllegalStateException("Distribute process in wrong state " + + "[canceled=" + fut.isCancelled() + ", failed=" + fut.isFailed() + ", done=" + fut.isDone() + ']'); + } + + icp.state(IgniteClassPathState.READY); + + log.info("Deploy to all DONE!"); + } + /** * @param icpID ClassPath ID. * @return Class path. - * @throws IgniteCheckedException If failed. */ - private IgniteClassPath search(UUID icpID) throws IgniteCheckedException { - IgniteClassPath[] icp = new IgniteClassPath[1]; + private IgniteClassPath fromMetastorage(UUID icpID) { + try { + IgniteClassPath[] icp = new IgniteClassPath[1]; + + ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, icp0) -> { + if (icpID.equals(((IgniteClassPath)icp0).id())) + icp[0] = (IgniteClassPath)icp0; + }); - ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, icp0) -> { - if (icpID.equals(((IgniteClassPath)icp0).id())) - icp[0] = (IgniteClassPath)icp0; - }); + if (icp[0] == null) + throw new IgniteException("ClassPath not found: " + icpID); - if (icp[0] == null) - throw new IgniteException("ClassPath not found: " + icpID); + if (icp[0].state() != CREATING) + throw new IgniteException("ClassPath in wrong state [expected=" + CREATING + ", status=" + icp[0].state() + ']'); + + return icp[0]; + } + catch (IgniteCheckedException e) { + throw new IgniteException(e); + } + } - if (icp[0].state() != CREATING) - throw new IgniteException("ClassPath in wrong state [expected=" + CREATING + ", status=" + icp[0].state() + ']'); + /** */ + private void toMetastorage(IgniteClassPath icp, @Nullable IgniteClassPath prev) { + try { + if (!ctx.distributedMetastorage().compareAndSet(metastorageKey(icp), prev, icp)) + throw new IgniteException("Classpath alreay exists: " + icp.name()); + } + catch (IgniteCheckedException e) { + throw new IgniteException(e); + } + } - return icp[0]; + /** */ + private static String metastorageKey(IgniteClassPath icp) { + return METASTORE_PREFIX + icp.name(); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index b63555d7fa464..e6d6458e7af78 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -103,6 +103,8 @@ private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg cli.uploadClasspathFile(uploadNode, icpID, file); printer.accept("DONE"); } + + CommandUtils.execute(client, null, ClassPathDistributeTask.class, icpID, Collections.singletonList(uploadNode)); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java new file mode 100644 index 0000000000000..06b117e480d70 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.management.classpath; + +import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.visor.VisorJob; +import org.apache.ignite.internal.visor.VisorOneNodeTask; +import org.jetbrains.annotations.Nullable; + +/** */ +public class ClassPathDistributeTask extends VisorOneNodeTask { + /** */ + private static final long serialVersionUID = 0L; + + /** {@inheritDoc} */ + @Override protected VisorJob job(UUID arg) { + return new ClassPathDistributeJob(arg, debug); + } + + /** */ + private static class ClassPathDistributeJob extends VisorJob { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + protected ClassPathDistributeJob(@Nullable UUID arg, boolean debug) { + super(arg, debug); + } + + /** {@inheritDoc} */ + @Override protected Void run(@Nullable UUID arg) throws IgniteException { + IgniteInternalFuture fut = ignite.context().classPath().distributeToAllNodes(arg); + + try { + fut.get(); + + return null; + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java index 8b1ed6955d256..573c27889f0a3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java @@ -508,6 +508,11 @@ public enum DistributedProcessType { /** * Snapshot partitions validation. */ - CHECK_SNAPSHOT_PARTS + CHECK_SNAPSHOT_PARTS, + + /** + * Deploy new classpath to all nodes. + */ + CLASSPATH_DEPLOY_TO_ALL; } } From 9c3f016dd8b2452de08bbcf6ea158637e416f763 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 16 Mar 2026 11:19:43 +0300 Subject: [PATCH 04/54] IGNITE-28207 IgniteClassPath creation --- .../ClassPathDeployToAllRequest.java | 6 +- .../classpath/ClassPathProcessor.java | 4 +- .../classpath/DownloadClassPathTask.java | 95 +++++++++++++++++++ 3 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java index dcf75b91eb177..e3e2fa63113d9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java @@ -31,8 +31,12 @@ public class ClassPathDeployToAllRequest implements Serializable { /** Ignite class path id. */ final UUID icpId; + /** Node containing class path files received from client. */ + final UUID uploadNodeId; + /** */ - public ClassPathDeployToAllRequest(UUID icpId) { + public ClassPathDeployToAllRequest(UUID icpId, UUID uploadNodeId) { this.icpId = icpId; + this.uploadNodeId = uploadNodeId; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 8b515fc8a5137..364dbedc7258a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -169,7 +169,7 @@ public IgniteInternalFuture distributeToAllNodes(UUID icpId) { synchronized (this) { IgniteClassPath icp = fromMetastorage(icpId); - ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId); + ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId, ctx.localNodeId()); if (deployToAllFuts.put(icpId, fut) != null) return new GridFinishedFuture<>(new IllegalStateException("Distribute to all process started, already: " + icp)); @@ -195,7 +195,7 @@ private IgniteInternalFuture startDeployToAllProce log.info("Starting download new classpath [icp=" + icp + ']'); - return new GridFinishedFuture<>(new ClassPathDeployToAllResponse()); + return new DownloadClassPathTask(ctx, icp).call(); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java new file mode 100644 index 0000000000000..b8a8f19a182b1 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.classpath; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.stream.Stream; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.future.GridFutureAdapter; + +/** + * + */ +public class DownloadClassPathTask implements Callable> { + /** Kernal context. */ + private final GridKernalContext ctx; + + /** Logger. */ + private final IgniteLogger log; + + /** Ignite class path. */ + private final IgniteClassPath icp; + + /** Resulting future. */ + private final GridFutureAdapter res; + + /** + * @param ctx Kernal context. + * @param icp Ignite class path. + */ + public DownloadClassPathTask(GridKernalContext ctx, IgniteClassPath icp) { + this.ctx = ctx; + this.log = ctx.log(DownloadClassPathTask.class); + this.icp = icp; + this.res = new GridFutureAdapter<>(); + } + + /** {@inheritDoc} */ + @Override public IgniteInternalFuture call() { + // TODO: rewrite to async code (listen for each future completion. + Stream.of(icp.files()) + .map(DownloadClassPathFileTask::new) + .map(ctx.pools().getPeerClassLoadingExecutorService()::submit) + .forEach(fileFut -> { + if (res.isDone()) + fileFut.cancel(true); + + try { + fileFut.get(); + } + catch (ExecutionException | InterruptedException e) { + if (!res.isDone()) { + log.warning("Classpath download files error: " + icp, e); + + res.onDone(e); + } + } + }); + + return res; + } + + /** */ + private class DownloadClassPathFileTask implements Runnable { + /** */ + private final String name; + + /** */ + public DownloadClassPathFileTask(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public void run() { + log.info("Downloading file: " + name); + } + } +} From 6fd1dec09661fb20e7ede713d536b8362a792f66 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 29 Apr 2026 12:36:30 +0300 Subject: [PATCH 05/54] IGNITE-28207 WIP --- .../util/GridCommandHandlerClassPathTest.java | 4 + .../ClassPathDeployToAllRequest.java | 7 +- .../ClassPathDeployToAllResponse.java | 4 +- .../classpath/ClassPathProcessor.java | 107 ++------------- .../classpath/DeployToAllProcess.java | 126 ++++++++++++++++++ .../classpath/DownloadClassPathTask.java | 3 +- .../client/thin/PayloadInputChannel.java | 2 +- .../client/thin/ReliableChannelEx.java | 16 +++ .../client/thin/ReliableChannelImpl.java | 44 +++++- .../internal/client/thin/TcpClientCache.java | 15 +++ .../internal/client/thin/TcpIgniteClient.java | 9 +- .../classpath/ClassPathDistributeTask.java | 2 +- .../internal/visor/VisorOneNodeTask.java | 2 - 13 files changed, 224 insertions(+), 117 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 6b3cfad39d3ce..ad142cd002972 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -70,4 +70,8 @@ public void testCreate() throws Exception { System.out.println(outStr); } + + + // TODO check empty file creation. + // TODO add in production code checks of files integriy. Perform file integrity check on startup. } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java index e3e2fa63113d9..3d8adbf6b512b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java @@ -17,17 +17,14 @@ package org.apache.ignite.internal.classpath; -import java.io.Serializable; import java.util.UUID; import org.apache.ignite.internal.util.distributed.DistributedProcess; +import org.apache.ignite.plugin.extensions.communication.Message; /** * Class path deploy to all request for {@link DistributedProcess} initiate message. */ -public class ClassPathDeployToAllRequest implements Serializable { - /** Serial version uid. */ - private static final long serialVersionUID = 0L; - +public class ClassPathDeployToAllRequest implements Message { /** Ignite class path id. */ final UUID icpId; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java index 0bab548ff6945..b47f386800cfb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java @@ -17,11 +17,11 @@ package org.apache.ignite.internal.classpath; -import java.io.Serializable; import org.apache.ignite.internal.util.distributed.DistributedProcess; +import org.apache.ignite.plugin.extensions.communication.Message; /** * Class path deploy to all response for {@link DistributedProcess} initiate message. */ -public class ClassPathDeployToAllResponse implements Serializable { +public class ClassPathDeployToAllResponse implements Message { } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 364dbedc7258a..a04d092e03282 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -20,25 +20,18 @@ import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; -import java.util.Map; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; -import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; -import org.apache.ignite.internal.util.distributed.DistributedProcess; -import org.apache.ignite.internal.util.future.GridFinishedFuture; -import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.classpath.IgniteClassPathState.CREATING; -import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; /** * TODO: @@ -52,11 +45,8 @@ public class ClassPathProcessor extends GridProcessorAdapter { /** Prefix for metastorage keys. */ public static final String METASTORE_PREFIX = "classpath."; - /** Distribute process that distributes new Ignite class path across all server nodes. */ - private final DistributedProcess deployToAllProc; - /** */ - private final Map> deployToAllFuts = new ConcurrentHashMap<>(); + public final DeployToAllProcess deployToAllProcess; /** * @param ctx Kernal context. @@ -64,12 +54,7 @@ public class ClassPathProcessor extends GridProcessorAdapter { public ClassPathProcessor(GridKernalContext ctx) { super(ctx); - deployToAllProc = new DistributedProcess<>( - ctx, - CLASSPATH_DEPLOY_TO_ALL, - this::startDeployToAllProcess, - this::processDeployToAllResult - ); + deployToAllProcess = new DeployToAllProcess(ctx); } /** @@ -88,7 +73,7 @@ public UUID startCreation(String name, String[] files, long[] lengths) { IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths); - toMetastorage(icp, null); + casToMetastorage(icp, null); try { NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); @@ -128,7 +113,7 @@ public void uploadFilePart( byte[] batch ) throws IOException { try { - IgniteClassPath icp = fromMetastorage(icpID); + IgniteClassPath icp = fromMetastorage(icpID, ctx); if (F.indexOf(icp.files(), name) == -1) throw new IllegalArgumentException("Unknown lib [icp=" + icp.name() + ", unknown_lib=" + name + ']'); @@ -159,79 +144,22 @@ public void uploadFilePart( } } - /** - * @param icpId ClassPath ID. - * @return - */ - public IgniteInternalFuture distributeToAllNodes(UUID icpId) { - GridFutureAdapter fut = new GridFutureAdapter<>(); - - synchronized (this) { - IgniteClassPath icp = fromMetastorage(icpId); - - ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId, ctx.localNodeId()); - - if (deployToAllFuts.put(icpId, fut) != null) - return new GridFinishedFuture<>(new IllegalStateException("Distribute to all process started, already: " + icp)); - - deployToAllProc.start(icpId, req); - } - - return fut; - } - - /** - * @param req Request on snapshot creation. - * @return Future which will be completed when a snapshot has been started. - */ - private IgniteInternalFuture startDeployToAllProcess(ClassPathDeployToAllRequest req) { - IgniteClassPath icp = fromMetastorage(req.icpId); - - if (deployToAllFuts.containsKey(req.icpId)) { - log.info("Upload node skip download [icp=" + icp + ']'); - - return new GridFinishedFuture<>(new ClassPathDeployToAllResponse()); - } - - log.info("Starting download new classpath [icp=" + icp + ']'); - - return new DownloadClassPathTask(ctx, icp).call(); - } - - /** - * @param id Request id. - * @param res Results. - * @param err Errors. - */ - private void processDeployToAllResult(UUID id, Map res, Map err) { - GridFutureAdapter fut = deployToAllFuts.remove(id); - - // Only upload node manage the process. - if (fut == null) { - if (log.isDebugEnabled()) - log.debug("Unknown distribute process [id=" + id + ']'); - - return; + /** */ + private void casToMetastorage(IgniteClassPath icp, @Nullable IgniteClassPath prev) { + try { + if (!ctx.distributedMetastorage().compareAndSet(metastorageKey(icp), prev, icp)) + throw new IgniteException("Classpath alreay exists: " + icp.name()); } - - IgniteClassPath icp = fromMetastorage(id); - - // TODO: check this exception not failed all node. - if (!fut.onDone("OK")) { - throw new IllegalStateException("Distribute process in wrong state " + - "[canceled=" + fut.isCancelled() + ", failed=" + fut.isFailed() + ", done=" + fut.isDone() + ']'); + catch (IgniteCheckedException e) { + throw new IgniteException(e); } - - icp.state(IgniteClassPathState.READY); - - log.info("Deploy to all DONE!"); } /** * @param icpID ClassPath ID. * @return Class path. */ - private IgniteClassPath fromMetastorage(UUID icpID) { + static IgniteClassPath fromMetastorage(UUID icpID, GridKernalContext ctx) { try { IgniteClassPath[] icp = new IgniteClassPath[1]; @@ -253,17 +181,6 @@ private IgniteClassPath fromMetastorage(UUID icpID) { } } - /** */ - private void toMetastorage(IgniteClassPath icp, @Nullable IgniteClassPath prev) { - try { - if (!ctx.distributedMetastorage().compareAndSet(metastorageKey(icp), prev, icp)) - throw new IgniteException("Classpath alreay exists: " + icp.name()); - } - catch (IgniteCheckedException e) { - throw new IgniteException(e); - } - } - /** */ private static String metastorageKey(IgniteClassPath icp) { return METASTORE_PREFIX + icp.name(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java new file mode 100644 index 0000000000000..dbc4746eb3948 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.classpath; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.distributed.DistributedProcess; +import org.apache.ignite.internal.util.future.GridFinishedFuture; +import org.apache.ignite.internal.util.future.GridFutureAdapter; + +import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; +import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; + +public class DeployToAllProcess { + /** */ + private final IgniteLogger log; + + /** */ + private final GridKernalContext ctx; + + /** Distribute process that distributes new Ignite class path across all server nodes. */ + private final DistributedProcess deployToAllProc; + + /** */ + private final Map> deployToAllFuts = new ConcurrentHashMap<>(); + + public DeployToAllProcess(GridKernalContext ctx) { + log = ctx.log(DeployToAllProcess.class); + + this.ctx = ctx; + + deployToAllProc = new DistributedProcess<>( + ctx, + CLASSPATH_DEPLOY_TO_ALL, + this::startDeployToAllProcess, + this::processDeployToAllResult + ); + } + + /** + * @param icpId ClassPath ID. + * @return + */ + public IgniteInternalFuture start(UUID icpId) { + GridFutureAdapter fut = new GridFutureAdapter<>(); + + synchronized (this) { + IgniteClassPath icp = fromMetastorage(icpId, ctx); + + ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId, ctx.localNodeId()); + + if (deployToAllFuts.put(icpId, fut) != null) + return new GridFinishedFuture<>(new IllegalStateException("Distribute to all process started, already: " + icp)); + + deployToAllProc.start(icpId, req); + } + + return fut; + } + + /** + * @param req Request on snapshot creation. + * @return Future which will be completed when a snapshot has been started. + */ + private IgniteInternalFuture startDeployToAllProcess(ClassPathDeployToAllRequest req) { + IgniteClassPath icp = fromMetastorage(req.icpId, ctx); + + if (deployToAllFuts.containsKey(req.icpId)) { + log.info("Upload node skip download [icp=" + icp + ']'); + + return new GridFinishedFuture<>(new ClassPathDeployToAllResponse()); + } + + log.info("Starting download new classpath [icp=" + icp + ']'); + + return new DownloadClassPathTask(ctx, icp).call(); + } + + /** + * @param id Request id. + * @param res Results. + * @param err Errors. + */ + private void processDeployToAllResult(UUID id, Map res, Map err) { + GridFutureAdapter fut = deployToAllFuts.remove(id); + + // Only upload node manage the process. + if (fut == null) { + if (log.isDebugEnabled()) + log.debug("Unknown distribute process [id=" + id + ']'); + + return; + } + + IgniteClassPath icp = fromMetastorage(id, ctx); + + // TODO: check this exception not failed all node. + if (!fut.onDone("OK")) { + throw new IllegalStateException("Distribute process in wrong state " + + "[canceled=" + fut.isCancelled() + ", failed=" + fut.isFailed() + ", done=" + fut.isDone() + ']'); + } + + icp.state(IgniteClassPathState.READY); + + log.info("Deploy to all DONE!"); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java index b8a8f19a182b1..61e13ea81378c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -54,7 +54,6 @@ public DownloadClassPathTask(GridKernalContext ctx, IgniteClassPath icp) { /** {@inheritDoc} */ @Override public IgniteInternalFuture call() { - // TODO: rewrite to async code (listen for each future completion. Stream.of(icp.files()) .map(DownloadClassPathFileTask::new) .map(ctx.pools().getPeerClassLoadingExecutorService()::submit) @@ -74,6 +73,8 @@ public DownloadClassPathTask(GridKernalContext ctx, IgniteClassPath icp) { } }); + res.onDone(new ClassPathDeployToAllResponse()); + return res; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java index e8f6938890d25..38d0e5d13416d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java @@ -35,8 +35,8 @@ class PayloadInputChannel { * Constructor. */ PayloadInputChannel(ClientChannel ch, ByteBuffer payload) { - in = BinaryStreams.inputStream(payload); this.ch = ch; + in = BinaryStreams.inputStream(payload); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java index ff9270581ca64..e0a5475e2292a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java @@ -61,6 +61,22 @@ public T service( List targetNodes ) throws ClientException, ClientError; + /** + * Send request to the passed node and handle response. + * + * @throws ClientException Thrown by {@code payloadWriter} or {@code payloadReader}. + * @throws ClientAuthenticationException When user name or password is invalid. + * @throws ClientAuthorizationException When user has no permission to perform operation. + * @throws ClientProtocolError When failed to handshake with server. + * @throws ClientServerError When failed to process request on server. + */ + public T serviceForNode( + ClientOperation op, + Consumer payloadWriter, + Function payloadReader, + UUID targetNode + ) throws ClientException, ClientError; + /** * Send request and handle response asynchronously. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java index ec6e96cb0f979..f012328a66cad 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java @@ -28,7 +28,9 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.Future; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -121,6 +123,9 @@ final class ReliableChannelImpl implements ReliableChannelEx { /** Open channels counter. */ private final AtomicInteger channelsCnt = new AtomicInteger(); + /** Future for channel init task. */ + private volatile Future initAllChannelFut; + /** * Constructor. */ @@ -208,6 +213,16 @@ final class ReliableChannelImpl implements ReliableChannelEx { ); } + /** {@inheritDoc} */ + @Override public T serviceForNode( + ClientOperation op, + Consumer payloadWriter, + Function payloadReader, + UUID targetNode + ) throws ClientException, ClientError { + return null; + } + /** {@inheritDoc} */ @Override public IgniteClientFuture serviceAsync( ClientOperation op, @@ -574,8 +589,8 @@ else if (scheduledChannelsReinit.get() && !partitionAwarenessEnabled) { /** * Asynchronously try to establish a connection to all configured servers. */ - private void initAllChannelsAsync() { - ForkJoinPool.commonPool().submit( + private Future initAllChannelsAsync() { + return ForkJoinPool.commonPool().submit( () -> { List holders = channels; @@ -781,7 +796,7 @@ void channelsInit(@Nullable List failures) { } if (partitionAwarenessEnabled) - initAllChannelsAsync(); + initAllChannelFut = initAllChannelsAsync(); } /** @@ -942,7 +957,6 @@ private T applyOnNodeChannelWithFallback(UUID tryNodeId, Function(); @@ -1075,7 +1089,7 @@ private boolean applyReconnectionThrottling() { /** * Get or create channel. */ - private ClientChannel getOrCreateChannel() + public ClientChannel getOrCreateChannel() throws ClientConnectionException, ClientAuthenticationException, ClientProtocolError { return getOrCreateChannel(false); } @@ -1175,6 +1189,26 @@ void setConfiguration(ClientChannelConfiguration chCfg) { } } + /** + * @param id Node id. + * @return Client channel for node. + */ + public ClientChannel nodeClientChannel(UUID id) { + try { + initAllChannelFut.get(); + } + catch (InterruptedException | ExecutionException e) { + throw new ClientException(e); + } + + ClientChannelHolder cliCh = nodeChannels.get(id); + + if (cliCh == null) + throw new ClientConnectionException("Node can't be found [id=" + id + ']'); + + return cliCh.getOrCreateChannel(); + } + /** * Get holders reference. For test purposes. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java index 0099f096b4fbf..e8ddf484d4857 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java @@ -1816,6 +1816,21 @@ public ReliableChannelWrapper(ReliableChannelImpl delegate, String cacheName) { } } + /** {@inheritDoc} */ + @Override public T serviceForNode( + ClientOperation op, + Consumer payloadWriter, + Function payloadReader, + UUID targetNode + ) throws ClientException, ClientError { + try { + return delegate.serviceForNode(op, payloadWriter, payloadReader, targetNode); + } + catch (Exception e) { + throw convertException(e, cacheName); + } + } + /** {@inheritDoc} */ @Override public IgniteClientFuture serviceAsync( ClientOperation op, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index 21e8b45149260..078477d53bec1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -23,7 +23,6 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.EventListener; import java.util.HashSet; import java.util.List; @@ -637,7 +636,7 @@ private void retrieveBinaryConfiguration(ClientConfiguration cfg) { * @param file File to upload. */ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws IOException { - List uploadNode = Collections.singletonList(node.id()); + ClientChannel cliCh = ch.nodeClientChannel(node.id()); String name = file.getFileName().toString(); byte[] batch = new byte[(int)(U.MB)]; @@ -647,10 +646,11 @@ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws int[] bytesCnt = new int[1]; // We want to create empty file on the server side. + // So, even 0 bytes read, one request need to be sent. bytesCnt[0] = fis.read(batch); do { - ch.service( + cliCh.service( ClientOperation.FILE_UPLOAD, ch -> { try (BinaryWriterEx w = BinaryUtils.writer(marsh.context(), ch.out(), null)) { @@ -662,8 +662,7 @@ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws w.writeByteArray(batch); } }, - in -> null, - uploadNode // Request can still be sent to a random (default) node. + in -> null ); offset[0] += bytesCnt[0]; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java index 06b117e480d70..3b78d9e91a966 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java @@ -47,7 +47,7 @@ protected ClassPathDistributeJob(@Nullable UUID arg, boolean debug) { /** {@inheritDoc} */ @Override protected Void run(@Nullable UUID arg) throws IgniteException { - IgniteInternalFuture fut = ignite.context().classPath().distributeToAllNodes(arg); + IgniteInternalFuture fut = ignite.context().classPath().deployToAllProcess.start(arg); try { fut.get(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java index beb51c6a5d56e..505e615654d43 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorOneNodeTask.java @@ -31,8 +31,6 @@ public abstract class VisorOneNodeTask extends VisorMultiNodeTask @Override protected Collection jobNodes(VisorTaskArgument arg) { Collection nodes = super.jobNodes(arg); - System.out.println("nodes = " + nodes); - assert nodes.size() == 1 : nodes; return nodes; From f0b6a5724b70ee8d234736f983ae87e465559f18 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 29 Apr 2026 12:42:37 +0300 Subject: [PATCH 06/54] IGNITE-28207 WIP --- .../util/GridCommandHandlerClassPathTest.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index ad142cd002972..7735b2fd1b4a7 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -62,16 +62,17 @@ public void testCreate() throws Exception { final TestCommandHandler hnd = newCommandHandler(createTestLogger()); - assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", "mysuperapp", "--files", jars)); + try { + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", "mysuperapp", "--files", jars)); + } + finally { + String outStr = testOut.toString(); - String outStr = testOut.toString(); + stopAllGrids(); - stopAllGrids(); - - System.out.println(outStr); + System.out.println(outStr); + } } - - // TODO check empty file creation. // TODO add in production code checks of files integriy. Perform file integrity check on startup. } From 0cc48759c02cbea235e39e90cbabcd728ed983e8 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 29 Apr 2026 14:12:06 +0300 Subject: [PATCH 07/54] IGNITE-28207 WIP --- .../client/thin/ReliableChannelEx.java | 16 ---------- .../client/thin/ReliableChannelImpl.java | 30 +++---------------- .../internal/client/thin/TcpClientCache.java | 15 ---------- .../internal/client/thin/TcpIgniteClient.java | 10 +++++++ .../classpath/ClassPathCreateCommand.java | 17 ++++------- 5 files changed, 19 insertions(+), 69 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java index e0a5475e2292a..ff9270581ca64 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java @@ -61,22 +61,6 @@ public T service( List targetNodes ) throws ClientException, ClientError; - /** - * Send request to the passed node and handle response. - * - * @throws ClientException Thrown by {@code payloadWriter} or {@code payloadReader}. - * @throws ClientAuthenticationException When user name or password is invalid. - * @throws ClientAuthorizationException When user has no permission to perform operation. - * @throws ClientProtocolError When failed to handshake with server. - * @throws ClientServerError When failed to process request on server. - */ - public T serviceForNode( - ClientOperation op, - Consumer payloadWriter, - Function payloadReader, - UUID targetNode - ) throws ClientException, ClientError; - /** * Send request and handle response asynchronously. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java index f012328a66cad..454e29189317c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java @@ -28,9 +28,7 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.Future; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -123,9 +121,6 @@ final class ReliableChannelImpl implements ReliableChannelEx { /** Open channels counter. */ private final AtomicInteger channelsCnt = new AtomicInteger(); - /** Future for channel init task. */ - private volatile Future initAllChannelFut; - /** * Constructor. */ @@ -213,16 +208,6 @@ final class ReliableChannelImpl implements ReliableChannelEx { ); } - /** {@inheritDoc} */ - @Override public T serviceForNode( - ClientOperation op, - Consumer payloadWriter, - Function payloadReader, - UUID targetNode - ) throws ClientException, ClientError { - return null; - } - /** {@inheritDoc} */ @Override public IgniteClientFuture serviceAsync( ClientOperation op, @@ -589,8 +574,8 @@ else if (scheduledChannelsReinit.get() && !partitionAwarenessEnabled) { /** * Asynchronously try to establish a connection to all configured servers. */ - private Future initAllChannelsAsync() { - return ForkJoinPool.commonPool().submit( + private void initAllChannelsAsync() { + ForkJoinPool.commonPool().submit( () -> { List holders = channels; @@ -796,7 +781,7 @@ void channelsInit(@Nullable List failures) { } if (partitionAwarenessEnabled) - initAllChannelFut = initAllChannelsAsync(); + initAllChannelsAsync(); } /** @@ -1048,7 +1033,7 @@ class ClientChannelHolder { private volatile ClientChannel ch; /** ID of the last server node that {@link #ch} is or was connected to. */ - private volatile UUID serverNodeId; + volatile UUID serverNodeId; /** Address that holder is bind to (chCfg.addr) is not in use now. So close the holder. */ private volatile boolean close; @@ -1194,13 +1179,6 @@ void setConfiguration(ClientChannelConfiguration chCfg) { * @return Client channel for node. */ public ClientChannel nodeClientChannel(UUID id) { - try { - initAllChannelFut.get(); - } - catch (InterruptedException | ExecutionException e) { - throw new ClientException(e); - } - ClientChannelHolder cliCh = nodeChannels.get(id); if (cliCh == null) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java index e8ddf484d4857..0099f096b4fbf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java @@ -1816,21 +1816,6 @@ public ReliableChannelWrapper(ReliableChannelImpl delegate, String cacheName) { } } - /** {@inheritDoc} */ - @Override public T serviceForNode( - ClientOperation op, - Consumer payloadWriter, - Function payloadReader, - UUID targetNode - ) throws ClientException, ClientError { - try { - return delegate.serviceForNode(op, payloadWriter, payloadReader, targetNode); - } - catch (Exception e) { - throw convertException(e, cacheName); - } - } - /** {@inheritDoc} */ @Override public IgniteClientFuture serviceAsync( ClientOperation op, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index 078477d53bec1..47114d9d269c9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -27,11 +27,13 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.stream.Collectors; import org.apache.ignite.IgniteBinary; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; @@ -676,6 +678,14 @@ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws } } + /** @return Node IDs client connected to. */ + public List connectedToNodes() { + return ch.getChannelHolders().stream() + .map(hldr -> hldr.serverNodeId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + /** * Thin client implementation of {@link BinaryMetadataHandler}. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index e6d6458e7af78..ec9aa84044d59 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -20,13 +20,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.function.Consumer; import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteException; import org.apache.ignite.client.IgniteClient; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.client.thin.TcpIgniteClient; @@ -88,7 +86,7 @@ private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg // Server nodes require files names, only. arg.files = fileNames(files); - ClusterNode uploadNode = uploadNode(client); + ClusterNode uploadNode = uploadNode(cli); printer.accept("Upload node: " + uploadNode.id()); @@ -108,18 +106,13 @@ private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg } /** */ - private static ClusterNode uploadNode(IgniteClient client) { - Collection nodes = CommandUtils.nodes(client, null); + private static ClusterNode uploadNode(TcpIgniteClient client) { + List nodes = client.connectedToNodes(); if (F.isEmpty(nodes)) - throw new IgniteException("Cluster empty"); + throw new IllegalStateException("Not connected to node"); - Collection servers = CommandUtils.servers(nodes); - - if (F.isEmpty(servers)) - throw new IgniteException("No server nodes"); - - return F.first(servers); + return client.cluster().node(F.first(nodes)); } /** */ From 0e02270119cc5a0300c143a368db8b94371925a7 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 29 Apr 2026 16:13:45 +0300 Subject: [PATCH 08/54] IGNITE-28207 WIP --- .../org/apache/ignite/util/GridCommandHandlerClassPathTest.java | 2 ++ .../apache/ignite/internal/classpath/DeployToAllProcess.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 7735b2fd1b4a7..ea4bc7ff1c79f 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -40,6 +40,8 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT /** Tests --create command. */ @Test public void testCreate() throws Exception { + //grid(0).cluster().state(ClusterState.ACTIVE); + String jars = Files.list(Path.of(getClass().getClassLoader().getResource(".").getPath() + "../")) .map(Path::toAbsolutePath) .map(Path::toString) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index dbc4746eb3948..0519a42c7515a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -30,6 +30,7 @@ import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; +/** */ public class DeployToAllProcess { /** */ private final IgniteLogger log; @@ -43,6 +44,7 @@ public class DeployToAllProcess { /** */ private final Map> deployToAllFuts = new ConcurrentHashMap<>(); + /** */ public DeployToAllProcess(GridKernalContext ctx) { log = ctx.log(DeployToAllProcess.class); From fc810dd4df08221335e22472a6ec4b4cf2386f4f Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 20 May 2026 15:27:47 +0300 Subject: [PATCH 09/54] WIP --- .../apache/ignite/internal/CoreMessagesProvider.java | 5 +++++ .../classpath/ClassPathDeployToAllRequest.java | 7 +++++-- .../classpath/ClassPathDeployToAllResponse.java | 11 +++++++++++ .../ignite/internal/classpath/DeployToAllProcess.java | 2 +- .../internal/classpath/DownloadClassPathTask.java | 2 +- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java index 28777790e3d6f..2d599899b6f72 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java @@ -23,6 +23,8 @@ import org.apache.ignite.internal.cache.query.index.IndexQueryResultMeta; import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyDefinition; import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyTypeSettings; +import org.apache.ignite.internal.classpath.ClassPathDeployToAllRequest; +import org.apache.ignite.internal.classpath.ClassPathDeployToAllResponse; import org.apache.ignite.internal.management.cache.PartitionKey; import org.apache.ignite.internal.managers.checkpoint.GridCheckpointRequest; import org.apache.ignite.internal.managers.communication.CompressedMessage; @@ -669,6 +671,9 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchema(PartitionHashRecord.class); withNoSchema(TransactionsHashRecord.class); + withNoSchema(ClassPathDeployToAllRequest.class); + withNoSchema(ClassPathDeployToAllResponse.class); + assert msgIdx <= MAX_MESSAGE_ID; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java index 3d8adbf6b512b..c5b4c50b54b6b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.classpath; import java.util.UUID; +import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.distributed.DistributedProcess; import org.apache.ignite.plugin.extensions.communication.Message; @@ -26,10 +27,12 @@ */ public class ClassPathDeployToAllRequest implements Message { /** Ignite class path id. */ - final UUID icpId; + @Order(0) + UUID icpId; /** Node containing class path files received from client. */ - final UUID uploadNodeId; + @Order(1) + UUID uploadNodeId; /** */ public ClassPathDeployToAllRequest(UUID icpId, UUID uploadNodeId) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java index b47f386800cfb..e0eb8861fc3e0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal.classpath; +import java.util.UUID; +import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.distributed.DistributedProcess; import org.apache.ignite.plugin.extensions.communication.Message; @@ -24,4 +26,13 @@ * Class path deploy to all response for {@link DistributedProcess} initiate message. */ public class ClassPathDeployToAllResponse implements Message { + + /** Ignite class path id. */ + @Order(0) + UUID icpId; + + /** */ + public ClassPathDeployToAllResponse(UUID icpId) { + this.icpId = icpId; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index 0519a42c7515a..5e7689e9d05f0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -89,7 +89,7 @@ private IgniteInternalFuture startDeployToAllProce if (deployToAllFuts.containsKey(req.icpId)) { log.info("Upload node skip download [icp=" + icp + ']'); - return new GridFinishedFuture<>(new ClassPathDeployToAllResponse()); + return new GridFinishedFuture<>(new ClassPathDeployToAllResponse(icp.id())); } log.info("Starting download new classpath [icp=" + icp + ']'); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java index 61e13ea81378c..79dd5a17259d1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -73,7 +73,7 @@ public DownloadClassPathTask(GridKernalContext ctx, IgniteClassPath icp) { } }); - res.onDone(new ClassPathDeployToAllResponse()); + res.onDone(new ClassPathDeployToAllResponse(icp.id())); return res; } From 4eebcf3e3039f2c8d6f5daba82a016ee147c5904 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 22 May 2026 13:48:34 +0300 Subject: [PATCH 10/54] WIP --- .../ignite/internal/MessageProcessor.java | 33 +++++++++++++++++++ .../ClassPathDeployToAllRequest.java | 5 +++ .../ClassPathDeployToAllResponse.java | 5 +++ 3 files changed, 43 insertions(+) diff --git a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java index 6659d3e2195ce..83b0ef54c0797 100644 --- a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java +++ b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java @@ -33,12 +33,14 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.tools.Diagnostic; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteBiTuple; import static org.apache.ignite.internal.MessageSerializerGenerator.DLFT_ENUM_MAPPER_CLS; @@ -115,6 +117,9 @@ public class MessageProcessor extends AbstractProcessor { if (clazz.getModifiers().contains(Modifier.ABSTRACT)) continue; + if (!checkConstructors(clazz)) + continue; + List fields = orderedFields(clazz); if (fields.isEmpty() && emptyMsgs.stream().noneMatch(t -> isAssignable(t, clazz))) { @@ -146,6 +151,34 @@ public class MessageProcessor extends AbstractProcessor { return true; } + /** */ + private boolean checkConstructors(TypeElement clazz) { + boolean isMarshallableMsg = isAssignable( + clazz.asType(), + processingEnv.getElementUtils().getTypeElement("org.apache.ignite.internal.MarshallableMessage") + ); + + for (Element el : clazz.getEnclosedElements()) { + if (el.getKind() != ElementKind.CONSTRUCTOR) + continue; + + ExecutableElement c = (ExecutableElement)el; + + boolean isDfltConstructor = F.isEmpty(c.getParameters()); + + if (isDfltConstructor && !isMarshallableMsg) + return true; + } + + processingEnv.getMessager().printMessage( + Diagnostic.Kind.ERROR, + "Class must have default constructor: " + clazz.getQualifiedName(), + clazz + ); + + return false; + } + /** * Collects all fields annotated with {@link Order} from the given {@link TypeElement} and all its superclasses. *

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java index c5b4c50b54b6b..8fb365625d5e8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java @@ -34,6 +34,11 @@ public class ClassPathDeployToAllRequest implements Message { @Order(1) UUID uploadNodeId; + /** */ + public ClassPathDeployToAllRequest() { + // No-op. + } + /** */ public ClassPathDeployToAllRequest(UUID icpId, UUID uploadNodeId) { this.icpId = icpId; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java index e0eb8861fc3e0..939bee9eb8ed5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java @@ -31,6 +31,11 @@ public class ClassPathDeployToAllResponse implements Message { @Order(0) UUID icpId; + /** */ + public ClassPathDeployToAllResponse() { + // No-op. + } + /** */ public ClassPathDeployToAllResponse(UUID icpId) { this.icpId = icpId; From 448dffdd27ed6a85437f3c1183032a67c8288523 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 8 Jun 2026 16:55:25 +0300 Subject: [PATCH 11/54] IGNITE-28596 Code review fixes --- .../apache/ignite/util/GridCommandHandlerClassPathTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index ea4bc7ff1c79f..77d0bd57b15f5 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -20,9 +20,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.stream.Collectors; +import org.junit.Assume; import org.junit.Test; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; +import static org.hamcrest.Matchers.is; /** * Test for --classpath command. @@ -40,6 +42,8 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT /** Tests --create command. */ @Test public void testCreate() throws Exception { + Assume.assumeThat("Only cli mode supported", commandHandler, is(CLI_CMD_HND)); + //grid(0).cluster().state(ClusterState.ACTIVE); String jars = Files.list(Path.of(getClass().getClassLoader().getResource(".").getPath() + "../")) From 85ca0f0714bc3b7c43475c326148a32b6340e59a Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 8 Jun 2026 18:39:57 +0300 Subject: [PATCH 12/54] IGNITE-28207 Classpath creation process --- .../classpath/ClassPathProcessor.java | 34 ++--- .../classpath/DeployToAllProcess.java | 2 +- .../classpath/DownloadClassPathTask.java | 53 ++++---- .../internal/classpath/IgniteClassPath.java | 4 +- .../classpath/IgniteClassPathState.java | 2 +- .../internal/client/thin/TcpIgniteClient.java | 2 +- .../classpath/ClassPathCreateCommand.java | 6 +- .../classpath/ClientFileUploadRequest.java | 118 +++++------------- 8 files changed, 90 insertions(+), 131 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index a04d092e03282..af00a213532c0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -31,7 +31,7 @@ import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.internal.classpath.IgniteClassPathState.CREATING; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; /** * TODO: @@ -43,7 +43,7 @@ */ public class ClassPathProcessor extends GridProcessorAdapter { /** Prefix for metastorage keys. */ - public static final String METASTORE_PREFIX = "classpath."; + public static final String METASTORE_PREFIX = "icp."; /** */ public final DeployToAllProcess deployToAllProcess; @@ -69,33 +69,36 @@ public ClassPathProcessor(GridKernalContext ctx) { public UUID startCreation(String name, String[] files, long[] lengths) { assert files.length == lengths.length : "wrong arrays lengths"; + // TODO: allow dot here. A.ensure(U.alphanumericUnderscore(name), "Classpath name must satisfy the following name pattern: a-zA-Z0-9_"); - IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths); + IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths, NEW); - casToMetastorage(icp, null); + NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); - try { - NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); + File root = ft.classPath(name); - File root = ft.classPath(name); + try { + casToMetastorage(null, icp); NodeFileTree.mkdir(root, "Ignite Class Path root: " + name); - - log.info("New classpath registered [root = " + root + ", icp=" + icp + ']'); - - return icp.id(); } catch (Exception e) { try { ctx.distributedMetastorage().remove(metastorageKey(icp)); + + U.delete(root); } catch (IgniteCheckedException ex) { - log.error("Can't remove metastorage key for IgniteClassPath: " + metastorageKey(icp), e); + log.error("Cleanup after IgniteClassPath creation failed [key=" + metastorageKey(icp) + ", root=" + root + ']', e); } throw e; } + + log.info("New classpath created [root = " + root + ", icp=" + icp + ']'); + + return icp.id(); } /** @@ -145,7 +148,7 @@ public void uploadFilePart( } /** */ - private void casToMetastorage(IgniteClassPath icp, @Nullable IgniteClassPath prev) { + private void casToMetastorage(@Nullable IgniteClassPath prev, IgniteClassPath icp) { try { if (!ctx.distributedMetastorage().compareAndSet(metastorageKey(icp), prev, icp)) throw new IgniteException("Classpath alreay exists: " + icp.name()); @@ -157,6 +160,7 @@ private void casToMetastorage(IgniteClassPath icp, @Nullable IgniteClassPath pre /** * @param icpID ClassPath ID. + * @param ctx Kernal context. * @return Class path. */ static IgniteClassPath fromMetastorage(UUID icpID, GridKernalContext ctx) { @@ -171,8 +175,8 @@ static IgniteClassPath fromMetastorage(UUID icpID, GridKernalContext ctx) { if (icp[0] == null) throw new IgniteException("ClassPath not found: " + icpID); - if (icp[0].state() != CREATING) - throw new IgniteException("ClassPath in wrong state [expected=" + CREATING + ", status=" + icp[0].state() + ']'); + if (icp[0].state() != NEW) + throw new IgniteException("ClassPath in wrong state [expected=" + NEW + ", status=" + icp[0].state() + ']'); return icp[0]; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index 5e7689e9d05f0..a64ab0afe29a0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -86,7 +86,7 @@ public IgniteInternalFuture start(UUID icpId) { private IgniteInternalFuture startDeployToAllProcess(ClassPathDeployToAllRequest req) { IgniteClassPath icp = fromMetastorage(req.icpId, ctx); - if (deployToAllFuts.containsKey(req.icpId)) { + if (req.uploadNodeId.equals(ctx.localNodeId())) { log.info("Upload node skip download [icp=" + icp + ']'); return new GridFinishedFuture<>(new ClassPathDeployToAllResponse(icp.id())); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java index 79dd5a17259d1..b56a0768c3ba1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.classpath; import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; @@ -38,6 +38,8 @@ public class DownloadClassPathTask implements Callable res; @@ -50,30 +52,20 @@ public DownloadClassPathTask(GridKernalContext ctx, IgniteClassPath icp) { this.log = ctx.log(DownloadClassPathTask.class); this.icp = icp; this.res = new GridFutureAdapter<>(); + this.cntr = new AtomicInteger(icp.files().length); } /** {@inheritDoc} */ @Override public IgniteInternalFuture call() { - Stream.of(icp.files()) - .map(DownloadClassPathFileTask::new) - .map(ctx.pools().getPeerClassLoadingExecutorService()::submit) - .forEach(fileFut -> { - if (res.isDone()) - fileFut.cancel(true); - - try { - fileFut.get(); - } - catch (ExecutionException | InterruptedException e) { - if (!res.isDone()) { - log.warning("Classpath download files error: " + icp, e); - - res.onDone(e); - } - } - }); - - res.onDone(new ClassPathDeployToAllResponse(icp.id())); + try { + // TODO: check correct executor used. + Stream.of(icp.files()) + .map(DownloadClassPathFileTask::new) + .map(ctx.pools().getPeerClassLoadingExecutorService()::submit); + } + catch (Throwable e) { + res.onDone(e); + } return res; } @@ -90,7 +82,26 @@ public DownloadClassPathFileTask(String name) { /** {@inheritDoc} */ @Override public void run() { + try { + run0(); + } + catch (Throwable e) { + res.onDone(e); + } + } + + /** */ + private void run0() { log.info("Downloading file: " + name); + + if (!res.isDone()) { + int filesToDownload = cntr.addAndGet(-1); + + log.info("File downloaded [name=" + name + ", filesToDownload=" + filesToDownload + ']'); + + if (filesToDownload == 0) + res.onDone(new ClassPathDeployToAllResponse(icp.id())); + } } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index 78c2127723976..570ba8c581b37 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -48,12 +48,12 @@ public class IgniteClassPath implements Serializable { * @param name User provided name. * @param files Files to include to classpath. */ - public IgniteClassPath(UUID id, String name, String[] files, long[] lengths) { + public IgniteClassPath(UUID id, String name, String[] files, long[] lengths, IgniteClassPathState state) { this.id = id; this.name = name; this.files = files; this.lengths = lengths; - this.state = IgniteClassPathState.CREATING; + this.state = state; } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java index 595bec09fc129..1d58b43dbaac3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java @@ -20,7 +20,7 @@ /** */ public enum IgniteClassPathState { /** Creationg process in progress. */ - CREATING, + NEW, /** Ready for usage. */ READY, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index 47114d9d269c9..b96a82954cb2f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -644,7 +644,7 @@ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws byte[] batch = new byte[(int)(U.MB)]; try (InputStream fis = Files.newInputStream(file)) { - long[] offset = new long[] {0}; + long[] offset = new long[]{0}; int[] bytesCnt = new int[1]; // We want to create empty file on the server side. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index ec9aa84044d59..587d5b36c818a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -27,6 +27,7 @@ import org.apache.ignite.Ignite; import org.apache.ignite.client.IgniteClient; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.classpath.IgniteClassPath; import org.apache.ignite.internal.client.thin.TcpIgniteClient; import org.apache.ignite.internal.management.api.CommandUtils; import org.apache.ignite.internal.management.api.NativeCommand; @@ -34,7 +35,9 @@ import org.jetbrains.annotations.Nullable; /** + * Ignite classpath creation command. * + * @see IgniteClassPath */ public class ClassPathCreateCommand implements NativeCommand { /** {@inheritDoc} */ @@ -85,6 +88,7 @@ private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg // We don't want to send full path to server nodes. // Server nodes require files names, only. arg.files = fileNames(files); + // TODO: add CRC or other check of file integrity. ClusterNode uploadNode = uploadNode(cli); @@ -92,7 +96,7 @@ private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg UUID icpID = CommandUtils.execute(client, null, ClassPathStartCreationTask.class, arg, Collections.singletonList(uploadNode)); - printer.accept("New classpath registered [uploadNode=" + uploadNode.id() + ", name=" + arg.name + ", id=" + icpID.toString() + ']'); + printer.accept("New classpath created [uploadNode=" + uploadNode.id() + ", name=" + arg.name + ", id=" + icpID.toString() + ']'); printer.accept("Starting to upload files:"); // TODO: add pretty print here. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java index 2546be36b18c8..f1359abe27b6f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java @@ -18,26 +18,31 @@ package org.apache.ignite.internal.processors.platform.client.classpath; import java.io.IOException; -import java.util.Collections; import java.util.UUID; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.IgniteException; import org.apache.ignite.binary.BinaryRawReader; -import org.apache.ignite.cluster.ClusterNode; -import org.apache.ignite.internal.GridClosureCallMode; -import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext; import org.apache.ignite.internal.processors.platform.client.ClientRequest; import org.apache.ignite.internal.processors.platform.client.ClientResponse; -import org.apache.ignite.lang.IgniteCallable; -import org.apache.ignite.resources.IgniteInstanceResource; - -import static org.apache.ignite.internal.processors.task.TaskExecutionOptions.options; /** */ public class ClientFileUploadRequest extends ClientRequest { - /** */ - private final FileUploadPartCallable data; + /** Upload node ID. */ + private final UUID uploadNodeId; + + /** ClassPath ID. */ + private final UUID icpId; + + /** File name. */ + private final String name; + + /** Offset to write data to. */ + private final long offset; + + /** Bytes count in batch to write. */ + private final int bytesCnt; + + /** Batch. */ + private final byte[] batch; /** * Creates the file upload request. @@ -47,95 +52,30 @@ public class ClientFileUploadRequest extends ClientRequest { public ClientFileUploadRequest(BinaryRawReader reader) { super(reader); - data = new FileUploadPartCallable( - reader.readUuid(), - reader.readUuid(), - reader.readString(), - reader.readLong(), - reader.readInt(), - reader.readByteArray() - ); + uploadNodeId = reader.readUuid(); + icpId = reader.readUuid(); + name = reader.readString(); + offset = reader.readLong(); + bytesCnt = reader.readInt(); + batch = reader.readByteArray(); } /** {@inheritDoc} */ @Override public ClientResponse process(ClientConnectionContext ctx) { // TODO: add backward compatibility support. - try { - // Forward request to upload node. - if (!ctx.kernalContext().localNodeId().equals(data.uploadNodeId)) { - ClusterNode uploadNode = ctx.kernalContext().cluster().get().node(data.uploadNodeId); + UUID locNodeId = ctx.kernalContext().localNodeId(); - if (uploadNode == null) { - throw new IgniteException("Upload node not found [localNode=" + ctx.kernalContext().localNodeId() + - ", uploadNode=" + data.uploadNodeId + ", icp=" + data.name + ']'); - } + if (!uploadNodeId.equals(locNodeId)) + throw new IllegalStateException("Wrong node [uploadNode=" + uploadNodeId + ", localNode=" + locNodeId + ']'); - ctx.kernalContext().closure().callAsync( - GridClosureCallMode.BALANCE, - data, - options(Collections.singletonList(uploadNode)).withFailoverDisabled() - ).get(); - - return new ClientResponse(requestId()); - } - - ctx.kernalContext().classPath().uploadFilePart(data.icpId, data.name, data.offset, data.bytesCnt, data.batch); + try { + ctx.kernalContext().classPath().uploadFilePart(icpId, name, offset, bytesCnt, batch); return new ClientResponse(requestId()); } - catch (IgniteCheckedException | IOException e) { + catch (IOException e) { return new ClientResponse(requestId(), e.getMessage()); } } - - /** */ - private static class FileUploadPartCallable implements IgniteCallable { - /** */ - private static final long serialVersionUID = 0L; - - /** Upload node ID. */ - private final UUID uploadNodeId; - - /** ClassPath ID. */ - private final UUID icpId; - - /** File name. */ - private final String name; - - /** Offset to write data to. */ - private final long offset; - - /** Bytes count in batch to write. */ - private final int bytesCnt; - - /** Batch. */ - private final byte[] batch; - - /** */ - public FileUploadPartCallable(UUID uploadNodeId, UUID icpId, String name, long offset, int bytesCnt, byte[] batch) { - this.uploadNodeId = uploadNodeId; - this.icpId = icpId; - this.name = name; - this.offset = offset; - this.bytesCnt = bytesCnt; - this.batch = batch; - } - - /** Auto-injected grid instance. */ - @IgniteInstanceResource - private transient IgniteEx ignite; - - /** {@inheritDoc} */ - @Override public Void call() throws Exception { - UUID locNodeId = ignite.localNode().id(); - - assert uploadNodeId.equals(locNodeId) - : "Forwarded to wrong node [uploadNode=" + uploadNodeId + ", localNode=" + locNodeId + ']'; - - ignite.context().classPath().uploadFilePart(icpId, name, offset, bytesCnt, batch); - - return null; - } - } } From bcfe771831511256ea43c4ea352ca49532a4d3d9 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 11 Jun 2026 16:22:55 +0300 Subject: [PATCH 13/54] IGNITE-28207 Classpath creation process --- .../apache/ignite/binary/BinaryRawWriter.java | 8 + .../internal/binary/BinaryWriterExImpl.java | 15 + .../util/GridCommandHandlerClassPathTest.java | 18 + .../ignite/internal/CoreMessagesProvider.java | 4 + .../ClassPathDeployToAllRequest.java | 8 +- .../ClassPathDeployToAllResponse.java | 7 +- .../ClassPathFilesTransmissionHandler.java | 373 ++++++++++++++++++ .../classpath/ClassPathProcessor.java | 81 +++- .../classpath/DeployToAllProcess.java | 47 +-- .../DownloadClassPathFailureMessage.java | 55 +++ .../classpath/DownloadClassPathMessage.java | 50 +++ .../classpath/DownloadClassPathTask.java | 107 ----- .../classpath/IgniteClassPathState.java | 2 +- .../internal/client/thin/TcpIgniteClient.java | 3 +- .../classpath/ClassPathDistributeTask.java | 5 +- .../persistence/filename/NodeFileTree.java | 2 +- .../odbc/ClientListenerInternalRequest.java | 31 ++ .../odbc/ClientListenerRequest.java | 5 + .../platform/client/ClientMessageParser.java | 28 +- ... => ClientClassPathFileUploadRequest.java} | 17 +- 20 files changed, 693 insertions(+), 173 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathFailureMessage.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerInternalRequest.java rename modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/{ClientFileUploadRequest.java => ClientClassPathFileUploadRequest.java} (85%) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/binary/BinaryRawWriter.java b/modules/binary/api/src/main/java/org/apache/ignite/binary/BinaryRawWriter.java index ffa89ce274ceb..a2c408af6c919 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/binary/BinaryRawWriter.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/binary/BinaryRawWriter.java @@ -128,6 +128,14 @@ public interface BinaryRawWriter { */ public void writeByteArray(@Nullable byte[] val) throws BinaryObjectException; + /** + * @param val Value to write. + * @param off Offset to start write from. + * @param len Count of bytes to write. + * @throws BinaryObjectException In case of error. + */ + public void writeByteArray(@Nullable byte[] val, int off, int len) throws BinaryObjectException; + /** * @param val Value to write. * @throws BinaryObjectException In case of error. diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 033be969abcf7..b3e1042f6d380 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -904,6 +904,21 @@ void writeBooleanField(@Nullable Boolean val) { } } + /** {@inheritDoc} */ + @Override public void writeByteArray(@Nullable byte[] val, int pos, int len) throws BinaryObjectException { + if (val == null) + out.writeByte(GridBinaryMarshaller.NULL); + else { + if (len > val.length) + throw new IllegalArgumentException("len must be less then val.length"); + + out.unsafeEnsure(1 + 4); + out.unsafeWriteByte(GridBinaryMarshaller.BYTE_ARR); + out.unsafeWriteInt(len); + out.writeByteArray(val, pos, len); + } + } + /** {@inheritDoc} */ @Override public void writeShortArray(String fieldName, @Nullable short[] val) throws BinaryObjectException { writeFieldId(fieldName); diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 77d0bd57b15f5..600d1bd5af170 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -81,4 +81,22 @@ public void testCreate() throws Exception { } // TODO check empty file creation. // TODO add in production code checks of files integriy. Perform file integrity check on startup. + + /** Tests --create command. */ + @Test + public void testEmptyFilesArgument() { + final TestCommandHandler hnd = newCommandHandler(createTestLogger()); + + try { + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", "mysuperapp", "--files")); + } + finally { + String outStr = testOut.toString(); + + stopAllGrids(); + + System.out.println(outStr); + } + + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java index 87bd9884c0b60..8eabba605795d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java @@ -25,6 +25,8 @@ import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyTypeSettings; import org.apache.ignite.internal.classpath.ClassPathDeployToAllRequest; import org.apache.ignite.internal.classpath.ClassPathDeployToAllResponse; +import org.apache.ignite.internal.classpath.DownloadClassPathFailureMessage; +import org.apache.ignite.internal.classpath.DownloadClassPathMessage; import org.apache.ignite.internal.management.cache.PartitionKey; import org.apache.ignite.internal.managers.checkpoint.GridCheckpointRequest; import org.apache.ignite.internal.managers.communication.CompressedMessage; @@ -670,6 +672,8 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchema(ClassPathDeployToAllRequest.class); withNoSchema(ClassPathDeployToAllResponse.class); + withNoSchema(DownloadClassPathMessage.class); + withNoSchema(DownloadClassPathFailureMessage.class); assert msgIdx <= MAX_MESSAGE_ID; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java index 8fb365625d5e8..ea4199b86c031 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java @@ -26,11 +26,15 @@ * Class path deploy to all request for {@link DistributedProcess} initiate message. */ public class ClassPathDeployToAllRequest implements Message { - /** Ignite class path id. */ + /** + * Classpath ID. + * + * @see IgniteClassPath#id() + */ @Order(0) UUID icpId; - /** Node containing class path files received from client. */ + /** Node containing class path files. */ @Order(1) UUID uploadNodeId; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java index 939bee9eb8ed5..c05efc2014f10 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java @@ -26,8 +26,11 @@ * Class path deploy to all response for {@link DistributedProcess} initiate message. */ public class ClassPathDeployToAllResponse implements Message { - - /** Ignite class path id. */ + /** + * Classpath ID. + * + * @see IgniteClassPath#id() + */ @Order(0) UUID icpId; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java new file mode 100644 index 0000000000000..c771ec95e9eac --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -0,0 +1,373 @@ +package org.apache.ignite.internal.classpath; + +import java.io.File; +import java.nio.ByteBuffer; +import java.util.Map; +import java.util.Queue; +import java.util.UUID; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.function.Predicate; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.failure.FailureContext; +import org.apache.ignite.failure.FailureType; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.GridTopic; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; +import org.apache.ignite.internal.managers.communication.GridIoManager.TransmissionSender; +import org.apache.ignite.internal.managers.communication.GridMessageListener; +import org.apache.ignite.internal.managers.communication.TransmissionCancelledException; +import org.apache.ignite.internal.managers.communication.TransmissionHandler; +import org.apache.ignite.internal.managers.communication.TransmissionMeta; +import org.apache.ignite.internal.managers.communication.TransmissionPolicy; +import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.internal.util.future.GridFinishedFuture; +import org.apache.ignite.internal.util.future.GridFutureAdapter; +import org.apache.ignite.internal.util.typedef.internal.U; + +import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; +import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; +import static org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotManager.SNP_NODE_STOPPING_ERR_MSG; + +/** + * This manager is responsible for requesting and handling files from a remote node. + */ +class ClassPathFilesTransmissionHandler implements TransmissionHandler, GridMessageListener { + /** ClassPath topic to receive files from remote node. */ + static final Object FILES_TOPIC = GridTopic.TOPIC_CLASSLOAD.topic("rmt_files"); + + /** Transmission parameter for {@link IgniteClassPath#id()}. */ + private static final String ICP_ID_PARAM = "icpId"; + + /** Transmission parameter for {@link IgniteClassPath} file name. */ + private static final String NAME_PARAM = "name"; + + /** */ + private volatile DownloadClassPathTask active; + + /** + * Queue of asynchronous tasks to execute. + * Head of queue is taks that currently executing. + */ + private final Queue queue = new ConcurrentLinkedDeque<>(); + + /** Kernal context. */ + private final GridKernalContext ctx; + + /** Logger. */ + private final IgniteLogger log; + + /** {@code true} if the node is stopping. */ + private volatile boolean stopping; + + /** */ + public ClassPathFilesTransmissionHandler(GridKernalContext ctx) { + this.ctx = ctx; + this.log = ctx.log(ClassPathFilesTransmissionHandler.class); + } + + /** + * Downloads {@link IgniteClassPath} files locally from the remote node specified by {@code rmtNodeId}. + * @param icpId ClassPath id. + * @param rmtNodeId Remote node id. + * @return Future for download operation. + */ + IgniteInternalFuture downloadLocally(UUID icpId, UUID rmtNodeId) { + if (rmtNodeId.equals(ctx.localNodeId())) { + log.info("Upload node skip download [icpId=" + icpId + ']'); + + return new GridFinishedFuture<>(); + } + + try { + IgniteClassPath icp = fromMetastorage(icpId, ctx); + + log.info("Start download ClassPath files [icp=" + icp.name() + ']'); + + DownloadClassPathTask task = new DownloadClassPathTask(rmtNodeId, icp); + + try { + start(task); + } + catch (Throwable t) { + task.res.onDone(t); + } + + return task.res; + } + catch (Throwable e) { + return new GridFinishedFuture<>(e); + } + } + + /** Stopping handler. */ + void stop() { + synchronized (this) { + stopping = true; + } + + cancelAll(new IgniteException(SNP_NODE_STOPPING_ERR_MSG), r -> true); + } + + /** + * @param nodeId A node left the cluster. + */ + void onNodeLeft(UUID nodeId) { + cancelAll( + new ClusterTopologyCheckedException("The node from which a snapshot has been requested left the grid"), + r -> r.rmtNodeId.equals(nodeId) + ); + } + + /** + * @param err Task result. + * @param filter Filter to select tasks for cancel. + */ + private synchronized void cancelAll(Throwable err, Predicate filter) { + queue.forEach(r -> { + if (filter.test(r)) { + r.res.onDone(err); + } + }); + + if (active != null && filter.test(active)) + active.res.onDone(err); + } + + /** {@inheritDoc} */ + @Override public Consumer chunkHandler(UUID nodeId, TransmissionMeta initMeta) { + throw new UnsupportedOperationException("Loading file by chunks is not supported: " + nodeId); + } + + /** {@inheritDoc} */ + @Override public void onMessage(UUID nodeId, Object msg0, byte plc) { + try { + if (msg0 instanceof DownloadClassPathMessage) { + DownloadClassPathMessage msg = (DownloadClassPathMessage)msg0; + + IgniteClassPath icp = null; + + try { + icp = fromMetastorage(msg.icpId, ctx); + + NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); + + File root = ft.classPathRoot(icp.name()); + + if (!root.exists()) + throw new IgniteException("Classpath root not exists: " + root); + + // TODO: make async execution. + try (TransmissionSender sndr = ctx.io().openTransmissionSender(nodeId, FILES_TOPIC)) { + for (String name : icp.files()) { + File f = new File(root, name); + + if (!f.exists()) + throw new IgniteException("Classpath file not exists: " + f); + + sndr.send(f, Map.of(ICP_ID_PARAM, icp.id(), NAME_PARAM, name), TransmissionPolicy.FILE); + } + } + } + catch (Throwable t) { + U.error(log, "Error processing classpath file request [request=" + msg + ", nodeId=" + nodeId + ']', t); + + if (icp != null) { + ctx.io().sendToCustomTopic(nodeId, + FILES_TOPIC, + new DownloadClassPathFailureMessage(icp, t.getMessage()), + SYSTEM_POOL + ); + } + } + } + } + catch (Throwable e) { + U.error(log, "Processing snapshot request from remote node fails with an error", e); + + ctx.failure().process(new FailureContext(FailureType.CRITICAL_ERROR, e)); + } + } + + /** {@inheritDoc} */ + @Override public void onEnd(UUID nodeId) { + DownloadClassPathTask task = active; + + if (!ensureTask(nodeId, task)) + return; + + assert task.filesLeft.get() == 0 : task; + + if (log.isInfoEnabled()) + log.info("Classpath files from remote node has been fully received [icp=" + task.icp.name() + ']'); + + task.res.onDone((Void)null); + } + + /** {@inheritDoc} */ + @Override public void onException(UUID nodeId, Throwable ex) { + DownloadClassPathTask task = active; + + if (!ensureTask(nodeId, task)) + return; + + task.res.onDone(ex); + } + + /** {@inheritDoc} */ + @Override public String filePath(UUID nodeId, TransmissionMeta fileMeta) { + UUID icpId = (UUID)fileMeta.params().get(ICP_ID_PARAM); + String name = (String)fileMeta.params().get(NAME_PARAM); + + IgniteClassPath icp = fromMetastorage(icpId, ctx); + + DownloadClassPathTask task = active; + + if (!ensureTask(nodeId, task)) { + throw new TransmissionCancelledException("Stale snapshot transmission will be ignored " + + "[icpId=" + icp.id() + ", file=" + name + ']'); + } + + NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); + + File root = ft.classPathRoot(icp.name()); + + NodeFileTree.mkdir(root, "classpath root"); + + return new File(root, name).getAbsolutePath(); + } + + /** {@inheritDoc} */ + @Override public Consumer fileHandler(UUID nodeId, TransmissionMeta initMeta) { + UUID icpId = (UUID)initMeta.params().get(ICP_ID_PARAM); + String name = (String)initMeta.params().get(NAME_PARAM); + + IgniteClassPath icp = fromMetastorage(icpId, ctx); + + return file -> { + DownloadClassPathTask task = active; + + if (!ensureTask(nodeId, task)) { + throw new TransmissionCancelledException("Stale snapshot transmission will be ignored " + + "[icpId=" + icp.id() + ", file=" + name + ']'); + } + + int filesLeft = task.filesLeft.decrementAndGet(); + + if (log.isInfoEnabled()) { + log.info("Classpath file from remote node has been received " + + "[icp=" + task.icp.name() + ", file=" + name + ", filesLeft=" + filesLeft + ']'); + } + }; + } + + /** + * Starts {@code task} or adds it to queue. + * + * @param next Task to execute. + */ + private void start(DownloadClassPathTask next) { + ClusterNode rmtNode; + + synchronized (this) { + if (stopping) { + next.res.onDone(new IgniteException(SNP_NODE_STOPPING_ERR_MSG)); + + return; + } + + if (active != null && !active.res.isDone()) { + if (!queue.offer(next)) + next.res.onDone(new IgniteException("Can't put task in queue: " + next.icp)); + + return; + } + + rmtNode = ctx.discovery().node(next.rmtNodeId); + + if (rmtNode == null) { + next.res.onDone(new IgniteException("Can't download classpath files. " + + "Remote node left the grid [rmtNodeId=" + rmtNode + ']')); + + return; + } + + active = next; + + next.res.listen(this::onActiveDone); + } + + try { + ctx.cache().context().gridIO().sendOrderedMessage( + rmtNode, + FILES_TOPIC, + new DownloadClassPathMessage(next.icp), + SYSTEM_POOL, + Long.MAX_VALUE, + true + ); + } + catch (IgniteCheckedException e) { + next.res.onDone(new IgniteException("Can't download classpath files. " + + "Remote node left the grid [rmtNodeId=" + next.rmtNodeId + ']')); + + } + } + + /** Starts next task if exists. */ + private void onActiveDone(IgniteInternalFuture doneFut) { + DownloadClassPathTask next; + + synchronized (this) { + if (active == null || doneFut != active.res) + return; + + active = null; + + next = queue.poll(); + + while (next != null && next.res.isDone()) + next = queue.poll(); + } + + if (next != null) + start(next); + } + + /** */ + private static boolean ensureTask(UUID nodeId, DownloadClassPathTask task) { + return task != null + && !task.res.isDone() + && task.rmtNodeId.equals(nodeId); + } + + /** + * Task responsible for downloading {@link IgniteClassPath} files from remote node. + */ + private static class DownloadClassPathTask { + /** Node to download files from. */ + final UUID rmtNodeId; + + /** ClassPath to download files for. */ + final IgniteClassPath icp; + + /** Result of download. */ + final GridFutureAdapter res; + + /** Files counter. */ + final AtomicInteger filesLeft; + + /** */ + public DownloadClassPathTask(UUID rmtNodeId, IgniteClassPath icp) { + this.rmtNodeId = rmtNodeId; + this.icp = icp; + this.res = new GridFutureAdapter<>(); + this.filesLeft = new AtomicInteger(icp.files().length); + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index af00a213532c0..6d1ec186606bd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -24,6 +24,8 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.managers.eventstorage.DiscoveryEventListener; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.util.typedef.F; @@ -31,6 +33,8 @@ import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; +import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; /** @@ -45,8 +49,14 @@ public class ClassPathProcessor extends GridProcessorAdapter { /** Prefix for metastorage keys. */ public static final String METASTORE_PREFIX = "icp."; - /** */ - public final DeployToAllProcess deployToAllProcess; + /** Handles download requests for {@link IgniteClassPath} files. */ + private final ClassPathFilesTransmissionHandler icpFilesHnd; + + /** Distributed process that deploys classpath files to all nodes. */ + private final DeployToAllProcess deployToAllProc; + + /** System discovery message listener. */ + private DiscoveryEventListener discoLsnr; /** * @param ctx Kernal context. @@ -54,7 +64,27 @@ public class ClassPathProcessor extends GridProcessorAdapter { public ClassPathProcessor(GridKernalContext ctx) { super(ctx); - deployToAllProcess = new DeployToAllProcess(ctx); + icpFilesHnd = new ClassPathFilesTransmissionHandler(ctx); + deployToAllProc = new DeployToAllProcess(ctx, icpFilesHnd); + } + + /** {@inheritDoc} */ + @Override public void start() throws IgniteCheckedException { + ctx.event().addDiscoveryEventListener(discoLsnr = (evt, discoCache) -> { + // TODO: check busyLock required. See IgniteSnapshotManager. + UUID leftNodeId = evt.eventNode().id(); + + if (evt.type() == EVT_NODE_LEFT || evt.type() == EVT_NODE_FAILED) + icpFilesHnd.onNodeLeft(leftNodeId); + }, EVT_NODE_LEFT, EVT_NODE_FAILED); + } + + /** {@inheritDoc} */ + @Override public void onKernalStop(boolean cancel) { + icpFilesHnd.stop(); + + if (discoLsnr != null) + ctx.event().removeDiscoveryEventListener(discoLsnr); } /** @@ -76,7 +106,7 @@ public UUID startCreation(String name, String[] files, long[] lengths) { NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); - File root = ft.classPath(name); + File root = ft.classPathRoot(name); try { casToMetastorage(null, icp); @@ -102,51 +132,60 @@ public UUID startCreation(String name, String[] files, long[] lengths) { } /** - * @param icpID ClassPath ID. + * Writes {@code batch} to the Ignite Class Path file. + * + * @param icpId ClassPath id. * @param name File name. * @param offset Offset to write data to. - * @param bytesCnt Bytes count in batch to write. * @param batch Batch. */ - public void uploadFilePart( - UUID icpID, + public void writeFilePartFromClient( + UUID icpId, String name, long offset, - int bytesCnt, byte[] batch ) throws IOException { try { - IgniteClassPath icp = fromMetastorage(icpID, ctx); + IgniteClassPath icp = fromMetastorage(icpId, ctx); if (F.indexOf(icp.files(), name) == -1) throw new IllegalArgumentException("Unknown lib [icp=" + icp.name() + ", unknown_lib=" + name + ']'); - File lib = new File(ctx.pdsFolderResolver().fileTree().classPath(icp.name()), name); + File f = new File(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()), name); if (offset == 0) { - log.info("Creating new classpath file: " + lib); + log.info("Creating new classpath file: " + f); - if (!lib.createNewFile()) - throw new IgniteException("File exists: " + lib); + if (!f.createNewFile()) + throw new IgniteException("File exists: " + f); } - try (RandomAccessFile raf = new RandomAccessFile(lib, "rw")) { + try (RandomAccessFile raf = new RandomAccessFile(f, "rw")) { if (raf.length() < offset) { throw new IgniteException("Wrong offset [icp=" + icp.name() + ", lib=" + name + ", " + "fileLength=" + raf.length() + ", offset=" + offset + ']'); } raf.seek(offset); - raf.write(batch, 0, bytesCnt); + raf.write(batch); } } catch (Exception e) { - log.error("UploadFilePart:", e); + log.error("Upload file part error :", e); throw e; } } + /** + * Deploy {@link IgniteClassPath} to all nodes. + * @param icpId ClassPath id. + * @return Future for process result. + */ + public IgniteInternalFuture deployToAll(@Nullable UUID icpId) { + return deployToAllProc.start(icpId); + } + /** */ private void casToMetastorage(@Nullable IgniteClassPath prev, IgniteClassPath icp) { try { @@ -159,21 +198,21 @@ private void casToMetastorage(@Nullable IgniteClassPath prev, IgniteClassPath ic } /** - * @param icpID ClassPath ID. + * @param icpId ClassPath id. * @param ctx Kernal context. * @return Class path. */ - static IgniteClassPath fromMetastorage(UUID icpID, GridKernalContext ctx) { + static IgniteClassPath fromMetastorage(UUID icpId, GridKernalContext ctx) { try { IgniteClassPath[] icp = new IgniteClassPath[1]; ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, icp0) -> { - if (icpID.equals(((IgniteClassPath)icp0).id())) + if (icpId.equals(((IgniteClassPath)icp0).id())) icp[0] = (IgniteClassPath)icp0; }); if (icp[0] == null) - throw new IgniteException("ClassPath not found: " + icpID); + throw new IgniteException("ClassPath not found: " + icpId); if (icp[0].state() != NEW) throw new IgniteException("ClassPath in wrong state [expected=" + NEW + ", status=" + icp[0].state() + ']'); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index a64ab0afe29a0..532cf05e82650 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -26,29 +26,34 @@ import org.apache.ignite.internal.util.distributed.DistributedProcess; import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; +import org.apache.ignite.internal.util.lang.GridClosureException; import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; -/** */ -public class DeployToAllProcess { - /** */ +/** Distributed process to spread {@link IgniteClassPath} files across cluster. */ +class DeployToAllProcess { + /** Logger. */ private final IgniteLogger log; /** */ private final GridKernalContext ctx; + /** */ + private final ClassPathFilesTransmissionHandler icpFilesHnd; + /** Distribute process that distributes new Ignite class path across all server nodes. */ private final DistributedProcess deployToAllProc; /** */ - private final Map> deployToAllFuts = new ConcurrentHashMap<>(); + private final Map> futs = new ConcurrentHashMap<>(); /** */ - public DeployToAllProcess(GridKernalContext ctx) { + public DeployToAllProcess(GridKernalContext ctx, ClassPathFilesTransmissionHandler icpFilesHnd) { log = ctx.log(DeployToAllProcess.class); this.ctx = ctx; + this.icpFilesHnd = icpFilesHnd; deployToAllProc = new DistributedProcess<>( ctx, @@ -60,23 +65,23 @@ public DeployToAllProcess(GridKernalContext ctx) { /** * @param icpId ClassPath ID. - * @return + * @return Future for deploy process result. */ public IgniteInternalFuture start(UUID icpId) { - GridFutureAdapter fut = new GridFutureAdapter<>(); + GridFutureAdapter deployRes = new GridFutureAdapter<>(); synchronized (this) { IgniteClassPath icp = fromMetastorage(icpId, ctx); ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId, ctx.localNodeId()); - if (deployToAllFuts.put(icpId, fut) != null) - return new GridFinishedFuture<>(new IllegalStateException("Distribute to all process started, already: " + icp)); + if (futs.put(icpId, deployRes) != null) + return new GridFinishedFuture<>(new IllegalStateException("Deploy to all process started, already: " + icp.name())); deployToAllProc.start(icpId, req); } - return fut; + return deployRes; } /** @@ -84,17 +89,12 @@ public IgniteInternalFuture start(UUID icpId) { * @return Future which will be completed when a snapshot has been started. */ private IgniteInternalFuture startDeployToAllProcess(ClassPathDeployToAllRequest req) { - IgniteClassPath icp = fromMetastorage(req.icpId, ctx); + return icpFilesHnd.downloadLocally(req.icpId, req.uploadNodeId).chain(f -> { + if (f.error() != null) + throw new GridClosureException(f.error()); - if (req.uploadNodeId.equals(ctx.localNodeId())) { - log.info("Upload node skip download [icp=" + icp + ']'); - - return new GridFinishedFuture<>(new ClassPathDeployToAllResponse(icp.id())); - } - - log.info("Starting download new classpath [icp=" + icp + ']'); - - return new DownloadClassPathTask(ctx, icp).call(); + return new ClassPathDeployToAllResponse(req.icpId); + }); } /** @@ -103,7 +103,7 @@ private IgniteInternalFuture startDeployToAllProce * @param err Errors. */ private void processDeployToAllResult(UUID id, Map res, Map err) { - GridFutureAdapter fut = deployToAllFuts.remove(id); + GridFutureAdapter fut = futs.remove(id); // Only upload node manage the process. if (fut == null) { @@ -115,10 +115,11 @@ private void processDeployToAllResult(UUID id, Map> { - /** Kernal context. */ - private final GridKernalContext ctx; - - /** Logger. */ - private final IgniteLogger log; - - /** Ignite class path. */ - private final IgniteClassPath icp; - - private final AtomicInteger cntr; - - /** Resulting future. */ - private final GridFutureAdapter res; - - /** - * @param ctx Kernal context. - * @param icp Ignite class path. - */ - public DownloadClassPathTask(GridKernalContext ctx, IgniteClassPath icp) { - this.ctx = ctx; - this.log = ctx.log(DownloadClassPathTask.class); - this.icp = icp; - this.res = new GridFutureAdapter<>(); - this.cntr = new AtomicInteger(icp.files().length); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture call() { - try { - // TODO: check correct executor used. - Stream.of(icp.files()) - .map(DownloadClassPathFileTask::new) - .map(ctx.pools().getPeerClassLoadingExecutorService()::submit); - } - catch (Throwable e) { - res.onDone(e); - } - - return res; - } - - /** */ - private class DownloadClassPathFileTask implements Runnable { - /** */ - private final String name; - - /** */ - public DownloadClassPathFileTask(String name) { - this.name = name; - } - - /** {@inheritDoc} */ - @Override public void run() { - try { - run0(); - } - catch (Throwable e) { - res.onDone(e); - } - } - - /** */ - private void run0() { - log.info("Downloading file: " + name); - - if (!res.isDone()) { - int filesToDownload = cntr.addAndGet(-1); - - log.info("File downloaded [name=" + name + ", filesToDownload=" + filesToDownload + ']'); - - if (filesToDownload == 0) - res.onDone(new ClassPathDeployToAllResponse(icp.id())); - } - } - } -} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java index 1d58b43dbaac3..2cf677a206dda 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.classpath; -/** */ +/** State of {@link IgniteClassPath}. */ public enum IgniteClassPathState { /** Creationg process in progress. */ NEW, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index b96a82954cb2f..01f1848f56358 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -660,8 +660,7 @@ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws w.writeUuid(icpID); w.writeString(name); w.writeLong(offset[0]); - w.writeInt(bytesCnt[0]); - w.writeByteArray(batch); + w.writeByteArray(batch, 0, bytesCnt[0]); } }, in -> null diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java index 3b78d9e91a966..f9213dab6aa67 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathDistributeTask.java @@ -21,11 +21,12 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.classpath.IgniteClassPath; import org.apache.ignite.internal.visor.VisorJob; import org.apache.ignite.internal.visor.VisorOneNodeTask; import org.jetbrains.annotations.Nullable; -/** */ +/** Task to start deploy process of newly created {@link IgniteClassPath}. */ public class ClassPathDistributeTask extends VisorOneNodeTask { /** */ private static final long serialVersionUID = 0L; @@ -47,7 +48,7 @@ protected ClassPathDistributeJob(@Nullable UUID arg, boolean debug) { /** {@inheritDoc} */ @Override protected Void run(@Nullable UUID arg) throws IgniteException { - IgniteInternalFuture fut = ignite.context().classPath().deployToAllProcess.start(arg); + IgniteInternalFuture fut = ignite.context().classPath().deployToAll(arg); try { fut.get(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java index 2100a9fe0d0f6..1ec5b0477e37f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java @@ -1096,7 +1096,7 @@ public File maintenanceFile() { * @param name IgniteClassPath name. * @return IgniteClassPath directory. */ - public File classPath(String name) { + public File classPathRoot(String name) { return new File(icp, name); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerInternalRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerInternalRequest.java new file mode 100644 index 0000000000000..733e737383ce5 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerInternalRequest.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.odbc; + +import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext; + +/** + * Marker interface for requests that can be executed by control.sh, only + * @see ClientConnectionContext#managementClient() + */ +public interface ClientListenerInternalRequest extends ClientListenerRequest { + /** {@inheritDoc} */ + @Override default boolean internal() { + return true; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequest.java index d7006f70a617f..bb37216852cf5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequest.java @@ -33,4 +33,9 @@ public interface ClientListenerRequest { default boolean beforeStartupRequest() { return false; } + + /** @return {@code True} if request can be executed only by control.sh client. */ + default boolean internal() { + return false; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java index 4d344fc3f1216..9a1365be4eef4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.platform.client; +import org.apache.ignite.client.ClientException; import org.apache.ignite.internal.binary.BinaryReaderEx; import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.BinaryWriterEx; @@ -76,7 +77,7 @@ import org.apache.ignite.internal.processors.platform.client.cache.ClientCacheScanQueryRequest; import org.apache.ignite.internal.processors.platform.client.cache.ClientCacheSqlFieldsQueryRequest; import org.apache.ignite.internal.processors.platform.client.cache.ClientCacheSqlQueryRequest; -import org.apache.ignite.internal.processors.platform.client.classpath.ClientFileUploadRequest; +import org.apache.ignite.internal.processors.platform.client.classpath.ClientClassPathFileUploadRequest; import org.apache.ignite.internal.processors.platform.client.cluster.ClientClusterChangeStateRequest; import org.apache.ignite.internal.processors.platform.client.cluster.ClientClusterGetDataCenterNodesRequest; import org.apache.ignite.internal.processors.platform.client.cluster.ClientClusterGetStateRequest; @@ -116,6 +117,8 @@ import org.apache.ignite.internal.processors.platform.client.streamer.ClientDataStreamerStartRequest; import org.apache.ignite.internal.processors.platform.client.tx.ClientTxEndRequest; import org.apache.ignite.internal.processors.platform.client.tx.ClientTxStartRequest; +import org.apache.ignite.internal.thread.context.Scope; +import org.apache.ignite.plugin.security.SecurityPermission; /** * Thin client message parser. @@ -455,6 +458,9 @@ public class ClientMessageParser implements ClientListenerMessageParser { if (ctx.kernalContext().recoveryMode() && !req.beforeStartupRequest()) return new ClientRawRequest(req.requestId(), ClientStatus.FAILED, "Node in recovery mode."); + if (req.internal()) + checkPermissionsForInternalRequest(); + return req; } @@ -740,7 +746,7 @@ public ClientListenerRequest decode(BinaryReaderEx reader) { return new ClientServiceTopologyRequest(reader); case FILE_UPLOAD: - return new ClientFileUploadRequest(reader); + return new ClientClassPathFileUploadRequest(reader); case OP_STOP_WARMUP: return new ClientCacheStopWarmupRequest(reader); @@ -778,4 +784,22 @@ public ClientListenerRequest decode(BinaryReaderEx reader) { @Override public long decodeRequestId(ClientMessage msg) { return 0; } + + /** + * Check permissions to invoke internal requests. + */ + private void checkPermissionsForInternalRequest() { + if (!ctx.managementClient()) + throw new ClientException("Only management client are allowed to execute this"); + + // When security is enabled, only an administrator can connect and execute commands. + if (ctx.securityContext() != null) { + try (Scope ignored = ctx.kernalContext().security().withContext(ctx.securityContext())) { + ctx.kernalContext().security().authorize(SecurityPermission.ADMIN_OPS); + } + catch (SecurityException e) { + throw new ClientException("ADMIN_OPS permission required"); + } + } + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientClassPathFileUploadRequest.java similarity index 85% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java rename to modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientClassPathFileUploadRequest.java index f1359abe27b6f..75e61fb33a439 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientFileUploadRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/classpath/ClientClassPathFileUploadRequest.java @@ -20,12 +20,15 @@ import java.io.IOException; import java.util.UUID; import org.apache.ignite.binary.BinaryRawReader; +import org.apache.ignite.internal.processors.odbc.ClientListenerInternalRequest; import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext; import org.apache.ignite.internal.processors.platform.client.ClientRequest; import org.apache.ignite.internal.processors.platform.client.ClientResponse; -/** */ -public class ClientFileUploadRequest extends ClientRequest { +/** + * TODO: only for admin client! + */ +public class ClientClassPathFileUploadRequest extends ClientRequest implements ClientListenerInternalRequest { /** Upload node ID. */ private final UUID uploadNodeId; @@ -38,9 +41,6 @@ public class ClientFileUploadRequest extends ClientRequest { /** Offset to write data to. */ private final long offset; - /** Bytes count in batch to write. */ - private final int bytesCnt; - /** Batch. */ private final byte[] batch; @@ -49,28 +49,25 @@ public class ClientFileUploadRequest extends ClientRequest { * * @param reader Reader. */ - public ClientFileUploadRequest(BinaryRawReader reader) { + public ClientClassPathFileUploadRequest(BinaryRawReader reader) { super(reader); uploadNodeId = reader.readUuid(); icpId = reader.readUuid(); name = reader.readString(); offset = reader.readLong(); - bytesCnt = reader.readInt(); batch = reader.readByteArray(); } /** {@inheritDoc} */ @Override public ClientResponse process(ClientConnectionContext ctx) { - // TODO: add backward compatibility support. - UUID locNodeId = ctx.kernalContext().localNodeId(); if (!uploadNodeId.equals(locNodeId)) throw new IllegalStateException("Wrong node [uploadNode=" + uploadNodeId + ", localNode=" + locNodeId + ']'); try { - ctx.kernalContext().classPath().uploadFilePart(icpId, name, offset, bytesCnt, batch); + ctx.kernalContext().classPath().writeFilePartFromClient(icpId, name, offset, batch); return new ClientResponse(requestId()); } From 28a3beba70d2e82459907d0a9d3f494dd1734e79 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 11 Jun 2026 22:53:10 +0300 Subject: [PATCH 14/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 51 ++++++++++-------- .../ClassPathFilesTransmissionHandler.java | 52 ++++++++++++++----- .../classpath/ClassPathProcessor.java | 36 +++++-------- .../classpath/DeployToAllProcess.java | 45 ++++++++++------ .../internal/classpath/IgniteClassPath.java | 12 +++-- .../internal/client/thin/TcpIgniteClient.java | 2 +- .../platform/client/ClientMessageParser.java | 9 ++-- .../client/ThinClientPermissionCheckTest.java | 47 +++++++++++++++++ 8 files changed, 173 insertions(+), 81 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 600d1bd5af170..fdea25d21def0 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -20,11 +20,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.stream.Collectors; -import org.junit.Assume; import org.junit.Test; +import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_INVALID_ARGUMENTS; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; -import static org.hamcrest.Matchers.is; +import static org.apache.ignite.testframework.GridTestUtils.assertContains; /** * Test for --classpath command. @@ -39,11 +39,12 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT super.beforeTestsStarted(); } + // TODO check empty file creation. + // TODO add in production code checks of files integriy. Perform file integrity check on startup. + /** Tests --create command. */ @Test public void testCreate() throws Exception { - Assume.assumeThat("Only cli mode supported", commandHandler, is(CLI_CMD_HND)); - //grid(0).cluster().state(ClusterState.ACTIVE); String jars = Files.list(Path.of(getClass().getClassLoader().getResource(".").getPath() + "../")) @@ -74,29 +75,37 @@ public void testCreate() throws Exception { finally { String outStr = testOut.toString(); - stopAllGrids(); - System.out.println(outStr); } } - // TODO check empty file creation. - // TODO add in production code checks of files integriy. Perform file integrity check on startup. - /** Tests --create command. */ + /** Tests --create command arguments format. */ @Test public void testEmptyFilesArgument() { - final TestCommandHandler hnd = newCommandHandler(createTestLogger()); - - try { - assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", "mysuperapp", "--files")); - } - finally { - String outStr = testOut.toString(); - - stopAllGrids(); - - System.out.println(outStr); - } + injectTestSystemOut(); + assertContains( + log, + executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--name", "mysuperapp", "--files"), + "Please specify a value for argument: --files" + ); + + assertContains( + log, + executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--name", "mysuperapp"), + "Mandatory argument(s) missing: [--files]" + ); + + assertContains( + log, + executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--name", "--files", "some_files"), + "Please specify a value for argument: --name" + ); + + assertContains( + log, + executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--files", "some_files"), + "Mandatory argument(s) missing: [--name]" + ); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index c771ec95e9eac..170de4e5607a9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -25,12 +25,16 @@ import org.apache.ignite.internal.managers.communication.TransmissionHandler; import org.apache.ignite.internal.managers.communication.TransmissionMeta; import org.apache.ignite.internal.managers.communication.TransmissionPolicy; +import org.apache.ignite.internal.managers.eventstorage.DiscoveryEventListener; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.internal.U; +import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; +import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; import static org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotManager.SNP_NODE_STOPPING_ERR_MSG; @@ -47,6 +51,9 @@ class ClassPathFilesTransmissionHandler implements TransmissionHandler, GridMess /** Transmission parameter for {@link IgniteClassPath} file name. */ private static final String NAME_PARAM = "name"; + /** System discovery message listener. */ + private DiscoveryEventListener discoLsnr; + /** */ private volatile DownloadClassPathTask active; @@ -73,21 +80,21 @@ public ClassPathFilesTransmissionHandler(GridKernalContext ctx) { /** * Downloads {@link IgniteClassPath} files locally from the remote node specified by {@code rmtNodeId}. - * @param icpId ClassPath id. * @param rmtNodeId Remote node id. + * @param icpId ClassPath id. * @return Future for download operation. */ - IgniteInternalFuture downloadLocally(UUID icpId, UUID rmtNodeId) { - if (rmtNodeId.equals(ctx.localNodeId())) { - log.info("Upload node skip download [icpId=" + icpId + ']'); + IgniteInternalFuture downloadLocally(UUID rmtNodeId, UUID icpId) { + try { + IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); - return new GridFinishedFuture<>(); - } + if (rmtNodeId.equals(ctx.localNodeId())) { + log.info("Skip download ClassPath files for upload node [name=" + icp.name() + ", id=" + icp.id() + ']'); - try { - IgniteClassPath icp = fromMetastorage(icpId, ctx); + return new GridFinishedFuture<>(); + } - log.info("Start download ClassPath files [icp=" + icp.name() + ']'); + log.info("Start download ClassPath files [name=" + icp.name() + ", id=" + icp.id() + ']'); DownloadClassPathTask task = new DownloadClassPathTask(rmtNodeId, icp); @@ -105,9 +112,28 @@ IgniteInternalFuture downloadLocally(UUID icpId, UUID rmtNodeId) { } } + /** Starts handler. */ + synchronized void start() { + ctx.event().addDiscoveryEventListener(discoLsnr = (evt, discoCache) -> { + UUID leftNodeId = evt.eventNode().id(); + + if (evt.type() == EVT_NODE_LEFT || evt.type() == EVT_NODE_FAILED) + onNodeLeft(leftNodeId); + }, EVT_NODE_LEFT, EVT_NODE_FAILED); + + ctx.io().addMessageListener(FILES_TOPIC, this); + ctx.io().addTransmissionHandler(FILES_TOPIC, this); + } + /** Stopping handler. */ void stop() { synchronized (this) { + if (discoLsnr != null) + ctx.event().removeDiscoveryEventListener(discoLsnr); + + ctx.io().removeMessageListener(FILES_TOPIC); + ctx.io().removeTransmissionHandler(FILES_TOPIC); + stopping = true; } @@ -153,7 +179,7 @@ private synchronized void cancelAll(Throwable err, Predicate { DownloadClassPathTask task = active; @@ -313,6 +339,8 @@ private void start(DownloadClassPathTask next) { ); } catch (IgniteCheckedException e) { + log.warning("Can't start download ClassPath files:", e); + next.res.onDone(new IgniteException("Can't download classpath files. " + "Remote node left the grid [rmtNodeId=" + next.rmtNodeId + ']')); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 6d1ec186606bd..9afe797bc3f0a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -25,7 +25,6 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.managers.eventstorage.DiscoveryEventListener; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.util.typedef.F; @@ -33,8 +32,6 @@ import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; -import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; /** @@ -55,9 +52,6 @@ public class ClassPathProcessor extends GridProcessorAdapter { /** Distributed process that deploys classpath files to all nodes. */ private final DeployToAllProcess deployToAllProc; - /** System discovery message listener. */ - private DiscoveryEventListener discoLsnr; - /** * @param ctx Kernal context. */ @@ -70,21 +64,12 @@ public ClassPathProcessor(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void start() throws IgniteCheckedException { - ctx.event().addDiscoveryEventListener(discoLsnr = (evt, discoCache) -> { - // TODO: check busyLock required. See IgniteSnapshotManager. - UUID leftNodeId = evt.eventNode().id(); - - if (evt.type() == EVT_NODE_LEFT || evt.type() == EVT_NODE_FAILED) - icpFilesHnd.onNodeLeft(leftNodeId); - }, EVT_NODE_LEFT, EVT_NODE_FAILED); + icpFilesHnd.start(); } /** {@inheritDoc} */ @Override public void onKernalStop(boolean cancel) { icpFilesHnd.stop(); - - if (discoLsnr != null) - ctx.event().removeDiscoveryEventListener(discoLsnr); } /** @@ -146,7 +131,7 @@ public void writeFilePartFromClient( byte[] batch ) throws IOException { try { - IgniteClassPath icp = fromMetastorage(icpId, ctx); + IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); if (F.indexOf(icp.files(), name) == -1) throw new IllegalArgumentException("Unknown lib [icp=" + icp.name() + ", unknown_lib=" + name + ']'); @@ -187,10 +172,15 @@ public IgniteInternalFuture deployToAll(@Nullable UUID icpId) { } /** */ - private void casToMetastorage(@Nullable IgniteClassPath prev, IgniteClassPath icp) { + void casToMetastorage(@Nullable IgniteClassPath prev, IgniteClassPath icp) { try { - if (!ctx.distributedMetastorage().compareAndSet(metastorageKey(icp), prev, icp)) - throw new IgniteException("Classpath alreay exists: " + icp.name()); + String key = metastorageKey(icp); + + if (!ctx.distributedMetastorage().compareAndSet(key, prev, icp)) { + IgniteClassPath val = ctx.distributedMetastorage().read(key); + + throw new IgniteException("Fail to write new ClassPath state[exp=" + icp + ", actual=" + val + ", new=" + icp); + } } catch (IgniteCheckedException e) { throw new IgniteException(e); @@ -202,7 +192,7 @@ private void casToMetastorage(@Nullable IgniteClassPath prev, IgniteClassPath ic * @param ctx Kernal context. * @return Class path. */ - static IgniteClassPath fromMetastorage(UUID icpId, GridKernalContext ctx) { + static IgniteClassPath fromMetastorage(UUID icpId, IgniteClassPathState expState, GridKernalContext ctx) { try { IgniteClassPath[] icp = new IgniteClassPath[1]; @@ -214,8 +204,8 @@ static IgniteClassPath fromMetastorage(UUID icpId, GridKernalContext ctx) { if (icp[0] == null) throw new IgniteException("ClassPath not found: " + icpId); - if (icp[0].state() != NEW) - throw new IgniteException("ClassPath in wrong state [expected=" + NEW + ", status=" + icp[0].state() + ']'); + if (icp[0].state() != expState) + throw new IgniteException("ClassPath in wrong state [expected=" + expState + ", status=" + icp[0].state() + ']'); return icp[0]; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index 532cf05e82650..8fa318bb51aa3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -29,6 +29,7 @@ import org.apache.ignite.internal.util.lang.GridClosureException; import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; /** Distributed process to spread {@link IgniteClassPath} files across cluster. */ @@ -36,16 +37,16 @@ class DeployToAllProcess { /** Logger. */ private final IgniteLogger log; - /** */ + /** Kernal context. */ private final GridKernalContext ctx; - /** */ + /** Files handler. */ private final ClassPathFilesTransmissionHandler icpFilesHnd; /** Distribute process that distributes new Ignite class path across all server nodes. */ private final DistributedProcess deployToAllProc; - /** */ + /** Future results of started distributed process. */ private final Map> futs = new ConcurrentHashMap<>(); /** */ @@ -58,7 +59,7 @@ public DeployToAllProcess(GridKernalContext ctx, ClassPathFilesTransmissionHandl deployToAllProc = new DistributedProcess<>( ctx, CLASSPATH_DEPLOY_TO_ALL, - this::startDeployToAllProcess, + this::downloadLocally, this::processDeployToAllResult ); } @@ -68,28 +69,40 @@ public DeployToAllProcess(GridKernalContext ctx, ClassPathFilesTransmissionHandl * @return Future for deploy process result. */ public IgniteInternalFuture start(UUID icpId) { - GridFutureAdapter deployRes = new GridFutureAdapter<>(); + boolean added = false; + + try { + GridFutureAdapter deployRes = new GridFutureAdapter<>(); - synchronized (this) { - IgniteClassPath icp = fromMetastorage(icpId, ctx); + synchronized (this) { + IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); - ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId, ctx.localNodeId()); + ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId, ctx.localNodeId()); - if (futs.put(icpId, deployRes) != null) - return new GridFinishedFuture<>(new IllegalStateException("Deploy to all process started, already: " + icp.name())); + added = futs.putIfAbsent(icpId, deployRes) == null; - deployToAllProc.start(icpId, req); + if (!added) + return new GridFinishedFuture<>(new IllegalStateException("Deploy to all process started, already: " + icp.name())); + + deployToAllProc.start(icpId, req); + } + + return deployRes; } + catch (Exception e) { + if (added) + futs.remove(icpId); - return deployRes; + return new GridFinishedFuture<>(e); + } } /** * @param req Request on snapshot creation. * @return Future which will be completed when a snapshot has been started. */ - private IgniteInternalFuture startDeployToAllProcess(ClassPathDeployToAllRequest req) { - return icpFilesHnd.downloadLocally(req.icpId, req.uploadNodeId).chain(f -> { + private IgniteInternalFuture downloadLocally(ClassPathDeployToAllRequest req) { + return icpFilesHnd.downloadLocally(req.uploadNodeId, req.icpId).chain(f -> { if (f.error() != null) throw new GridClosureException(f.error()); @@ -113,7 +126,7 @@ private void processDeployToAllResult(UUID id, Map null diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java index 9a1365be4eef4..a1bfe607c5e4f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientMessageParser.java @@ -421,6 +421,9 @@ public class ClientMessageParser implements ClientListenerMessageParser { /** Stop warmup. */ private static final short OP_STOP_WARMUP = 10000; + /** */ + public static final String INTERNAL_REQ_ERR_MSG = "Only management client are allowed to execute this"; + /** Marshaller. */ private final GridBinaryMarshaller marsh; @@ -459,7 +462,7 @@ public class ClientMessageParser implements ClientListenerMessageParser { return new ClientRawRequest(req.requestId(), ClientStatus.FAILED, "Node in recovery mode."); if (req.internal()) - checkPermissionsForInternalRequest(); + checkInternalRequestAllowed(); return req; } @@ -788,9 +791,9 @@ public ClientListenerRequest decode(BinaryReaderEx reader) { /** * Check permissions to invoke internal requests. */ - private void checkPermissionsForInternalRequest() { + private void checkInternalRequestAllowed() { if (!ctx.managementClient()) - throw new ClientException("Only management client are allowed to execute this"); + throw new ClientException(INTERNAL_REQ_ERR_MSG); // When security is enabled, only an administrator can connect and execute commands. if (ctx.securityContext() != null) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/client/ThinClientPermissionCheckTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/client/ThinClientPermissionCheckTest.java index 401edd85015dd..f0cf1ee674b01 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/client/ThinClientPermissionCheckTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/client/ThinClientPermissionCheckTest.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.security.client; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -24,6 +25,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -36,6 +38,7 @@ import org.apache.ignite.client.ClientAuthenticationException; import org.apache.ignite.client.ClientAuthorizationException; import org.apache.ignite.client.ClientCache; +import org.apache.ignite.client.ClientConnectionException; import org.apache.ignite.client.ClientException; import org.apache.ignite.client.Config; import org.apache.ignite.client.IgniteClient; @@ -49,6 +52,7 @@ import org.apache.ignite.configuration.ThinClientConfiguration; import org.apache.ignite.events.CacheEvent; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.client.thin.TcpIgniteClient; import org.apache.ignite.internal.processors.cache.eviction.paged.TestObject; import org.apache.ignite.internal.processors.platform.cache.expiry.PlatformExpiryPolicyFactory; import org.apache.ignite.internal.processors.security.AbstractSecurityTest; @@ -440,6 +444,49 @@ public void testConnectAsManagementClient() throws Exception { checkDflt.run(); } + /** */ + @Test + public void testClassPathUploadFilePart() throws Exception { + File tmpFile = File.createTempFile("file", "temp"); + + tmpFile.deleteOnExit(); + + // Client has no permission to invoke internal methods. + // Trying to invoke without specifying "management client" flag must fail. + for (String name: new String[] {CLIENT, ADMIN}) { + assertThrows(log, () -> { + try (IgniteClient cli = startClient(name)) { + ((TcpIgniteClient)cli).uploadClasspathFile(F.first(cli.cluster().nodes()), UUID.randomUUID(), tmpFile.toPath()); + return null; + } + }, ClientConnectionException.class, "Channel is closed"); + } + + userAttrs = F.asMap(MANAGEMENT_CLIENT_ATTR, "true"); + + try { + // Trying to invoke as CLIENT with "management client" flag must fail, because of security. + // CLIENT has no ADMIN_OPS permission. + assertThrows(log, () -> { + try (IgniteClient cli = startClient(CLIENT)) { + ((TcpIgniteClient)cli).uploadClasspathFile(F.first(cli.cluster().nodes()), UUID.randomUUID(), tmpFile.toPath()); + return null; + } + }, ClientConnectionException.class, "Channel is closed"); + + // Check that request actually invoked and failed due to unknown ClassPath. + assertThrows(log, () -> { + try (IgniteClient cli = startClient(ADMIN)) { + ((TcpIgniteClient)cli).uploadClasspathFile(F.first(cli.cluster().nodes()), UUID.randomUUID(), tmpFile.toPath()); + return null; + } + }, ClientException.class, "ClassPath not found"); + } + finally { + userAttrs = null; + } + } + /** * Gets all operations. * From 1796281f746bcfa40d4b2c1658d49a9e4af176b2 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 12 Jun 2026 16:37:08 +0300 Subject: [PATCH 15/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 74 ++++++++++++++----- .../classpath/ClassPathCreateCommand.java | 3 + 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index fdea25d21def0..20ca06227cf4f 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -17,9 +17,14 @@ package org.apache.ignite.util; +import java.io.File; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.junit.Test; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_INVALID_ARGUMENTS; @@ -30,53 +35,59 @@ * Test for --classpath command. */ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractTest { + /** */ + public static final int GRID_CNT = 3; + /** {@inheritDoc} */ @Override protected void beforeTestsStarted() throws Exception { cleanPersistenceDir(); - startGrids(2); + startGrids(GRID_CNT); super.beforeTestsStarted(); } // TODO check empty file creation. // TODO add in production code checks of files integriy. Perform file integrity check on startup. + // Support JXM handler. + // Support pretty print for command. + // Test for different failure types: node fail, file write fail, etc. + // Concurrent creation of CP with the same name. /** Tests --create command. */ @Test - public void testCreate() throws Exception { + public void testCreate() { //grid(0).cluster().state(ClusterState.ACTIVE); - String jars = Files.list(Path.of(getClass().getClassLoader().getResource(".").getPath() + "../")) - .map(Path::toAbsolutePath) - .map(Path::toString) - .filter(f -> f.endsWith("jar")) - .collect(Collectors.joining(",")); - - Path dir = Path.of(getClass().getClassLoader().getResource(".").getPath() + "../../../core/target"); - - System.out.println("dir = " + dir); - - String coreJars = Files.list(dir) - .map(Path::toAbsolutePath) - .map(Path::toString) - .filter(f -> f.endsWith("jar")) - .collect(Collectors.joining(",")); - - jars += "," + coreJars; + Set jars = jars( + Path.of(getClass().getClassLoader().getResource(".").getPath() + "../"), + Path.of(getClass().getClassLoader().getResource(".").getPath() + "../../../core/target") + ); injectTestSystemOut(); final TestCommandHandler hnd = newCommandHandler(createTestLogger()); + String cpName = "mysuperapp"; + try { - assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", "mysuperapp", "--files", jars)); + String files = jars.stream().map(Path::toFile).map(File::getAbsolutePath).collect(Collectors.joining(",")); + + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName, "--files", files)); } finally { String outStr = testOut.toString(); System.out.println(outStr); } + + Set cpFilesNames = fileNames(jars); + + for (int i = 0; i < GRID_CNT; i++) { + NodeFileTree ft = grid(i).context().pdsFolderResolver().fileTree(); + + assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(jars(ft.classPathRoot(cpName).toPath()))); + } } /** Tests --create command arguments format. */ @@ -107,5 +118,28 @@ public void testEmptyFilesArgument() { executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--files", "some_files"), "Mandatory argument(s) missing: [--name]" ); + + assertContains( + log, + executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--name", "mysuperapp", "--files", ""), + cliCommandHandler() ? "File name must not be empty" : "Argument --files required" + ); + } + + /** */ + private Set fileNames(Set dirs) { + return dirs.stream().map(Path::getFileName).map(Path::toString).collect(Collectors.toSet()); + } + + /** */ + private Set jars(Path... dirs) { + return Stream.of(dirs).flatMap(dir -> { + try { + return Files.list(dir).filter(p -> p.getFileName().toString().endsWith("jar")); + } + catch (IOException e) { + throw new RuntimeException(e); + } + }).map(Path::toAbsolutePath).collect(Collectors.toSet()); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index 587d5b36c818a..a97726814d945 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -32,6 +32,7 @@ import org.apache.ignite.internal.management.api.CommandUtils; import org.apache.ignite.internal.management.api.NativeCommand; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.A; import org.jetbrains.annotations.Nullable; /** @@ -74,6 +75,8 @@ private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg long[] lengths = new long[arg.files.length]; for (int i = 0; i < arg.files.length; i++) { + A.notEmpty(arg.files[i], "File name"); + Path f = Path.of(arg.files[i]); if (!Files.exists(f)) From 33377428c8aaabf49947660b40a57da469f1ff12 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 15 Jun 2026 16:48:39 +0300 Subject: [PATCH 16/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 33 +++--- .../classpath/ClassPathProcessor.java | 75 ++++++++++--- .../classpath/DeployToAllProcess.java | 25 +++-- .../internal/client/thin/TcpIgniteClient.java | 4 +- .../classpath/ClassPathCreateCommand.java | 102 ++++++++++-------- 5 files changed, 157 insertions(+), 82 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 20ca06227cf4f..72c9d95ec1e98 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -47,31 +47,36 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT super.beforeTestsStarted(); } + // TODO: add test that classpath can be created only with ADMIN_OPS privelege. + // TODO: add CRC or other check of file integrity. // TODO check empty file creation. // TODO add in production code checks of files integriy. Perform file integrity check on startup. - // Support JXM handler. // Support pretty print for command. // Test for different failure types: node fail, file write fail, etc. // Concurrent creation of CP with the same name. + // Just create CP with the same name after first creation. /** Tests --create command. */ @Test - public void testCreate() { - //grid(0).cluster().state(ClusterState.ACTIVE); + public void testCreate() throws IOException { + File emptyFile = File.createTempFile("empty", ".txt"); - Set jars = jars( - Path.of(getClass().getClassLoader().getResource(".").getPath() + "../"), - Path.of(getClass().getClassLoader().getResource(".").getPath() + "../../../core/target") + emptyFile.deleteOnExit(); + + Set cpFiles = files( + Path.of(getClass().getClassLoader().getResource(".").getPath() + "../"), + Path.of(getClass().getClassLoader().getResource(".").getPath() + "../../../core/target"), + emptyFile.toPath() ); injectTestSystemOut(); final TestCommandHandler hnd = newCommandHandler(createTestLogger()); - String cpName = "mysuperapp"; + String cpName = "mysuperapp_" + commandHandler; try { - String files = jars.stream().map(Path::toFile).map(File::getAbsolutePath).collect(Collectors.joining(",")); + String files = cpFiles.stream().map(Path::toFile).map(File::getAbsolutePath).collect(Collectors.joining(",")); assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName, "--files", files)); } @@ -81,12 +86,12 @@ public void testCreate() { System.out.println(outStr); } - Set cpFilesNames = fileNames(jars); + Set cpFilesNames = fileNames(cpFiles); for (int i = 0; i < GRID_CNT; i++) { NodeFileTree ft = grid(i).context().pdsFolderResolver().fileTree(); - assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(jars(ft.classPathRoot(cpName).toPath()))); + assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(files(ft.classPathRoot(cpName).toPath()))); } } @@ -132,10 +137,12 @@ private Set fileNames(Set dirs) { } /** */ - private Set jars(Path... dirs) { - return Stream.of(dirs).flatMap(dir -> { + private Set files(Path... paths) { + return Stream.of(paths).flatMap(path -> { try { - return Files.list(dir).filter(p -> p.getFileName().toString().endsWith("jar")); + return Files.isDirectory(path) + ? Files.list(path).filter(p -> p.getFileName().toString().endsWith("jar") || p.getFileName().toString().endsWith("txt")) + : Stream.of(path); } catch (IOException e) { throw new RuntimeException(e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 9afe797bc3f0a..40669761bebd4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -20,6 +20,8 @@ import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.UUID; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; @@ -27,6 +29,7 @@ import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.U; @@ -89,26 +92,33 @@ public UUID startCreation(String name, String[] files, long[] lengths) { IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths, NEW); - NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); - - File root = ft.classPathRoot(name); + Boolean metastorageWritten; try { - casToMetastorage(null, icp); + metastorageWritten = casToMetastorageAsync(null, icp).get(); + } + catch (IgniteCheckedException e) { + throw new IgniteException(e); + } + if (metastorageWritten != null && !metastorageWritten) + throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); + + File root = ctx.pdsFolderResolver().fileTree().classPathRoot(name); + + try { NodeFileTree.mkdir(root, "Ignite Class Path root: " + name); } catch (Exception e) { try { - ctx.distributedMetastorage().remove(metastorageKey(icp)); + if (metastorageWritten != null && metastorageWritten) + ctx.distributedMetastorage().remove(metastorageKey(icp)); U.delete(root); } catch (IgniteCheckedException ex) { log.error("Cleanup after IgniteClassPath creation failed [key=" + metastorageKey(icp) + ", root=" + root + ']', e); } - - throw e; } log.info("New classpath created [root = " + root + ", icp=" + icp + ']'); @@ -162,6 +172,28 @@ public void writeFilePartFromClient( } } + /** + * Copies local file to class path directory. + * + * @param icpId ClassPath id. + * @param file File to copy. + */ + public void copyClassPathFileLocally(UUID icpId, Path file) throws IOException { + IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); + + Path f = new File(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()), file.getFileName().toString()).toPath(); + + log.info("Copying new classpath file: " + f); + + if (Files.exists(f) && Files.isSameFile(file, f)) { + log.info("Skip copying new classpath file, already there: " + f); + + return; + } + + Files.copy(file, f); + } + /** * Deploy {@link IgniteClassPath} to all nodes. * @param icpId ClassPath id. @@ -171,16 +203,33 @@ public IgniteInternalFuture deployToAll(@Nullable UUID icpId) { return deployToAllProc.start(icpId); } - /** */ - void casToMetastorage(@Nullable IgniteClassPath prev, IgniteClassPath icp) { + /** + * + */ + GridFutureAdapter casToMetastorageAsync(@Nullable IgniteClassPath prev, IgniteClassPath icp) { try { String key = metastorageKey(icp); - if (!ctx.distributedMetastorage().compareAndSet(key, prev, icp)) { - IgniteClassPath val = ctx.distributedMetastorage().read(key); + if (log.isDebugEnabled()) + log.debug("Writing new ClassPath state [new=" + icp + ", prev=" + prev + ']'); - throw new IgniteException("Fail to write new ClassPath state[exp=" + icp + ", actual=" + val + ", new=" + icp); - } + GridFutureAdapter res = ctx.distributedMetastorage().compareAndSetAsync(key, prev, icp); + + res.listen(casFut -> { + if (casFut.error() == null) + return; + + try { + Object val = ctx.distributedMetastorage().read(key); + + log.warning("Fail to write new ClassPath state [exp=" + prev + ", actual=" + val + ']'); + } + catch (IgniteCheckedException e) { + log.warning("Can't read metastore key", e); + } + }); + + return res; } catch (IgniteCheckedException e) { throw new IgniteException(e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index 8fa318bb51aa3..66babf57dc526 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -126,17 +126,24 @@ private void processDeployToAllResult(UUID id, Map { + log.info("Deploy to all DONE!"); - log.info("Deploy to all DONE!"); + if (!fut.onDone(casFut.error() == null ? "OK" : null, casFut.error())) { + log.warning("Distribute process in wrong state " + + "[canceled=" + fut.isCancelled() + ", failed=" + fut.isFailed() + ", done=" + fut.isDone() + ']'); + } + }); + } + catch (Exception e) { + fut.onDone(e); + } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index 4d28bcb505531..0952322625606 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -666,7 +666,9 @@ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws in -> null ); - offset[0] += bytesCnt[0]; + if (bytesCnt[0] > 0) + offset[0] += bytesCnt[0]; + bytesCnt[0] = fis.read(batch); } while (bytesCnt[0] > 0); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index a97726814d945..79b656efe26fb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.management.classpath; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -27,6 +28,7 @@ import org.apache.ignite.Ignite; import org.apache.ignite.client.IgniteClient; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.classpath.IgniteClassPath; import org.apache.ignite.internal.client.thin.TcpIgniteClient; import org.apache.ignite.internal.management.api.CommandUtils; @@ -58,77 +60,85 @@ public class ClassPathCreateCommand implements NativeCommand printer ) throws Exception { - if (client != null) { - create(client, arg, printer); - - return null; - } + if (client == null && !(ignite instanceof IgniteEx)) + throw new IllegalStateException("Client or IgniteEx required"); - throw new UnsupportedOperationException("Creating with the Ignite instance not supported at a time."); - } + List files = prepareFiles(arg); - /** */ - private void create(@Nullable IgniteClient client, ClassPathCreateCommandArg arg, Consumer printer) throws Exception { - TcpIgniteClient cli = (TcpIgniteClient)client; + ClusterNode uploadNode = uploadNode(client, ignite); - List files = new ArrayList<>(arg.files.length); - long[] lengths = new long[arg.files.length]; - - for (int i = 0; i < arg.files.length; i++) { - A.notEmpty(arg.files[i], "File name"); - - Path f = Path.of(arg.files[i]); - - if (!Files.exists(f)) - throw new IllegalArgumentException("File not exists: " + f); - - files.add(f); + printer.accept("Upload node: " + uploadNode.id()); - lengths[i] = Files.size(f); - } + UUID icpID = CommandUtils.execute(client, ignite, ClassPathStartCreationTask.class, arg, Collections.singletonList(uploadNode)); - arg.lengths = lengths; - // We don't want to send full path to server nodes. - // Server nodes require files names, only. - arg.files = fileNames(files); - // TODO: add CRC or other check of file integrity. + printer.accept("New classpath created [uploadNode=" + uploadNode.id() + ", name=" + arg.name + ", id=" + icpID.toString() + ']'); - ClusterNode uploadNode = uploadNode(cli); + uploadFiles(client, ignite, printer, files, uploadNode, icpID); - printer.accept("Upload node: " + uploadNode.id()); + CommandUtils.execute(client, ignite, ClassPathDistributeTask.class, icpID, Collections.singletonList(uploadNode)); - UUID icpID = CommandUtils.execute(client, null, ClassPathStartCreationTask.class, arg, Collections.singletonList(uploadNode)); + return null; + } - printer.accept("New classpath created [uploadNode=" + uploadNode.id() + ", name=" + arg.name + ", id=" + icpID.toString() + ']'); + private static void uploadFiles( + @Nullable IgniteClient client, + @Nullable Ignite ignite, + Consumer printer, + List files, + ClusterNode uploadNode, + UUID icpId + ) throws IOException { printer.accept("Starting to upload files:"); // TODO: add pretty print here. for (Path file : files) { printer.accept(String.valueOf(file.toAbsolutePath())); - cli.uploadClasspathFile(uploadNode, icpID, file); + if (client != null) + ((TcpIgniteClient)client).uploadClasspathFile(uploadNode, icpId, file); + else { + ((IgniteEx)ignite).context().classPath().copyClassPathFileLocally(icpId, file); + } printer.accept("DONE"); } - - CommandUtils.execute(client, null, ClassPathDistributeTask.class, icpID, Collections.singletonList(uploadNode)); } /** */ - private static ClusterNode uploadNode(TcpIgniteClient client) { - List nodes = client.connectedToNodes(); + private static List prepareFiles(ClassPathCreateCommandArg arg) throws IOException { + List files = new ArrayList<>(arg.files.length); - if (F.isEmpty(nodes)) - throw new IllegalStateException("Not connected to node"); + arg.lengths = new long[arg.files.length]; - return client.cluster().node(F.first(nodes)); + for (int i = 0; i < arg.files.length; i++) { + A.notEmpty(arg.files[i], "File name"); + + Path f = Path.of(arg.files[i]); + + if (!Files.exists(f)) + throw new IllegalArgumentException("File not exists: " + f); + + files.add(f); + + arg.lengths[i] = Files.size(f); + + // Don't want to send full path to server nodes. + // Server nodes require files names, only. + arg.files[i] = f.getFileName().toString(); + } + + return files; } /** */ - private static String[] fileNames(List files) { - String[] fileNames = new String[files.size()]; + private static ClusterNode uploadNode(IgniteClient client, Ignite ignite) { + if (client != null) { + List nodes = ((TcpIgniteClient)client).connectedToNodes(); - for (int i = 0; i < fileNames.length; i++) - fileNames[i] = files.get(i).getFileName().toString(); + if (F.isEmpty(nodes)) + throw new IllegalStateException("Not connected to node"); + + return client.cluster().node(F.first(nodes)); + } - return fileNames; + return ignite.cluster().localNode(); } } From 86be903080541b943e30aeadb006f3e8eba47891 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 15 Jun 2026 17:04:13 +0300 Subject: [PATCH 17/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 23 +++++++++---------- .../classpath/ClassPathCreateCommand.java | 3 +++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 72c9d95ec1e98..17cdbdec8ac2e 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -29,6 +29,7 @@ import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_INVALID_ARGUMENTS; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; +import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_UNEXPECTED_ERROR; import static org.apache.ignite.testframework.GridTestUtils.assertContains; /** @@ -49,12 +50,10 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT // TODO: add test that classpath can be created only with ADMIN_OPS privelege. // TODO: add CRC or other check of file integrity. - // TODO check empty file creation. // TODO add in production code checks of files integriy. Perform file integrity check on startup. // Support pretty print for command. // Test for different failure types: node fail, file write fail, etc. // Concurrent creation of CP with the same name. - // Just create CP with the same name after first creation. /** Tests --create command. */ @Test @@ -74,17 +73,9 @@ public void testCreate() throws IOException { final TestCommandHandler hnd = newCommandHandler(createTestLogger()); String cpName = "mysuperapp_" + commandHandler; + String files = cpFiles.stream().map(Path::toFile).map(File::getAbsolutePath).collect(Collectors.joining(",")); - try { - String files = cpFiles.stream().map(Path::toFile).map(File::getAbsolutePath).collect(Collectors.joining(",")); - - assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName, "--files", files)); - } - finally { - String outStr = testOut.toString(); - - System.out.println(outStr); - } + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName, "--files", files)); Set cpFilesNames = fileNames(cpFiles); @@ -93,6 +84,14 @@ public void testCreate() throws IOException { assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(files(ft.classPathRoot(cpName).toPath()))); } + + try { + // Attemp to create ClassPath with the same name must fail. + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute(hnd, "--class-path", "create", "--name", cpName, "--files", files)); + } + finally { + assertTrue(testOut.toString().contains("Fail to register ClassPath. Same ClassPath exists, already?")); + } } /** Tests --create command arguments format. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index 79b656efe26fb..cd5881afd2002 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -80,6 +80,7 @@ public class ClassPathCreateCommand implements NativeCommand Date: Mon, 15 Jun 2026 17:51:55 +0300 Subject: [PATCH 18/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 36 +++++++++++++++---- .../classpath/ClassPathProcessor.java | 2 ++ .../classpath/DeployToAllProcess.java | 11 +++++- .../internal/classpath/IgniteClassPath.java | 14 ++++++++ 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 17cdbdec8ac2e..0a517a8775744 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -24,9 +24,13 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.classpath.IgniteClassPath; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.junit.Test; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.METASTORE_PREFIX; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_INVALID_ARGUMENTS; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_UNEXPECTED_ERROR; @@ -53,11 +57,13 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT // TODO add in production code checks of files integriy. Perform file integrity check on startup. // Support pretty print for command. // Test for different failure types: node fail, file write fail, etc. + // Node fail: upload node vs not upload node. + // Check cleanup. // Concurrent creation of CP with the same name. /** Tests --create command. */ @Test - public void testCreate() throws IOException { + public void testCreate() throws Exception { File emptyFile = File.createTempFile("empty", ".txt"); emptyFile.deleteOnExit(); @@ -77,13 +83,13 @@ public void testCreate() throws IOException { assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName, "--files", files)); - Set cpFilesNames = fileNames(cpFiles); + IgniteClassPath icp = classPath(cpName); - for (int i = 0; i < GRID_CNT; i++) { - NodeFileTree ft = grid(i).context().pdsFolderResolver().fileTree(); + assertEquals(READY, icp.state()); - assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(files(ft.classPathRoot(cpName).toPath()))); - } + Set cpFilesNames = fileNames(cpFiles); + + checkFilesExists(cpFilesNames, cpName); try { // Attemp to create ClassPath with the same name must fail. @@ -91,6 +97,19 @@ public void testCreate() throws IOException { } finally { assertTrue(testOut.toString().contains("Fail to register ClassPath. Same ClassPath exists, already?")); + + assertEquals("Metastorage state must not change", icp, classPath(cpName)); + + checkFilesExists(cpFilesNames, cpName); + } + } + + /** */ + private void checkFilesExists(Set cpFilesNames, String cpName) { + for (int i = 0; i < GRID_CNT; i++) { + NodeFileTree ft = grid(i).context().pdsFolderResolver().fileTree(); + + assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(files(ft.classPathRoot(cpName).toPath()))); } } @@ -148,4 +167,9 @@ private Set files(Path... paths) { } }).map(Path::toAbsolutePath).collect(Collectors.toSet()); } + + /** */ + private IgniteClassPath classPath(String cpName) throws IgniteCheckedException { + return grid(0).context().distributedMetastorage().read(METASTORE_PREFIX + cpName); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 40669761bebd4..560d830eedde7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -119,6 +119,8 @@ public UUID startCreation(String name, String[] files, long[] lengths) { catch (IgniteCheckedException ex) { log.error("Cleanup after IgniteClassPath creation failed [key=" + metastorageKey(icp) + ", root=" + root + ']', e); } + + throw e; } log.info("New classpath created [root = " + root + ", icp=" + icp + ']'); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index 66babf57dc526..8620c06512aea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; @@ -135,8 +136,16 @@ private void processDeployToAllResult(UUID id, Map { log.info("Deploy to all DONE!"); + + boolean metastorageWritten = casFut.error() == null && casFut.result() != null && casFut.result(); - if (!fut.onDone(casFut.error() == null ? "OK" : null, casFut.error())) { + Throwable t = metastorageWritten + ? null + : casFut.error() != null + ? casFut.error() + : new IgniteException("Fail to change ClassPath state. Concurrent removal?"); + + if (!fut.onDone(metastorageWritten ? "OK" : null, t)) { log.warning("Distribute process in wrong state " + "[canceled=" + fut.isCancelled() + ", failed=" + fut.isFailed() + ", done=" + fut.isDone() + ']'); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index f39042f30095e..2ecb9a908c11a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -18,6 +18,8 @@ package org.apache.ignite.internal.classpath; import java.io.Serializable; +import java.util.Arrays; +import java.util.Objects; import java.util.UUID; import org.apache.ignite.internal.util.typedef.internal.S; @@ -92,4 +94,16 @@ public long[] lengths() { @Override public String toString() { return S.toString(IgniteClassPath.class, this); } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + IgniteClassPath that = (IgniteClassPath)o; + return Objects.equals(id, that.id) && Objects.equals(name, that.name) && Objects.deepEquals(files, that.files) && Objects.deepEquals(lengths, that.lengths) && state == that.state; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return Objects.hash(id, name, Arrays.hashCode(files), Arrays.hashCode(lengths), state); + } } From c87bfce4af988c37d310973219e5c200d856c17b Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 15 Jun 2026 21:49:13 +0300 Subject: [PATCH 19/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 18 +-- .../ClassPathFilesTransmissionHandler.java | 19 +++ .../classpath/ClassPathProcessor.java | 46 ++++++-- .../classpath/ClassPathCreateCommand.java | 4 +- .../ClientClassPathFileUploadRequest.java | 17 ++- .../internal/classpath/ClassPathSelfTest.java | 108 ++++++++++++++++++ .../internal/client/thin/UploadFileTest.java | 74 ++++++++++++ .../IgniteSpiDeploymentSelfTestSuite.java | 4 +- 8 files changed, 260 insertions(+), 30 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/client/thin/UploadFileTest.java diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 0a517a8775744..dbb4ea918edba 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -104,15 +104,6 @@ public void testCreate() throws Exception { } } - /** */ - private void checkFilesExists(Set cpFilesNames, String cpName) { - for (int i = 0; i < GRID_CNT; i++) { - NodeFileTree ft = grid(i).context().pdsFolderResolver().fileTree(); - - assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(files(ft.classPathRoot(cpName).toPath()))); - } - } - /** Tests --create command arguments format. */ @Test public void testEmptyFilesArgument() { @@ -168,6 +159,15 @@ private Set files(Path... paths) { }).map(Path::toAbsolutePath).collect(Collectors.toSet()); } + /** */ + private void checkFilesExists(Set cpFilesNames, String cpName) { + for (int i = 0; i < GRID_CNT; i++) { + NodeFileTree ft = grid(i).context().pdsFolderResolver().fileTree(); + + assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(files(ft.classPathRoot(cpName).toPath()))); + } + } + /** */ private IgniteClassPath classPath(String cpName) throws IgniteCheckedException { return grid(0).context().distributedMetastorage().read(METASTORE_PREFIX + cpName); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index 170de4e5607a9..4295ca7186641 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -212,6 +212,25 @@ private synchronized void cancelAll(Throwable err, Predicate cpProc().startCreation("mycp", new String[]{hackName}, new long[]{42}), + IllegalArgumentException.class, + "simple filename expected" + ); + } + } + + /** */ + @Test + public void testMaliciousClassPathName() { + String[] hackNames = new String[]{ + "/", + "../../optional/ignite-cdc", + "./files", + "../files", + "/files", + "~/files" + }; + + for (String hackName : hackNames) { + assertThrows( + null, + () -> cpProc().startCreation(hackName, new String[]{"file.txt"}, new long[]{42}), + IllegalArgumentException.class, + "Classpath name must satisfy the following name pattern: a-zA-Z0-9_" + ); + } + } + + /** */ + @Test + public void testUnknownFilename() { + UUID icpId = cpProc().startCreation("mycp", new String[]{"file.txt"}, new long[]{42}); + + assertThrows( + null, + () -> { + cpProc().copyClassPathFileLocally(icpId, Path.of("other.txt")); + return null; + }, + IllegalArgumentException.class, + "Unknown lib" + ); + + assertThrows( + null, + () -> { + cpProc().writeFilePartFromClient(icpId, "other.txt", 0, new byte[1]); + return null; + }, + IllegalArgumentException.class, + "Unknown lib" + ); + } + + /** */ + private ClassPathProcessor cpProc() { + return grid(0).context().classPath(); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/UploadFileTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/UploadFileTest.java new file mode 100644 index 0000000000000..7a1be21732410 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/UploadFileTest.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.client.thin; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Function; +import org.apache.ignite.client.ClientException; +import org.apache.ignite.client.Config; +import org.apache.ignite.client.IgniteClient; +import org.apache.ignite.configuration.ClientConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.cache.CacheStopAndDestroySelfTest.CountingTxRequestsToClientNodeTcpCommunicationSpi.cnt; + +/** */ +public class UploadFileTest extends GridCommonAbstractTest { + /** */ + @Test + public void testLocalDateTimeMetaCached() throws Exception { + try (IgniteEx srv = startGrid(0)) { + IgniteClient cli = new TcpIgniteClient((cfg0, hnd) -> new TcpClientChannel(cfg0, hnd) { + @Override public T service( + ClientOperation op, + Consumer payloadWriter, + Function payloadReader + ) throws ClientException { + if (op == ClientOperation.GET_BINARY_TYPE_NAME) + cnt.incrementAndGet(); + + return super.service(op, payloadWriter, payloadReader); + } + + @Override public CompletableFuture serviceAsync( + ClientOperation op, + Consumer payloadWriter, + Function payloadReader + ) { + if (op == ClientOperation.GET_BINARY_TYPE_NAME) + cnt.incrementAndGet(); + + return super.serviceAsync(op, payloadWriter, payloadReader); + } + }, new ClientConfiguration().setAddresses(Config.SERVER)); + + try { + cli.cache(Config.DEFAULT_CACHE_NAME).get(1); + cli.cache(Config.DEFAULT_CACHE_NAME).get(1); + } + finally { + cli.close(); + } + + assertEquals(1, cnt.get()); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java index 5218686113ced..5cf0ed620aa95 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java @@ -17,6 +17,7 @@ package org.apache.ignite.testsuites; +import org.apache.ignite.internal.classpath.ClassPathSelfTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiSelfTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiStartStopSelfTest; import org.junit.runner.RunWith; @@ -28,7 +29,8 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ GridLocalDeploymentSpiSelfTest.class, - GridLocalDeploymentSpiStartStopSelfTest.class + GridLocalDeploymentSpiStartStopSelfTest.class, + ClassPathSelfTest.class }) public class IgniteSpiDeploymentSelfTestSuite { } From 5b6e7220dd1825ab1eeb48f18c786770735b8822 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 15 Jun 2026 22:15:54 +0300 Subject: [PATCH 20/54] IGNITE-28207 Classpath creation process --- .../ClassPathFilesTransmissionHandler.java | 61 +++++++++------ .../internal/client/thin/UploadFileTest.java | 74 ------------------- 2 files changed, 40 insertions(+), 95 deletions(-) delete mode 100644 modules/core/src/test/java/org/apache/ignite/internal/client/thin/UploadFileTest.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index 4295ca7186641..4340485d4af5f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.ignite.internal.classpath; import java.io.File; @@ -155,14 +172,22 @@ void onNodeLeft(UUID nodeId) { * @param filter Filter to select tasks for cancel. */ private synchronized void cancelAll(Throwable err, Predicate filter) { - queue.forEach(r -> { - if (filter.test(r)) { - r.res.onDone(err); - } - }); + queue.forEach(r -> cancel(r, err, filter)); + + cancel(active, err, filter); + } - if (active != null && filter.test(active)) - active.res.onDone(err); + /** + * @param r Task to cancel. + * @param err Result error. + * @param filter Task filter. + * @return {@code True} if task was canceled. + */ + private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Predicate filter) { + if (r == null || !filter.test(r)) + return false; + + return r.res.onDone(err); } /** {@inheritDoc} */ @@ -173,8 +198,7 @@ private synchronized void cancelAll(Throwable err, Predicate t.icp.id().equals(msg.icpId))) { + if (log.isInfoEnabled()) { + log.warning("A stale ClassPath failure message has been received. Will be ignored " + + "[fromNodeId=" + nodeId + ", icpId=" + msg.icpId + "]: " + msg.err); + } + } } } catch (Throwable e) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/UploadFileTest.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/UploadFileTest.java deleted file mode 100644 index 7a1be21732410..0000000000000 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/UploadFileTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.client.thin; - -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.function.Function; -import org.apache.ignite.client.ClientException; -import org.apache.ignite.client.Config; -import org.apache.ignite.client.IgniteClient; -import org.apache.ignite.configuration.ClientConfiguration; -import org.apache.ignite.internal.IgniteEx; -import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; -import org.junit.Test; - -import static org.apache.ignite.internal.processors.cache.CacheStopAndDestroySelfTest.CountingTxRequestsToClientNodeTcpCommunicationSpi.cnt; - -/** */ -public class UploadFileTest extends GridCommonAbstractTest { - /** */ - @Test - public void testLocalDateTimeMetaCached() throws Exception { - try (IgniteEx srv = startGrid(0)) { - IgniteClient cli = new TcpIgniteClient((cfg0, hnd) -> new TcpClientChannel(cfg0, hnd) { - @Override public T service( - ClientOperation op, - Consumer payloadWriter, - Function payloadReader - ) throws ClientException { - if (op == ClientOperation.GET_BINARY_TYPE_NAME) - cnt.incrementAndGet(); - - return super.service(op, payloadWriter, payloadReader); - } - - @Override public CompletableFuture serviceAsync( - ClientOperation op, - Consumer payloadWriter, - Function payloadReader - ) { - if (op == ClientOperation.GET_BINARY_TYPE_NAME) - cnt.incrementAndGet(); - - return super.serviceAsync(op, payloadWriter, payloadReader); - } - }, new ClientConfiguration().setAddresses(Config.SERVER)); - - try { - cli.cache(Config.DEFAULT_CACHE_NAME).get(1); - cli.cache(Config.DEFAULT_CACHE_NAME).get(1); - } - finally { - cli.close(); - } - - assertEquals(1, cnt.get()); - } - } -} From 732fe91f6fca09b7ab945b787bf2913f9d22526c Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 16 Jun 2026 10:29:20 +0300 Subject: [PATCH 21/54] IGNITE-28207 Classpath creation process --- .../ClassPathFilesTransmissionHandler.java | 57 +++++++++++++------ 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index 4340485d4af5f..a920af6daebbb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -23,6 +23,7 @@ import java.util.Queue; import java.util.UUID; import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Predicate; @@ -116,7 +117,7 @@ IgniteInternalFuture downloadLocally(UUID rmtNodeId, UUID icpId) { DownloadClassPathTask task = new DownloadClassPathTask(rmtNodeId, icp); try { - start(task); + submit(task); } catch (Throwable t) { task.res.onDone(t); @@ -265,7 +266,15 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { if (!ensureTask(nodeId, task)) return; - assert task.filesLeft.get() == 0 : task; + int filesLeft = task.filesLeft.get(); + + if (filesLeft != 0) { + String msg = "onEnd invoked, but more files left: " + filesLeft + ", completing download process with an error"; + + log.warning(msg); + + task.res.onDone(new IllegalStateException(msg)); + } if (log.isInfoEnabled()) log.info("Classpath files from remote node has been fully received [icp=" + task.icp.name() + ']'); @@ -335,7 +344,7 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { * * @param next Task to execute. */ - private void start(DownloadClassPathTask next) { + private void submit(DownloadClassPathTask next) { ClusterNode rmtNode; synchronized (this) { @@ -346,8 +355,9 @@ private void start(DownloadClassPathTask next) { } if (active != null && !active.res.isDone()) { - if (!queue.offer(next)) + if (!queue.offer(next)) { next.res.onDone(new IgniteException("Can't put task in queue: " + next.icp)); + } return; } @@ -367,21 +377,32 @@ private void start(DownloadClassPathTask next) { } try { - ctx.cache().context().gridIO().sendOrderedMessage( - rmtNode, - FILES_TOPIC, - new DownloadClassPathMessage(next.icp), - SYSTEM_POOL, - Long.MAX_VALUE, - true - ); - } - catch (IgniteCheckedException e) { - log.warning("Can't start download ClassPath files:", e); + // submit can be invoked from discovery thread. + // sendOrderedMessage can be blocking so invok it in separate thread to release discovery. + ctx.pools().getPeerClassLoadingExecutorService().submit(() -> { + try { + ctx.cache().context().gridIO().sendOrderedMessage( + rmtNode, + FILES_TOPIC, + new DownloadClassPathMessage(next.icp), + SYSTEM_POOL, + Long.MAX_VALUE, + true + ); + } + catch (IgniteCheckedException e) { + log.warning("Can't start download ClassPath files:", e); + + next.res.onDone(new IgniteException("Can't download classpath files. " + + "Remote node left the grid [rmtNodeId=" + next.rmtNodeId + ']')); - next.res.onDone(new IgniteException("Can't download classpath files. " + - "Remote node left the grid [rmtNodeId=" + next.rmtNodeId + ']')); + } + }); + } + catch (RejectedExecutionException e) { + log.warning("Submit to P2P pool rejected", e); + next.res.onDone(e); } } @@ -402,7 +423,7 @@ private void onActiveDone(IgniteInternalFuture doneFut) { } if (next != null) - start(next); + submit(next); } /** */ From 0c0240800fd4e082e88fee7c58505e875f301072 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 16 Jun 2026 19:21:44 +0300 Subject: [PATCH 22/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 142 +++++++++++++++--- .../ClassPathFilesTransmissionHandler.java | 58 +++---- .../classpath/ClassPathProcessor.java | 21 ++- .../classpath/DeployToAllProcess.java | 58 +++++-- .../internal/classpath/IgniteClassPath.java | 27 +++- .../classpath/ClassPathCreateCommand.java | 18 ++- 6 files changed, 248 insertions(+), 76 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index dbb4ea918edba..33f5cd2ee4101 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -25,8 +25,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.classpath.IgniteClassPath; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.testframework.ListeningTestLogger; +import org.apache.ignite.testframework.LogListener; import org.junit.Test; import static org.apache.ignite.internal.classpath.ClassPathProcessor.METASTORE_PREFIX; @@ -35,6 +38,7 @@ import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_UNEXPECTED_ERROR; import static org.apache.ignite.testframework.GridTestUtils.assertContains; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; /** * Test for --classpath command. @@ -43,13 +47,43 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT /** */ public static final int GRID_CNT = 3; + /** */ + public static final int FAIL_NODE_IDX = 2; + + /** */ + private Set cpFiles; + + /** */ + private String filesArg; + + /** */ + private ListeningTestLogger lsnrLog; + /** {@inheritDoc} */ - @Override protected void beforeTestsStarted() throws Exception { + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + return super.getConfiguration(igniteInstanceName).setGridLogger(lsnrLog); + } + + /** {@inheritDoc} */ + @Override protected void beforeTest() throws Exception { + super.beforeTest(); + + cpFiles = cpFiles(); + + filesArg = cpFiles.stream().map(Path::toFile).map(File::getAbsolutePath).collect(Collectors.joining(",")); + cleanPersistenceDir(); + lsnrLog = new ListeningTestLogger(log); + startGrids(GRID_CNT); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); - super.beforeTestsStarted(); + stopAllGrids(); } // TODO: add test that classpath can be created only with ADMIN_OPS privelege. @@ -64,46 +98,78 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT /** Tests --create command. */ @Test public void testCreate() throws Exception { - File emptyFile = File.createTempFile("empty", ".txt"); - - emptyFile.deleteOnExit(); - - Set cpFiles = files( - Path.of(getClass().getClassLoader().getResource(".").getPath() + "../"), - Path.of(getClass().getClassLoader().getResource(".").getPath() + "../../../core/target"), - emptyFile.toPath() - ); - injectTestSystemOut(); final TestCommandHandler hnd = newCommandHandler(createTestLogger()); String cpName = "mysuperapp_" + commandHandler; - String files = cpFiles.stream().map(Path::toFile).map(File::getAbsolutePath).collect(Collectors.joining(",")); - assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName, "--files", files)); + // Empty root doesn't affect ClassPath creation. + if (commandHandler.equals(JMX_CMD_HND)) + assertTrue(grid(0).context().pdsFolderResolver().fileTree().classPathRoot(cpName).mkdirs()); + + LogListener cpReadyLsnr = readyLogListener(GRID_CNT); + + lsnrLog.registerListener(cpReadyLsnr); + + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName, "--files", filesArg)); IgniteClassPath icp = classPath(cpName); assertEquals(READY, icp.state()); - Set cpFilesNames = fileNames(cpFiles); + checkFilesExists(cpName, -1); - checkFilesExists(cpFilesNames, cpName); + assertTrue(waitForCondition(cpReadyLsnr::check, 30_000)); try { // Attemp to create ClassPath with the same name must fail. - assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute(hnd, "--class-path", "create", "--name", cpName, "--files", files)); + assertEquals( + EXIT_CODE_UNEXPECTED_ERROR, + execute(hnd, "--class-path", "create", "--name", cpName, "--files", filesArg) + ); } finally { assertTrue(testOut.toString().contains("Fail to register ClassPath. Same ClassPath exists, already?")); assertEquals("Metastorage state must not change", icp, classPath(cpName)); - checkFilesExists(cpFilesNames, cpName); + checkFilesExists(cpName, -1); } } + /** Tests --create command. */ + @Test + public void testCreateWhenRootExists() throws Exception { + injectTestSystemOut(); + + String cpName = "mysuperapp_" + commandHandler; + + final TestCommandHandler hnd = newCommandHandler(createTestLogger()); + + File cpRoot = grid(FAIL_NODE_IDX).context().pdsFolderResolver().fileTree().classPathRoot(cpName); + + assertTrue(cpRoot.mkdirs()); + + File f = new File(cpRoot, ".must_fail_cp_creation"); + + assertTrue(f.createNewFile()); + + LogListener cpReadyLsnr = readyLogListener(GRID_CNT - 1); + + lsnrLog.registerListener(cpReadyLsnr); + + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName, "--files", filesArg)); + + IgniteClassPath icp = classPath(cpName); + + assertEquals(READY, icp.state()); + + checkFilesExists(cpName, FAIL_NODE_IDX); + + assertTrue(waitForCondition(cpReadyLsnr::check, 30_000)); + } + /** Tests --create command arguments format. */ @Test public void testEmptyFilesArgument() { @@ -135,11 +201,27 @@ public void testEmptyFilesArgument() { assertContains( log, - executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--name", "mysuperapp", "--files", ""), + executeCommand( + EXIT_CODE_INVALID_ARGUMENTS, + "--class-path", "create", "--name", "mysuperapp", "--files", "" + ), cliCommandHandler() ? "File name must not be empty" : "Argument --files required" ); } + /** */ + private Set cpFiles() throws IOException { + File emptyFile = File.createTempFile("empty", ".txt"); + + emptyFile.deleteOnExit(); + + return files( + Path.of(getClass().getClassLoader().getResource(".").getPath() + "../"), + Path.of(getClass().getClassLoader().getResource(".").getPath() + "../../../core/target"), + emptyFile.toPath() + ); + } + /** */ private Set fileNames(Set dirs) { return dirs.stream().map(Path::getFileName).map(Path::toString).collect(Collectors.toSet()); @@ -150,7 +232,8 @@ private Set files(Path... paths) { return Stream.of(paths).flatMap(path -> { try { return Files.isDirectory(path) - ? Files.list(path).filter(p -> p.getFileName().toString().endsWith("jar") || p.getFileName().toString().endsWith("txt")) + ? Files.list(path).filter(p -> p.getFileName().toString().endsWith("jar") + || p.getFileName().toString().endsWith("txt")) : Stream.of(path); } catch (IOException e) { @@ -160,11 +243,18 @@ private Set files(Path... paths) { } /** */ - private void checkFilesExists(Set cpFilesNames, String cpName) { + private void checkFilesExists(String cpName, int skip) { for (int i = 0; i < GRID_CNT; i++) { + if (skip == i) + continue; + NodeFileTree ft = grid(i).context().pdsFolderResolver().fileTree(); - assertEquals("Files must be deployed on each node", cpFilesNames, fileNames(files(ft.classPathRoot(cpName).toPath()))); + assertEquals( + "Files must be deployed on each node", + fileNames(cpFiles), + fileNames(files(ft.classPathRoot(cpName).toPath())) + ); } } @@ -172,4 +262,12 @@ private void checkFilesExists(Set cpFilesNames, String cpName) { private IgniteClassPath classPath(String cpName) throws IgniteCheckedException { return grid(0).context().distributedMetastorage().read(METASTORE_PREFIX + cpName); } + + /** */ + private static LogListener readyLogListener(int succeed) { + return LogListener + .matches("ClassPath is READY. " + succeed + " of " + GRID_CNT + " nodes has its files") + .times(1) + .build(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index a920af6daebbb..8f730bbc41eba 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -27,7 +27,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Predicate; -import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cluster.ClusterNode; @@ -45,7 +44,6 @@ import org.apache.ignite.internal.managers.communication.TransmissionPolicy; import org.apache.ignite.internal.managers.eventstorage.DiscoveryEventListener; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; -import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.internal.U; @@ -99,35 +97,24 @@ public ClassPathFilesTransmissionHandler(GridKernalContext ctx) { /** * Downloads {@link IgniteClassPath} files locally from the remote node specified by {@code rmtNodeId}. * @param rmtNodeId Remote node id. - * @param icpId ClassPath id. + * @param icp ClassPath. * @return Future for download operation. */ - IgniteInternalFuture downloadLocally(UUID rmtNodeId, UUID icpId) { - try { - IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); - - if (rmtNodeId.equals(ctx.localNodeId())) { - log.info("Skip download ClassPath files for upload node [name=" + icp.name() + ", id=" + icp.id() + ']'); - - return new GridFinishedFuture<>(); - } + IgniteInternalFuture downloadLocally(UUID rmtNodeId, IgniteClassPath icp) { + assert !rmtNodeId.equals(ctx.localNodeId()); - log.info("Start download ClassPath files [name=" + icp.name() + ", id=" + icp.id() + ']'); + log.info("Start download ClassPath files [name=" + icp.name() + ", id=" + icp.id() + ']'); - DownloadClassPathTask task = new DownloadClassPathTask(rmtNodeId, icp); - - try { - submit(task); - } - catch (Throwable t) { - task.res.onDone(t); - } + DownloadClassPathTask task = new DownloadClassPathTask(rmtNodeId, icp); - return task.res; + try { + submit(task); } - catch (Throwable e) { - return new GridFinishedFuture<>(e); + catch (Throwable t) { + task.res.onDone(t); } + + return task.res; } /** Starts handler. */ @@ -200,7 +187,6 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred @Override public void onMessage(UUID nodeId, Object msg0, byte plc) { try { if (msg0 instanceof DownloadClassPathMessage msg) { - IgniteClassPath icp = null; try { @@ -226,7 +212,11 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred } } catch (Throwable t) { - U.error(log, "Error processing classpath file request [request=" + msg + ", nodeId=" + nodeId + ']', t); + U.error( + log, + "Error processing classpath file request [request=" + msg + ", nodeId=" + nodeId + ']', + t + ); if (icp != null) { ctx.io().sendToCustomTopic(nodeId, @@ -238,8 +228,8 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred } } else if (msg0 instanceof DownloadClassPathFailureMessage msg) { - - String errMsg = "File download cancelled. ClassPath operation stopped on the remote node. Error: " + msg.err; + String errMsg = "File download cancelled. ClassPath operation stopped on the remote node. " + + "Error: " + msg.err; if (log.isDebugEnabled()) log.debug(errMsg); @@ -269,7 +259,8 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { int filesLeft = task.filesLeft.get(); if (filesLeft != 0) { - String msg = "onEnd invoked, but more files left: " + filesLeft + ", completing download process with an error"; + String msg = "onEnd invoked, but more files left: " + filesLeft + + ", completing download process with an error"; log.warning(msg); @@ -379,7 +370,7 @@ private void submit(DownloadClassPathTask next) { try { // submit can be invoked from discovery thread. // sendOrderedMessage can be blocking so invok it in separate thread to release discovery. - ctx.pools().getPeerClassLoadingExecutorService().submit(() -> { + ctx.pools().getSystemExecutorService().submit(() -> { try { ctx.cache().context().gridIO().sendOrderedMessage( rmtNode, @@ -390,17 +381,16 @@ private void submit(DownloadClassPathTask next) { true ); } - catch (IgniteCheckedException e) { - log.warning("Can't start download ClassPath files:", e); + catch (Throwable e) { + log.warning("Can't start download ClassPath files", e); next.res.onDone(new IgniteException("Can't download classpath files. " + "Remote node left the grid [rmtNodeId=" + next.rmtNodeId + ']')); - } }); } catch (RejectedExecutionException e) { - log.warning("Submit to P2P pool rejected", e); + log.warning("Submit to system pool rejected", e); next.res.onDone(e); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 9a007af59b413..ea78a0b286754 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -92,11 +92,20 @@ public UUID startCreation(String name, String[] files, long[] lengths) { for (String file : files) ensureFilename(file); - IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths, NEW); + IgniteClassPath icp; Boolean metastorageWritten; try { + icp = new IgniteClassPath( + UUID.randomUUID(), + ctx.pdsFolderResolver().resolveFolders().consistentId(), + name, + files, + lengths, + NEW + ); + metastorageWritten = casToMetastorageAsync(null, icp).get(); } catch (IgniteCheckedException e) { @@ -109,7 +118,7 @@ public UUID startCreation(String name, String[] files, long[] lengths) { File root = ctx.pdsFolderResolver().fileTree().classPathRoot(name); try { - NodeFileTree.mkdir(root, "Ignite Class Path root: " + name); + createRootAndCheckIsEmpty(root); } catch (Exception e) { try { @@ -297,4 +306,12 @@ private static void ensureKnownFilename(String name, IgniteClassPath icp) { if (F.indexOf(icp.files(), name) == -1) throw new IllegalArgumentException("Unknown lib [icp=" + icp.name() + ", unknown_lib=" + name + ']'); } + + /** */ + static void createRootAndCheckIsEmpty(File root) { + if (!root.exists()) + NodeFileTree.mkdir(root, "Ignite Class Path root"); + else if (!F.isEmpty(root.listFiles())) + throw new IgniteException("ClassPath root exists and not empty: " + root); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index 8620c06512aea..5b931066b6e2c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -24,11 +24,15 @@ import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.util.distributed.DistributedProcess; import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.lang.GridClosureException; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.createRootAndCheckIsEmpty; import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; @@ -56,8 +60,7 @@ public DeployToAllProcess(GridKernalContext ctx, ClassPathFilesTransmissionHandl this.ctx = ctx; this.icpFilesHnd = icpFilesHnd; - - deployToAllProc = new DistributedProcess<>( + this.deployToAllProc = new DistributedProcess<>( ctx, CLASSPATH_DEPLOY_TO_ALL, this::downloadLocally, @@ -103,12 +106,32 @@ public IgniteInternalFuture start(UUID icpId) { * @return Future which will be completed when a snapshot has been started. */ private IgniteInternalFuture downloadLocally(ClassPathDeployToAllRequest req) { - return icpFilesHnd.downloadLocally(req.uploadNodeId, req.icpId).chain(f -> { - if (f.error() != null) - throw new GridClosureException(f.error()); + try { + if (req.uploadNodeId.equals(ctx.localNodeId())) { + if (log.isDebugEnabled()) + log.debug("Skip download ClassPath files for upload node [id=" + req.icpId + ']'); + + return new GridFinishedFuture<>(); + } + + IgniteClassPath icp = fromMetastorage(req.icpId, NEW, ctx); + + createRootAndCheckIsEmpty(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); + + return icpFilesHnd.downloadLocally(req.uploadNodeId, icp).chain(f -> { + if (f.error() == null) + return new ClassPathDeployToAllResponse(icp.id()); + + NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); + + U.delete(ft.classPathRoot(icp.name())); - return new ClassPathDeployToAllResponse(req.icpId); - }); + throw new GridClosureException(f.error()); + }); + } + catch (Throwable e) { + return new GridFinishedFuture<>(e); + } } /** @@ -116,7 +139,11 @@ private IgniteInternalFuture downloadLocally(Class * @param res Results. * @param err Errors. */ - private void processDeployToAllResult(UUID id, Map res, Map err) { + private void processDeployToAllResult( + UUID id, + Map res, + Map err + ) { GridFutureAdapter fut = futs.remove(id); // Only upload node manage the process. @@ -135,8 +162,19 @@ private void processDeployToAllResult(UUID id, Map { - log.info("Deploy to all DONE!"); - + log.info("ClassPath is READY. " + res.size() + " of " + (res.size() + err.size()) + + " nodes has its files"); + + if (!F.isEmpty(res)) { + log.info("Node that successfully download ClassPath files:"); + res.forEach((nodeId, resp) -> log.info(" ^-- " + nodeId)); + } + + if (!F.isEmpty(err)) { + log.info("Node that fail to download ClassPath file (will retry on first usage):"); + err.forEach((nodeId, t) -> log.info(" ^-- " + nodeId + ": " + t.getMessage())); + } + boolean metastorageWritten = casFut.error() == null && casFut.result() != null && casFut.result(); Throwable t = metastorageWritten diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index 2ecb9a908c11a..6b973bd284029 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -33,6 +33,9 @@ public class IgniteClassPath implements Serializable { /** */ private UUID id; + /** */ + private Object uploadNodeConsistentId; + /** */ private String name; @@ -50,7 +53,14 @@ public class IgniteClassPath implements Serializable { * @param name User provided name. * @param files Files to include to classpath. */ - public IgniteClassPath(UUID id, String name, String[] files, long[] lengths, IgniteClassPathState state) { + public IgniteClassPath( + UUID id, + Object uploadNodeConsistentId, + String name, + String[] files, + long[] lengths, + IgniteClassPathState state + ) { this.id = id; this.name = name; this.files = files; @@ -62,7 +72,12 @@ public IgniteClassPath(UUID id, String name, String[] files, long[] lengths, Ign * @param state New state. */ IgniteClassPath newState(IgniteClassPathState state) { - return new IgniteClassPath(id, name, files, lengths, state); + return new IgniteClassPath(id, uploadNodeConsistentId, name, files, lengths, state); + } + + /** @return Consistent id of the node that starts ICP creation. */ + public Object uploadNodeConsistentId() { + return uploadNodeConsistentId; } /** */ @@ -98,12 +113,14 @@ public long[] lengths() { /** {@inheritDoc} */ @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; - IgniteClassPath that = (IgniteClassPath)o; - return Objects.equals(id, that.id) && Objects.equals(name, that.name) && Objects.deepEquals(files, that.files) && Objects.deepEquals(lengths, that.lengths) && state == that.state; + IgniteClassPath that = (IgniteClassPath) o; + return Objects.equals(id, that.id) && Objects.equals(uploadNodeConsistentId, that.uploadNodeConsistentId) + && Objects.equals(name, that.name) && Objects.deepEquals(files, that.files) + && Objects.deepEquals(lengths, that.lengths) && state == that.state; } /** {@inheritDoc} */ @Override public int hashCode() { - return Objects.hash(id, name, Arrays.hashCode(files), Arrays.hashCode(lengths), state); + return Objects.hash(id, uploadNodeConsistentId, name, Arrays.hashCode(files), Arrays.hashCode(lengths), state); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index 057823238d26a..cbab01f80dacd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -69,13 +69,25 @@ public class ClassPathCreateCommand implements NativeCommand k.equals(metastorageKey(cpName())), + (key, oldVal, newVal) -> { + for (String fileName : fileNames(cpFiles)) + new File(ctx.pdsFolderResolver().fileTree().classPathRoot(cpName()), fileName).mkdirs(); + } + ); + + LogListener cpReadyLsnr = null; + + if (!cliCommandHandler()) { + cpReadyLsnr = LogListener + .matches("Failed to copy ClassPath file locally, the ClassPath will be removed") + .times(1) + .build(); + + lsnrLog.registerListener(cpReadyLsnr); + } + + assertEquals( + EXIT_CODE_UNEXPECTED_ERROR, + execute(hnd, "--class-path", "create", "--name", cpName(), "--files", filesArg) + ); + + String out = testOut.toString(); + + if (cliCommandHandler()) + assertTrue(out.contains("Starting to upload files:")); + else + assertTrue(waitForCondition(cpReadyLsnr::check, 30_000)); + + assertTrue(out.contains("File exists")); + assertNull("Metastorage record must be removed", classPath()); + assertFalse( + "Classpath directory must be removed", + grid(0).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).exists() + ); + } + + /** */ @Test - public void testFailToUploadFile() throws Exception { - // TODO: imitate file upload error and check it will stop ClassPath creation. + public void testFailWhenMetastoreExists() throws Exception { + injectTestSystemOut(); + + final TestCommandHandler hnd = newCommandHandler(createTestLogger()); + + assertTrue(grid(0).context().distributedMetastorage().compareAndSet( + metastorageKey(cpName()), + null, + 1 + )); + + assertEquals( + EXIT_CODE_UNEXPECTED_ERROR, + execute(hnd, "--class-path", "create", "--name", cpName(), "--files", filesArg) + ); + + String out = testOut.toString(); + + assertTrue(out.contains("Fail to register ClassPath. Same ClassPath exists, already?")); + assertNull("Metastorage record must be removed", classPath()); + assertFalse( + "Classpath directory must be removed", + grid(0).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).exists() + ); } /** Tests --create command arguments format. */ @@ -213,6 +268,12 @@ public void testEmptyFilesArgument() { ), cliCommandHandler() ? "File name must not be empty" : "Argument --files required" ); + + assertContains( + log, + executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--files", "f.txt,f.txt"), + "Mandatory argument(s) missing: [--name]" + ); } /** */ @@ -235,11 +296,15 @@ private Set fileNames(Set dirs) { /** */ private Set files(Path... paths) { + Set uniqueNames = new HashSet<>(); + return Stream.of(paths).flatMap(path -> { try { return Files.isDirectory(path) - ? Files.list(path).filter(p -> p.getFileName().toString().endsWith("jar") - || p.getFileName().toString().endsWith("txt")) + ? Files.list(path) + .filter(p -> uniqueNames.add(p.getFileName())) + .filter(p -> p.getFileName().toString().endsWith("jar") + || p.getFileName().toString().endsWith("txt")) : Stream.of(path); } catch (IOException e) { @@ -265,8 +330,8 @@ private void checkFilesExists(String cpName, int skip) { } /** */ - private IgniteClassPath classPath(String cpName) throws IgniteCheckedException { - return grid(0).context().distributedMetastorage().read(METASTORE_PREFIX + cpName); + private IgniteClassPath classPath() throws IgniteCheckedException { + return grid(0).context().distributedMetastorage().read(ClassPathProcessor.metastorageKey(cpName())); } /** */ @@ -276,4 +341,9 @@ private static LogListener readyLogListener(int succeed) { .times(1) .build(); } + + /** */ + private String cpName() { + return "mysuperapp_" + commandHandler; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index ea78a0b286754..f8101504c14fa 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -47,7 +47,7 @@ */ public class ClassPathProcessor extends GridProcessorAdapter { /** Prefix for metastorage keys. */ - public static final String METASTORE_PREFIX = "icp."; + private static final String METASTORE_PREFIX = "icp."; /** Handles download requests for {@link IgniteClassPath} files. */ private final ClassPathFilesTransmissionHandler icpFilesHnd; @@ -94,8 +94,6 @@ public UUID startCreation(String name, String[] files, long[] lengths) { IgniteClassPath icp; - Boolean metastorageWritten; - try { icp = new IgniteClassPath( UUID.randomUUID(), @@ -105,33 +103,25 @@ public UUID startCreation(String name, String[] files, long[] lengths) { lengths, NEW ); - - metastorageWritten = casToMetastorageAsync(null, icp).get(); } catch (IgniteCheckedException e) { throw new IgniteException(e); } - if (metastorageWritten != null && !metastorageWritten) - throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); - File root = ctx.pdsFolderResolver().fileTree().classPathRoot(name); try { createRootAndCheckIsEmpty(root); + + Boolean metastorageWritten = casToMetastorageAsync(null, icp).get(); + + if (metastorageWritten != null && !metastorageWritten) + throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); } catch (Exception e) { - try { - if (metastorageWritten != null && metastorageWritten) - ctx.distributedMetastorage().remove(metastorageKey(icp)); - - U.delete(root); - } - catch (IgniteCheckedException ex) { - log.error("Cleanup after IgniteClassPath creation failed [key=" + metastorageKey(icp) + ", root=" + root + ']', e); - } + cleanup(icp); - throw e; + throw new IgniteException(e); } log.info("New classpath created [root = " + root + ", icp=" + icp + ']'); @@ -153,9 +143,9 @@ public synchronized void writeFilePartFromClient( long offset, byte[] batch ) { - try { - IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); + IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); + try { ensureKnownFilename(name, icp); File root = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); @@ -181,8 +171,11 @@ public synchronized void writeFilePartFromClient( raf.write(batch); } } - catch (IOException e) { - log.error("Upload file part error :", e); + catch (Throwable e) { + log.error("Failed to upload ClassPath file, the ClassPath will be removed " + + "[name=" + icp.name() + ", id=" + icpId + ", file=" + name + ']', e); + + cleanup(icp); throw new IgniteException(e); } @@ -197,25 +190,38 @@ public synchronized void writeFilePartFromClient( public void copyClassPathFileLocally(UUID icpId, Path file) throws IOException { IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); - String name = file.getFileName().toString(); + try { + String name = file.getFileName().toString(); + + ensureKnownFilename(name, icp); + + File root = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); - ensureKnownFilename(name, icp); + Path f = new File(root, name).toPath(); - File root = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); + if (Files.exists(f)) + throw new IgniteException("File exists: " + f); - Path f = new File(root, name).toPath(); + A.ensure(root.equals(f.toFile().getParentFile()), "filename"); - A.ensure(root.equals(f.toFile().getParentFile()), "filename"); + log.info("Copying new classpath file: " + f); - log.info("Copying new classpath file: " + f); + if (Files.exists(f) && Files.isSameFile(file, f)) { + log.info("Skip copying new classpath file, already there: " + f); - if (Files.exists(f) && Files.isSameFile(file, f)) { - log.info("Skip copying new classpath file, already there: " + f); + return; + } - return; + Files.copy(file, f); } + catch (Throwable e) { + log.error("Failed to copy ClassPath file locally, the ClassPath will be removed " + + "[name=" + icp.name() + ", id=" + icpId + ']', e); + + cleanup(icp); - Files.copy(file, f); + throw new IgniteException(e); + } } /** @@ -232,7 +238,7 @@ public IgniteInternalFuture deployToAll(@Nullable UUID icpId) { */ GridFutureAdapter casToMetastorageAsync(@Nullable IgniteClassPath prev, IgniteClassPath icp) { try { - String key = metastorageKey(icp); + String key = metastorageKey(icp.name()); if (log.isDebugEnabled()) log.debug("Writing new ClassPath state [new=" + icp + ", prev=" + prev + ']'); @@ -288,8 +294,8 @@ static IgniteClassPath fromMetastorage(UUID icpId, IgniteClassPathState expState } /** */ - private static String metastorageKey(IgniteClassPath icp) { - return METASTORE_PREFIX + icp.name(); + public static String metastorageKey(String name) { + return METASTORE_PREFIX + name; } /** */ @@ -314,4 +320,20 @@ static void createRootAndCheckIsEmpty(File root) { else if (!F.isEmpty(root.listFiles())) throw new IgniteException("ClassPath root exists and not empty: " + root); } + + /** + * Removes the classpath metastorage record and deletes its local files. + * + * @param icp ClassPath to clean up. + */ + private void cleanup(IgniteClassPath icp) { + try { + ctx.distributedMetastorage().remove(metastorageKey(icp.name())); + } + catch (IgniteCheckedException e) { + log.error("Failed to remove ClassPath metastorage record [name=" + icp.name() + ']', e); + } + + U.delete(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index cbab01f80dacd..acf11aff45318 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -22,7 +22,9 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.UUID; import java.util.function.Consumer; import org.apache.ignite.Ignite; @@ -120,6 +122,7 @@ private static void uploadFiles( /** */ private static List prepareFiles(ClassPathCreateCommandArg arg) throws IOException { List files = new ArrayList<>(arg.files.length); + Set names = new HashSet<>(); arg.lengths = new long[arg.files.length]; @@ -131,6 +134,9 @@ private static List prepareFiles(ClassPathCreateCommandArg arg) throws IOE if (!Files.exists(f) || Files.isDirectory(f)) throw new IllegalArgumentException("File not exists or directory: " + f); + if (!names.add(f.getFileName().toString())) + throw new IllegalArgumentException("Duplicate file name: " + f.getFileName()); + files.add(f); arg.lengths[i] = Files.size(f); From de1be84df310c10f1851e99f1a6c8a8df6ca85f0 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 19 Jun 2026 18:03:52 +0300 Subject: [PATCH 25/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 65 +----- .../ClassPathFilesTransmissionHandler.java | 52 +++-- .../classpath/ClassPathProcessor.java | 81 ++++--- .../classpath/DeployToAllProcess.java | 131 +++++++++--- .../classpath/DownloadClassPathMessage.java | 6 +- .../internal/classpath/IgniteClassPath.java | 18 +- .../classpath/ClassPathCreateCommand.java | 2 +- .../ClassPathCreationFailoverTest.java | 199 ++++++++++++++++++ ...va => ClassPathMailicuosRequestsTest.java} | 2 +- .../classpath/ClassPathTestUtils.java | 92 ++++++++ .../IgniteSpiDeploymentSelfTestSuite.java | 4 +- 11 files changed, 487 insertions(+), 165 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java rename modules/core/src/test/java/org/apache/ignite/internal/classpath/{ClassPathSelfTest.java => ClassPathMailicuosRequestsTest.java} (97%) create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index cf90ccbbca0d1..1e8e0b1a4833f 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -19,23 +19,20 @@ import java.io.File; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashSet; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.classpath.ClassPathProcessor; +import org.apache.ignite.internal.classpath.ClassPathTestUtils; import org.apache.ignite.internal.classpath.IgniteClassPath; -import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.testframework.ListeningTestLogger; import org.apache.ignite.testframework.LogListener; import org.junit.Test; import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; +import static org.apache.ignite.internal.classpath.ClassPathTestUtils.fileNames; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_INVALID_ARGUMENTS; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; @@ -71,9 +68,9 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT @Override protected void beforeTest() throws Exception { super.beforeTest(); - cpFiles = cpFiles(); + cpFiles = ClassPathTestUtils.files(); - filesArg = cpFiles.stream().map(Path::toFile).map(File::getAbsolutePath).collect(Collectors.joining(",")); + filesArg = String.join(",", ClassPathTestUtils.fileArg(cpFiles)); cleanPersistenceDir(); @@ -92,12 +89,9 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT // TODO: add test that classpath can be created only with ADMIN_OPS privelege. // TODO: add CRC or other check of file integrity. // TODO add in production code checks of files integriy. Perform file integrity check on startup. + // Support pretty print for command. - // Test for different failure types: node fail, file write fail, etc. - // Node fail: upload node vs not upload node. - // Check cleanup. - // Concurrent creation of CP with the same name. - // Check when files contains duplicate names. + // TODO: reboot of in-memory cluster erase distributed metastorage state. ??? /** Tests --create command. */ @Test @@ -277,55 +271,12 @@ public void testEmptyFilesArgument() { } /** */ - private Set cpFiles() throws IOException { - File emptyFile = File.createTempFile("empty", ".txt"); - - emptyFile.deleteOnExit(); - - return files( - Path.of(getClass().getClassLoader().getResource(".").getPath() + "../"), - Path.of(getClass().getClassLoader().getResource(".").getPath() + "../../../core/target"), - emptyFile.toPath() - ); - } - - /** */ - private Set fileNames(Set dirs) { - return dirs.stream().map(Path::getFileName).map(Path::toString).collect(Collectors.toSet()); - } - - /** */ - private Set files(Path... paths) { - Set uniqueNames = new HashSet<>(); - - return Stream.of(paths).flatMap(path -> { - try { - return Files.isDirectory(path) - ? Files.list(path) - .filter(p -> uniqueNames.add(p.getFileName())) - .filter(p -> p.getFileName().toString().endsWith("jar") - || p.getFileName().toString().endsWith("txt")) - : Stream.of(path); - } - catch (IOException e) { - throw new RuntimeException(e); - } - }).map(Path::toAbsolutePath).collect(Collectors.toSet()); - } - - /** */ - private void checkFilesExists(String cpName, int skip) { + private void checkFilesExists(String cpName, int skip) throws IOException { for (int i = 0; i < GRID_CNT; i++) { if (skip == i) continue; - NodeFileTree ft = grid(i).context().pdsFolderResolver().fileTree(); - - assertEquals( - "Files must be deployed on each node", - fileNames(cpFiles), - fileNames(files(ft.classPathRoot(cpName).toPath())) - ); + ClassPathTestUtils.checkFilesExists(grid(i), cpName, cpFiles); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index 8f730bbc41eba..ede671bb18ff7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Predicate; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cluster.ClusterNode; @@ -150,7 +151,7 @@ void stop() { */ void onNodeLeft(UUID nodeId) { cancelAll( - new ClusterTopologyCheckedException("The node from which a snapshot has been requested left the grid"), + new ClusterTopologyCheckedException("The node from which ClassPath files has been requested left the grid"), r -> r.rmtNodeId.equals(nodeId) ); } @@ -196,10 +197,10 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred File root = ft.classPathRoot(icp.name()); + // TODO: make async. if (!root.exists()) throw new IgniteException("Classpath root not exists: " + root); - // TODO: make async execution. try (TransmissionSender sndr = ctx.io().openTransmissionSender(nodeId, FILES_TOPIC)) { for (String name : icp.files()) { File f = new File(root, name); @@ -207,28 +208,36 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred if (!f.exists()) throw new IgniteException("Classpath file not exists: " + f); + if (stopping) + throw new IgniteException("Node stopping"); + sndr.send(f, Map.of(ICP_ID_PARAM, icp.id(), NAME_PARAM, name), TransmissionPolicy.FILE); + + log.info("ClassPath file sent to the node " + + "[icp=" + icp.name() + ", file=" + name + ", rmtNode=" + nodeId + ']'); } } } catch (Throwable t) { - U.error( - log, - "Error processing classpath file request [request=" + msg + ", nodeId=" + nodeId + ']', - t - ); + U.error(log, "Error processing ClassPath file request [request=" + msg + ", nodeId=" + nodeId + ']', t); if (icp != null) { - ctx.io().sendToCustomTopic(nodeId, - FILES_TOPIC, - new DownloadClassPathFailureMessage(icp, t.getMessage()), - SYSTEM_POOL - ); + try { + ctx.io().sendToCustomTopic( + nodeId, + FILES_TOPIC, + new DownloadClassPathFailureMessage(icp, t.getMessage()), + SYSTEM_POOL + ); + } + catch (IgniteCheckedException e) { + log.warning("Error notifying node of send error", e); + } } } } else if (msg0 instanceof DownloadClassPathFailureMessage msg) { - String errMsg = "File download cancelled. ClassPath operation stopped on the remote node. " + + String errMsg = "File download cancelled. ClassPath operation stopped on the remote node. locNode=" + ctx.localNodeId() + ". " + "Error: " + msg.err; if (log.isDebugEnabled()) @@ -259,17 +268,10 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { int filesLeft = task.filesLeft.get(); if (filesLeft != 0) { - String msg = "onEnd invoked, but more files left: " + filesLeft + - ", completing download process with an error"; - - log.warning(msg); - - task.res.onDone(new IllegalStateException(msg)); + task.res.onDone(new IllegalStateException("onEnd invoked, but more files left: " + filesLeft + + ", completing download process with an error")); } - if (log.isInfoEnabled()) - log.info("Classpath files from remote node has been fully received [icp=" + task.icp.name() + ']'); - task.res.onDone((Void)null); } @@ -375,23 +377,19 @@ private void submit(DownloadClassPathTask next) { ctx.cache().context().gridIO().sendOrderedMessage( rmtNode, FILES_TOPIC, - new DownloadClassPathMessage(next.icp), + new DownloadClassPathMessage(next.icp, ctx.localNodeId()), SYSTEM_POOL, Long.MAX_VALUE, true ); } catch (Throwable e) { - log.warning("Can't start download ClassPath files", e); - next.res.onDone(new IgniteException("Can't download classpath files. " + "Remote node left the grid [rmtNodeId=" + next.rmtNodeId + ']')); } }); } catch (RejectedExecutionException e) { - log.warning("Submit to system pool rejected", e); - next.res.onDone(e); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index f8101504c14fa..3a6376536695a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -18,17 +18,18 @@ package org.apache.ignite.internal.classpath; import java.io.File; -import java.io.IOException; import java.io.RandomAccessFile; import java.nio.file.Files; import java.nio.file.Path; import java.util.UUID; +import java.util.concurrent.RejectedExecutionException; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; @@ -92,21 +93,7 @@ public UUID startCreation(String name, String[] files, long[] lengths) { for (String file : files) ensureFilename(file); - IgniteClassPath icp; - - try { - icp = new IgniteClassPath( - UUID.randomUUID(), - ctx.pdsFolderResolver().resolveFolders().consistentId(), - name, - files, - lengths, - NEW - ); - } - catch (IgniteCheckedException e) { - throw new IgniteException(e); - } + IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths, NEW); File root = ctx.pdsFolderResolver().fileTree().classPathRoot(name); @@ -119,12 +106,12 @@ public UUID startCreation(String name, String[] files, long[] lengths) { throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); } catch (Exception e) { - cleanup(icp); + cleanup(icp, false); throw new IgniteException(e); } - log.info("New classpath created [root = " + root + ", icp=" + icp + ']'); + log.info("New IgniteCclasspath created [root = " + root + ", icp=" + icp + ']'); return icp.id(); } @@ -175,7 +162,7 @@ public synchronized void writeFilePartFromClient( log.error("Failed to upload ClassPath file, the ClassPath will be removed " + "[name=" + icp.name() + ", id=" + icpId + ", file=" + name + ']', e); - cleanup(icp); + cleanup(icp, false); throw new IgniteException(e); } @@ -187,7 +174,7 @@ public synchronized void writeFilePartFromClient( * @param icpId ClassPath id. * @param file File to copy. */ - public void copyClassPathFileLocally(UUID icpId, Path file) throws IOException { + public void copyClassPathFileLocally(UUID icpId, Path file) { IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); try { @@ -218,7 +205,7 @@ public void copyClassPathFileLocally(UUID icpId, Path file) throws IOException { log.error("Failed to copy ClassPath file locally, the ClassPath will be removed " + "[name=" + icp.name() + ", id=" + icpId + ']', e); - cleanup(icp); + cleanup(icp, false); throw new IgniteException(e); } @@ -271,7 +258,7 @@ GridFutureAdapter casToMetastorageAsync(@Nullable IgniteClassPath prev, * @param ctx Kernal context. * @return Class path. */ - static IgniteClassPath fromMetastorage(UUID icpId, IgniteClassPathState expState, GridKernalContext ctx) { + static IgniteClassPath fromMetastorage(UUID icpId, @Nullable IgniteClassPathState expState, GridKernalContext ctx) { try { IgniteClassPath[] icp = new IgniteClassPath[1]; @@ -283,7 +270,7 @@ static IgniteClassPath fromMetastorage(UUID icpId, IgniteClassPathState expState if (icp[0] == null) throw new IgniteException("ClassPath not found: " + icpId); - if (icp[0].state() != expState) + if (expState != null && icp[0].state() != expState) throw new IgniteException("ClassPath in wrong state [expected=" + expState + ", status=" + icp[0].state() + ']'); return icp[0]; @@ -322,16 +309,54 @@ else if (!F.isEmpty(root.listFiles())) } /** - * Removes the classpath metastorage record and deletes its local files. + * Asynchronously removes the classpath metastorage record and deletes its local files. * * @param icp ClassPath to clean up. + * @param loc If {@code true} then delete local files, only. Don't remove distributed key. */ - private void cleanup(IgniteClassPath icp) { + IgniteInternalFuture cleanupAsync(IgniteClassPath icp, boolean loc) { try { - ctx.distributedMetastorage().remove(metastorageKey(icp.name())); + GridFutureAdapter res = new GridFutureAdapter<>(); + + ctx.pools().getSystemExecutorService().submit(() -> { + try { + cleanup(icp, loc); + + res.onDone((Void)null); + } + catch (Throwable e) { + res.onDone(e); + } + }); + + if (log.isDebugEnabled()) { + res.listen(f -> { + if (log.isDebugEnabled()) + log.debug("Async cleanup done. " + (res.error() == null ? "OK" : "FAIL")); + }); + } + + return res; } - catch (IgniteCheckedException e) { - log.error("Failed to remove ClassPath metastorage record [name=" + icp.name() + ']', e); + catch (RejectedExecutionException e) { + return new GridFinishedFuture<>(e); + } + } + + /** + * Removes the classpath metastorage record and deletes its local files. + * + * @param icp ClassPath to clean up. + * @param loc If {@code true} then delete local files, only. Don't remove distributed key. + */ + void cleanup(IgniteClassPath icp, boolean loc) { + if (!loc) { + try { + ctx.distributedMetastorage().remove(metastorageKey(icp.name())); + } + catch (IgniteCheckedException e) { + log.error("Failed to remove ClassPath metastorage record [name=" + icp.name() + ']', e); + } } U.delete(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index 5b931066b6e2c..ebe472db9b942 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -35,6 +35,7 @@ import static org.apache.ignite.internal.classpath.ClassPathProcessor.createRootAndCheckIsEmpty; import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; /** Distributed process to spread {@link IgniteClassPath} files across cluster. */ @@ -85,8 +86,11 @@ public IgniteInternalFuture start(UUID icpId) { added = futs.putIfAbsent(icpId, deployRes) == null; - if (!added) - return new GridFinishedFuture<>(new IllegalStateException("Deploy to all process started, already: " + icp.name())); + if (!added) { + return new GridFinishedFuture<>( + new IllegalStateException("Deploy to all process started, already: " + icp.name()) + ); + } deployToAllProc.start(icpId, req); } @@ -118,7 +122,26 @@ private IgniteInternalFuture downloadLocally(Class createRootAndCheckIsEmpty(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); - return icpFilesHnd.downloadLocally(req.uploadNodeId, icp).chain(f -> { + IgniteInternalFuture res = icpFilesHnd.downloadLocally(req.uploadNodeId, icp); + + res.listen(f -> { + if (f.error() == null) { + if (log.isInfoEnabled()) + log.info("Classpath files from remote node has been fully received [icp=" + icp.name() + ']'); + + return; + } + + // Cleanup local files. + ctx.classPath().cleanupAsync(icp, true); + + log.warning( + "Failed to download ClassPath files from remote node [icp=" + icp.name() + "]", + f.error() + ); + }); + + return res.chain(f -> { if (f.error() == null) return new ClassPathDeployToAllResponse(icp.id()); @@ -144,53 +167,93 @@ private void processDeployToAllResult( Map res, Map err ) { - GridFutureAdapter fut = futs.remove(id); - - // Only upload node manage the process. - if (fut == null) { - if (log.isDebugEnabled()) - log.debug("Unknown distribute process [id=" + id + ']'); - - return; - } + // Not null only on node that will answer to the user. + GridFutureAdapter depProcResFut = futs.remove(id); try { - IgniteClassPath icp = fromMetastorage(id, NEW, ctx); + IgniteClassPath icp; - if (log.isDebugEnabled()) - log.debug("Starting CAS to metastorage: " + icp); + try { + icp = fromMetastorage(id, null, ctx); - // Perform CAS async to release discovery thread and let CAS proceed. - ctx.classPath().casToMetastorageAsync(icp, icp.newState(IgniteClassPathState.READY)).listen(casFut -> { - log.info("ClassPath is READY. " + res.size() + " of " + (res.size() + err.size()) + - " nodes has its files"); + if (icp.state() == READY) { + if (depProcResFut != null) + depProcResFut.onDone("OK", null); - if (!F.isEmpty(res)) { - log.info("Node that successfully download ClassPath files:"); - res.forEach((nodeId, resp) -> log.info(" ^-- " + nodeId)); + return; } + } + catch (IgniteException e) { + if (depProcResFut != null) + depProcResFut.onDone(e); + + return; + } + + if (depProcResFut == null && !U.isLocalNodeCoordinator(ctx.discovery())) { + if (log.isDebugEnabled()) + log.debug("Skip IgnitClassPath metastorage update. Not coordinator and not start node [icp=" + icp + ']'); + + return; + } + + if (res.isEmpty()) { + String msg = "All nodes fail to deploy ClassPath. Will be removed. Retry creation [icp=" + icp.name() + ']'; + + log.warning(msg); - if (!F.isEmpty(err)) { - log.info("Node that fail to download ClassPath file (will retry on first usage):"); - err.forEach((nodeId, t) -> log.info(" ^-- " + nodeId + ": " + t.getMessage())); + try { + ctx.classPath().cleanupAsync(icp, false); } + finally { + if (depProcResFut != null) + depProcResFut.onDone(new IgniteException(msg)); + } + + return; + } + // Perform CAS async to release discovery thread and let CAS proceed. + // Start node or coordinator will succeed. + ctx.classPath().casToMetastorageAsync(icp, icp.newState(IgniteClassPathState.READY)).listen(casFut -> { boolean metastorageWritten = casFut.error() == null && casFut.result() != null && casFut.result(); + if (!metastorageWritten && casFut.error() == null) + metastorageWritten = fromMetastorage(icp.id(), READY, ctx) != null; + + if (metastorageWritten) { + if (!F.isEmpty(res)) { + log.info("Nodes that successfully download ClassPath files:"); + + res.forEach((nodeId, resp) -> log.info(" ^-- " + nodeId)); + } + + if (!F.isEmpty(err)) { + log.info("Nodes that fail to download ClassPath file (will retry on first usage):"); + + err.forEach((nodeId, t) -> log.info(" ^-- " + nodeId + ": " + t.getMessage())); + } + + log.info("ClassPath is READY. " + res.size() + " of " + (res.size() + err.size()) + " nodes has its files"); + } + Throwable t = metastorageWritten - ? null - : casFut.error() != null - ? casFut.error() - : new IgniteException("Fail to change ClassPath state. Concurrent removal?"); - - if (!fut.onDone(metastorageWritten ? "OK" : null, t)) { - log.warning("Distribute process in wrong state " + - "[canceled=" + fut.isCancelled() + ", failed=" + fut.isFailed() + ", done=" + fut.isDone() + ']'); + ? null + : casFut.error() != null + ? casFut.error() + : new IgniteException("Fail to change ClassPath state. Concurrent removal?"); + + if (depProcResFut != null && !depProcResFut.onDone(metastorageWritten ? "OK" : null, t)) { + log.warning("Distribute process in wrong state [" + + "canceled=" + depProcResFut.isCancelled() + + ", failed=" + depProcResFut.isFailed() + + ", done=" + depProcResFut.isDone() + ']'); } }); } catch (Exception e) { - fut.onDone(e); + if (depProcResFut != null) + depProcResFut.onDone(e); } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java index 9a3f17ae99f92..3ad40ed442400 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java @@ -38,13 +38,17 @@ public class DownloadClassPathMessage implements Message { @Order(0) UUID icpId; + @Order(1) + UUID node; + /** */ public DownloadClassPathMessage() { // No-op. } /** */ - public DownloadClassPathMessage(IgniteClassPath icp) { + public DownloadClassPathMessage(IgniteClassPath icp, UUID node) { this.icpId = icp.id(); + this.node = node; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index 6b973bd284029..c141de7569e64 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -33,9 +33,6 @@ public class IgniteClassPath implements Serializable { /** */ private UUID id; - /** */ - private Object uploadNodeConsistentId; - /** */ private String name; @@ -55,7 +52,6 @@ public class IgniteClassPath implements Serializable { */ public IgniteClassPath( UUID id, - Object uploadNodeConsistentId, String name, String[] files, long[] lengths, @@ -72,12 +68,7 @@ public IgniteClassPath( * @param state New state. */ IgniteClassPath newState(IgniteClassPathState state) { - return new IgniteClassPath(id, uploadNodeConsistentId, name, files, lengths, state); - } - - /** @return Consistent id of the node that starts ICP creation. */ - public Object uploadNodeConsistentId() { - return uploadNodeConsistentId; + return new IgniteClassPath(id, name, files, lengths, state); } /** */ @@ -113,14 +104,13 @@ public long[] lengths() { /** {@inheritDoc} */ @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; - IgniteClassPath that = (IgniteClassPath) o; - return Objects.equals(id, that.id) && Objects.equals(uploadNodeConsistentId, that.uploadNodeConsistentId) - && Objects.equals(name, that.name) && Objects.deepEquals(files, that.files) + IgniteClassPath that = (IgniteClassPath)o; + return Objects.equals(id, that.id) && Objects.equals(name, that.name) && Objects.deepEquals(files, that.files) && Objects.deepEquals(lengths, that.lengths) && state == that.state; } /** {@inheritDoc} */ @Override public int hashCode() { - return Objects.hash(id, uploadNodeConsistentId, name, Arrays.hashCode(files), Arrays.hashCode(lengths), state); + return Objects.hash(id, name, Arrays.hashCode(files), Arrays.hashCode(lengths), state); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index acf11aff45318..d618509362f9a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -79,7 +79,7 @@ public class ClassPathCreateCommand implements NativeCommand new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)), + ComputeTaskCancelledException.class, + "Task cancelled due to stopping of the grid" + ); + + assertTrue(waitForCondition(uploadNodeMsg::check, 10_000)); + assertTrue(failedNode.context().isStopping()); + + stopGrid(0); + + assertEquals(1, Ignition.allGrids().size()); + + assertTrue(waitForCondition(() -> { + ClassPathFilesTransmissionHandler icpFilesHnd + = getFieldValue(grid1.context().classPath(), "icpFilesHnd"); + + Object t = getFieldValue(icpFilesHnd, "active"); + + if (t == null) + return true; + + GridFutureAdapter res = getFieldValue(t, "res"); + + return res.isDone(); + }, 10_000)); + + assertTrue(waitForCondition(failMsg::check, 10_000)); + assertTrue(waitForCondition(rmvMsg::check, 10_000)); + assertTrue(waitForCondition( + () -> !grid1.context().pdsFolderResolver().fileTree().classPathRoot("testcp").exists(), + 10_000 + )); + assertNull(grid1.context().distributedMetastorage().read(metastorageKey("testcp"))); + } + finally { + failedNode = null; + } + } + + /** */ + @Test + public void testDownloadNodeFailDuringDeployment() throws Exception { + startGrids(3); + + try { + failedNode = grid(1); + sendMessage = true; + + awaitPartitionMapExchange(); + + Set cpFiles = ClassPathTestUtils.files(); + + LogListener createdMsg = newClassPathListener(); + LogListener oneNodeFailMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); + LogListener readyMsg = logListener("ClassPath is READY. 2 of 3 nodes has its files"); + + lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg, readyMsg); + + ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); + + arg.name("testcp"); + arg.files(ClassPathTestUtils.fileArg(cpFiles)); + + // ClassPath must be created on `failedNode`. Because, it first in cluster. + new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)); + + assertTrue(waitForCondition(createdMsg::check, 10_000)); + assertTrue(failedNode.context().isStopping()); + + stopGrid(1); + + assertEquals(2, Ignition.allGrids().size()); + + assertTrue(waitForCondition(oneNodeFailMsg::check, 10_000)); + assertTrue(waitForCondition(readyMsg::check, 10_000)); + + ClassPathTestUtils.checkFilesExists(grid(0), "testcp", cpFiles); + ClassPathTestUtils.checkFilesExists(grid(2), "testcp", cpFiles); + } + finally { + failedNode = null; + sendMessage = false; + } + } + + /** */ + protected static class BlockingTcpCommunicationSpi extends TcpCommunicationSpi { + /** {@inheritDoc} */ + @Override public void sendMessage(ClusterNode node, Message msg, IgniteInClosure ackC) { + if (msg instanceof GridIoMessage + && ((GridIoMessage)msg).message() instanceof DownloadClassPathMessage + && !failedNode.localNode().id().equals(ignite.cluster().localNode().id()) + ) { + GridTestUtils.runAsync(() -> failedNode.close()); + + if (!sendMessage) + return; + } + + super.sendMessage(node, msg, ackC); + } + } + + private LogListener newClassPathListener() { + return logListener("New ClassPath created [uploadNode=" + grid(0).localNode().id()); + } + + /** */ + private static LogListener logListener(String msg) { + return LogListener.matches(msg).times(1).build(); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java similarity index 97% rename from modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java rename to modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java index 2bdb3158759a2..f66f7ae810537 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java @@ -25,7 +25,7 @@ import static org.apache.ignite.testframework.GridTestUtils.assertThrows; /** */ -public class ClassPathSelfTest extends GridCommonAbstractTest { +public class ClassPathMailicuosRequestsTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override protected void beforeTestsStarted() throws Exception { startGrid(0); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java new file mode 100644 index 0000000000000..22eefa1dac405 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java @@ -0,0 +1,92 @@ +package org.apache.ignite.internal.classpath; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.internal.util.typedef.internal.U; + +import static org.junit.Assert.assertEquals; + +/** */ +public class ClassPathTestUtils { + /** */ + public static Set files() throws IOException { + return Stream.of( + file(0), file(1025), file(U.MB), file(2 * U.MB), file(2 * U.MB + 42)).collect(Collectors.toSet() + ); + } + + /** */ + public static Set fileNames(Set dirs) { + return dirs.stream().map(Path::getFileName).map(Path::toString).collect(Collectors.toSet()); + } + + /** */ + public static String[] fileArg(Set cpFiles) { + String[] files = new String[cpFiles.size()]; + + int i = 0; + + for (Path p : cpFiles) + files[i++] = p.toAbsolutePath().toString(); + + return files; + } + + /** */ + private static Path file(long size) throws IOException { + File f = File.createTempFile(size + "_bytes", ".temp"); + + f.deleteOnExit(); + + try (OutputStream os = Files.newOutputStream(f.toPath())) { + long written = 0; + + byte[] batch = new byte[4 * (int)U.KB]; + + while (written < size) { + ThreadLocalRandom.current().nextBytes(batch); + + int toWrite = (int)Math.min(size - written, batch.length); + + os.write(batch, 0, toWrite); + + written += toWrite; + } + } + + assert f.length() == size; + + return f.toPath(); + } + + /** */ + public static void checkFilesExists(IgniteEx node, String cpName, Set cpFiles) throws IOException { + NodeFileTree ft = node.context().pdsFolderResolver().fileTree(); + + Set nodeCpFiles = Files.list(ft.classPathRoot(cpName).toPath()).collect(Collectors.toSet()); + + assertEquals( + "Files must be deployed on each node", + fileNames(cpFiles), + fileNames(nodeCpFiles) + ); + + for (Path cpFile : cpFiles) { + Path nodeFile = nodeCpFiles.stream() + .filter(p -> Objects.equals(p.getFileName().toString(), cpFile.getFileName().toString())) + .findFirst().get(); + + assertEquals(Files.size(cpFile), Files.size(nodeFile)); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java index 5cf0ed620aa95..df18c413eea83 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java @@ -17,7 +17,7 @@ package org.apache.ignite.testsuites; -import org.apache.ignite.internal.classpath.ClassPathSelfTest; +import org.apache.ignite.internal.classpath.ClassPathMailicuosRequestsTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiSelfTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiStartStopSelfTest; import org.junit.runner.RunWith; @@ -30,7 +30,7 @@ @Suite.SuiteClasses({ GridLocalDeploymentSpiSelfTest.class, GridLocalDeploymentSpiStartStopSelfTest.class, - ClassPathSelfTest.class + ClassPathMailicuosRequestsTest.class }) public class IgniteSpiDeploymentSelfTestSuite { } From d28f441d3c3acea0c85925b22c4d23c3ccdbb8f7 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 19 Jun 2026 18:13:53 +0300 Subject: [PATCH 26/54] IGNITE-28207 Classpath creation process --- .../classpath/ClassPathFilesTransmissionHandler.java | 5 ++--- .../internal/classpath/DownloadClassPathMessage.java | 6 +----- .../classpath/ClassPathCreationFailoverTest.java | 11 ++++++----- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index ede671bb18ff7..207ae8c265da5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -237,8 +237,7 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred } } else if (msg0 instanceof DownloadClassPathFailureMessage msg) { - String errMsg = "File download cancelled. ClassPath operation stopped on the remote node. locNode=" + ctx.localNodeId() + ". " + - "Error: " + msg.err; + String errMsg = "File download cancelled. ClassPath operation stopped on the remote node. Error: " + msg.err; if (log.isDebugEnabled()) log.debug(errMsg); @@ -377,7 +376,7 @@ private void submit(DownloadClassPathTask next) { ctx.cache().context().gridIO().sendOrderedMessage( rmtNode, FILES_TOPIC, - new DownloadClassPathMessage(next.icp, ctx.localNodeId()), + new DownloadClassPathMessage(next.icp), SYSTEM_POOL, Long.MAX_VALUE, true diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java index 3ad40ed442400..9a3f17ae99f92 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathMessage.java @@ -38,17 +38,13 @@ public class DownloadClassPathMessage implements Message { @Order(0) UUID icpId; - @Order(1) - UUID node; - /** */ public DownloadClassPathMessage() { // No-op. } /** */ - public DownloadClassPathMessage(IgniteClassPath icp, UUID node) { + public DownloadClassPathMessage(IgniteClassPath icp) { this.icpId = icp.id(); - this.node = node; } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index 1ae8f7e2309ee..970c5b4e44abb 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -70,12 +70,12 @@ public void testUploadNodeFailDuringDeployment() throws Exception { Set cpFiles = ClassPathTestUtils.files(); - LogListener uploadNodeMsg = newClassPathListener(); - LogListener failMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); + LogListener createdMsg = newClassPathListener(); + LogListener uploadNodeFailedMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); LogListener rmvMsg = logListener("All nodes fail to deploy ClassPath. Will be removed. Retry creation [icp=testcp]"); - lsnrLog.registerAllListeners(uploadNodeMsg, failMsg, rmvMsg); + lsnrLog.registerAllListeners(createdMsg, uploadNodeFailedMsg, rmvMsg); ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); @@ -90,7 +90,7 @@ public void testUploadNodeFailDuringDeployment() throws Exception { "Task cancelled due to stopping of the grid" ); - assertTrue(waitForCondition(uploadNodeMsg::check, 10_000)); + assertTrue(waitForCondition(createdMsg::check, 10_000)); assertTrue(failedNode.context().isStopping()); stopGrid(0); @@ -111,7 +111,7 @@ public void testUploadNodeFailDuringDeployment() throws Exception { return res.isDone(); }, 10_000)); - assertTrue(waitForCondition(failMsg::check, 10_000)); + assertTrue(waitForCondition(uploadNodeFailedMsg::check, 10_000)); assertTrue(waitForCondition(rmvMsg::check, 10_000)); assertTrue(waitForCondition( () -> !grid1.context().pdsFolderResolver().fileTree().classPathRoot("testcp").exists(), @@ -188,6 +188,7 @@ protected static class BlockingTcpCommunicationSpi extends TcpCommunicationSpi { } } + /** */ private LogListener newClassPathListener() { return logListener("New ClassPath created [uploadNode=" + grid(0).localNode().id()); } From 8d77e1983681bb3d9aeb9b6532d0d898a200b1e6 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 19 Jun 2026 18:20:23 +0300 Subject: [PATCH 27/54] IGNITE-28207 Classpath creation process --- .../ClassPathCreationFailoverTest.java | 17 +++++++++++++++++ .../internal/classpath/ClassPathTestUtils.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index 970c5b4e44abb..9950619b8292e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.ignite.internal.classpath; import java.nio.file.Path; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java index 22eefa1dac405..db1640615f9de 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.ignite.internal.classpath; import java.io.File; From 9fead796b937dc6eddbf5aa7e2a6b86a379bd7e2 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 19 Jun 2026 19:13:28 +0300 Subject: [PATCH 28/54] IGNITE-28207 Classpath creation process --- .../ClassPathFilesTransmissionHandler.java | 7 +++-- .../classpath/ClassPathProcessor.java | 31 ++++++++++--------- .../classpath/DeployToAllProcess.java | 24 ++++++++++++-- .../ClassPathCreationFailoverTest.java | 1 + .../IgniteSpiDeploymentSelfTestSuite.java | 4 ++- 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index 207ae8c265da5..3af3fa678bc1a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -27,7 +27,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Predicate; -import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cluster.ClusterNode; @@ -218,7 +217,7 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred } } } - catch (Throwable t) { + catch (Exception t) { U.error(log, "Error processing ClassPath file request [request=" + msg + ", nodeId=" + nodeId + ']', t); if (icp != null) { @@ -230,7 +229,7 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred SYSTEM_POOL ); } - catch (IgniteCheckedException e) { + catch (Exception e) { log.warning("Error notifying node of send error", e); } } @@ -269,6 +268,8 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { if (filesLeft != 0) { task.res.onDone(new IllegalStateException("onEnd invoked, but more files left: " + filesLeft + ", completing download process with an error")); + + return; } task.res.onDone((Void)null); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 3a6376536695a..15b601ac37878 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -45,6 +45,7 @@ * 2. Check and remove obsolete icp from dist on start. * Do we want to have some flag to skip remove in this case? (if we preparing for ICP registration). * 3. Should we include CP into snapshots and dumps? + * 4. Should we control file size to ensure disk free space enough to upload CP files? */ public class ClassPathProcessor extends GridProcessorAdapter { /** Prefix for metastorage keys. */ @@ -86,8 +87,7 @@ public ClassPathProcessor(GridKernalContext ctx) { * @return Class path id. */ public UUID startCreation(String name, String[] files, long[] lengths) { - assert files.length == lengths.length : "wrong arrays lengths"; - + A.ensure(files.length == lengths.length, "wrong arrays lengths"); A.ensure(U.alphanumericUnderscore(name), "Classpath name must satisfy the following name pattern: a-zA-Z0-9_"); for (String file : files) @@ -97,13 +97,12 @@ public UUID startCreation(String name, String[] files, long[] lengths) { File root = ctx.pdsFolderResolver().fileTree().classPathRoot(name); + Boolean metastorageWritten; + try { createRootAndCheckIsEmpty(root); - Boolean metastorageWritten = casToMetastorageAsync(null, icp).get(); - - if (metastorageWritten != null && !metastorageWritten) - throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); + metastorageWritten = casToMetastorageAsync(null, icp).get(); } catch (Exception e) { cleanup(icp, false); @@ -111,7 +110,10 @@ public UUID startCreation(String name, String[] files, long[] lengths) { throw new IgniteException(e); } - log.info("New IgniteCclasspath created [root = " + root + ", icp=" + icp + ']'); + if (metastorageWritten != null && !metastorageWritten) + throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); + + log.info("New IgniteClasspath created [root = " + root + ", icp=" + icp + ']'); return icp.id(); } @@ -186,19 +188,20 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { Path f = new File(root, name).toPath(); - if (Files.exists(f)) + if (Files.exists(f)) { + if(Files.isSameFile(file, f)) { + log.info("Skip copying new classpath file, already there: " + f); + + return; + } + throw new IgniteException("File exists: " + f); + } A.ensure(root.equals(f.toFile().getParentFile()), "filename"); log.info("Copying new classpath file: " + f); - if (Files.exists(f) && Files.isSameFile(file, f)) { - log.info("Skip copying new classpath file, already there: " + f); - - return; - } - Files.copy(file, f); } catch (Throwable e) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java index ebe472db9b942..890b2900b95b2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java @@ -105,6 +105,17 @@ public IgniteInternalFuture start(UUID icpId) { } } + /** */ + public void stop() { + synchronized (this) { + Exception err = new IgniteException("Node stopped"); + + futs.forEach((icpId, res) -> res.onDone(err)); + + futs.clear(); + } + } + /** * @param req Request on snapshot creation. * @return Future which will be completed when a snapshot has been started. @@ -218,8 +229,17 @@ private void processDeployToAllResult( ctx.classPath().casToMetastorageAsync(icp, icp.newState(IgniteClassPathState.READY)).listen(casFut -> { boolean metastorageWritten = casFut.error() == null && casFut.result() != null && casFut.result(); - if (!metastorageWritten && casFut.error() == null) - metastorageWritten = fromMetastorage(icp.id(), READY, ctx) != null; + if (!metastorageWritten && casFut.error() == null) { + try { + metastorageWritten = fromMetastorage(icp.id(), READY, ctx) != null; + } + catch (Exception e) { + if (depProcResFut != null) + depProcResFut.onDone(e); + + return; + } + } if (metastorageWritten) { if (!F.isEmpty(res)) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index 9950619b8292e..d5f5c87c220cd 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -74,6 +74,7 @@ public class ClassPathCreationFailoverTest extends GridCommonAbstractTest { // TODO: add stopped check during async operations. // TODO create classpath files on DownloadClassPathRequest - to check error while receiving file. + // TODO: don't create on client node. /** */ @Test diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java index df18c413eea83..d3cf9d702b244 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java @@ -17,6 +17,7 @@ package org.apache.ignite.testsuites; +import org.apache.ignite.internal.classpath.ClassPathCreationFailoverTest; import org.apache.ignite.internal.classpath.ClassPathMailicuosRequestsTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiSelfTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiStartStopSelfTest; @@ -30,7 +31,8 @@ @Suite.SuiteClasses({ GridLocalDeploymentSpiSelfTest.class, GridLocalDeploymentSpiStartStopSelfTest.class, - ClassPathMailicuosRequestsTest.class + ClassPathMailicuosRequestsTest.class, + ClassPathCreationFailoverTest.class }) public class IgniteSpiDeploymentSelfTestSuite { } From 5021265fbccbe3f705c3b478a28c328ff30ad3bf Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 19 Jun 2026 21:34:29 +0300 Subject: [PATCH 29/54] IGNITE-28207 Classpath creation process --- .../util/GridCommandHandlerClassPathTest.java | 17 ++++---- .../classpath/ClassPathProcessor.java | 18 +++------ .../classpath/ClassPathStartCreationTask.java | 8 +++- .../ClassPathCreationFailoverTest.java | 39 ++++++++----------- .../ClassPathMailicuosRequestsTest.java | 3 +- .../classpath/ClassPathTestUtils.java | 6 +++ 6 files changed, 46 insertions(+), 45 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 1e8e0b1a4833f..4a5cdfd770837 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -27,6 +27,7 @@ import org.apache.ignite.internal.classpath.ClassPathProcessor; import org.apache.ignite.internal.classpath.ClassPathTestUtils; import org.apache.ignite.internal.classpath.IgniteClassPath; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.testframework.ListeningTestLogger; import org.apache.ignite.testframework.LogListener; import org.junit.Test; @@ -160,10 +161,8 @@ public void testFailWhenFileExists() throws Exception { ctx.distributedMetastorage().listen( k -> k.equals(metastorageKey(cpName())), - (key, oldVal, newVal) -> { - for (String fileName : fileNames(cpFiles)) - new File(ctx.pdsFolderResolver().fileTree().classPathRoot(cpName()), fileName).mkdirs(); - } + (key, oldVal, newVal) -> + fileNames(cpFiles).forEach(f -> new File(ctx.pdsFolderResolver().fileTree().classPathRoot(cpName()), f).mkdirs()) ); LogListener cpReadyLsnr = null; @@ -218,11 +217,15 @@ public void testFailWhenMetastoreExists() throws Exception { String out = testOut.toString(); assertTrue(out.contains("Fail to register ClassPath. Same ClassPath exists, already?")); - assertNull("Metastorage record must be removed", classPath()); - assertFalse( - "Classpath directory must be removed", + assertNotNull(grid(0).context().distributedMetastorage().read(ClassPathProcessor.metastorageKey(cpName()))); + assertTrue( + "Classpath directory must be created", grid(0).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).exists() ); + assertTrue( + "Files must not be copied", + F.isEmpty(grid(0).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).listFiles()) + ); } /** Tests --create command arguments format. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 15b601ac37878..506e20fb291ea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -75,6 +75,7 @@ public ClassPathProcessor(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void onKernalStop(boolean cancel) { icpFilesHnd.stop(); + deployToAllProc.stop(); } /** @@ -86,7 +87,7 @@ public ClassPathProcessor(GridKernalContext ctx) { * @param lengths Files lengths. * @return Class path id. */ - public UUID startCreation(String name, String[] files, long[] lengths) { + public UUID startCreation(String name, String[] files, long[] lengths) throws IgniteCheckedException { A.ensure(files.length == lengths.length, "wrong arrays lengths"); A.ensure(U.alphanumericUnderscore(name), "Classpath name must satisfy the following name pattern: a-zA-Z0-9_"); @@ -97,18 +98,9 @@ public UUID startCreation(String name, String[] files, long[] lengths) { File root = ctx.pdsFolderResolver().fileTree().classPathRoot(name); - Boolean metastorageWritten; + createRootAndCheckIsEmpty(root); - try { - createRootAndCheckIsEmpty(root); - - metastorageWritten = casToMetastorageAsync(null, icp).get(); - } - catch (Exception e) { - cleanup(icp, false); - - throw new IgniteException(e); - } + Boolean metastorageWritten = casToMetastorageAsync(null, icp).get(); if (metastorageWritten != null && !metastorageWritten) throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); @@ -189,7 +181,7 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { Path f = new File(root, name).toPath(); if (Files.exists(f)) { - if(Files.isSameFile(file, f)) { + if (Files.isSameFile(file, f)) { log.info("Skip copying new classpath file, already there: " + f); return; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java index c7c11a1c7fce8..4376bbb38b30c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.management.classpath; import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.visor.VisorJob; import org.apache.ignite.internal.visor.VisorOneNodeTask; @@ -45,7 +46,12 @@ protected ClassPathStartCreationJob(@Nullable ClassPathCreateCommandArg arg, boo /** {@inheritDoc} */ @Override protected UUID run(@Nullable ClassPathCreateCommandArg arg) throws IgniteException { - return ignite.context().classPath().startCreation(arg.name, arg.files, arg.lengths); + try { + return ignite.context().classPath().startCreation(arg.name, arg.files, arg.lengths); + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } } } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index d5f5c87c220cd..dcea6767ca886 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -69,7 +69,21 @@ public class ClassPathCreationFailoverTest extends GridCommonAbstractTest { @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { return super.getConfiguration(igniteInstanceName) .setGridLogger(lsnrLog) - .setCommunicationSpi(new BlockingTcpCommunicationSpi()); + .setCommunicationSpi(new TcpCommunicationSpi() { + @Override public void sendMessage(ClusterNode node, Message msg, IgniteInClosure ackC) { + if (msg instanceof GridIoMessage + && ((GridIoMessage)msg).message() instanceof DownloadClassPathMessage + && !failedNode.localNode().id().equals(ignite.cluster().localNode().id()) + ) { + GridTestUtils.runAsync(() -> failedNode.close()); + + if (!sendMessage) + return; + } + + super.sendMessage(node, msg, ackC); + } + }); } // TODO: add stopped check during async operations. @@ -116,10 +130,7 @@ public void testUploadNodeFailDuringDeployment() throws Exception { assertEquals(1, Ignition.allGrids().size()); assertTrue(waitForCondition(() -> { - ClassPathFilesTransmissionHandler icpFilesHnd - = getFieldValue(grid1.context().classPath(), "icpFilesHnd"); - - Object t = getFieldValue(icpFilesHnd, "active"); + Object t = getFieldValue(ClassPathTestUtils.transmissionHandler(grid1), "active"); if (t == null) return true; @@ -188,24 +199,6 @@ public void testDownloadNodeFailDuringDeployment() throws Exception { } } - /** */ - protected static class BlockingTcpCommunicationSpi extends TcpCommunicationSpi { - /** {@inheritDoc} */ - @Override public void sendMessage(ClusterNode node, Message msg, IgniteInClosure ackC) { - if (msg instanceof GridIoMessage - && ((GridIoMessage)msg).message() instanceof DownloadClassPathMessage - && !failedNode.localNode().id().equals(ignite.cluster().localNode().id()) - ) { - GridTestUtils.runAsync(() -> failedNode.close()); - - if (!sendMessage) - return; - } - - super.sendMessage(node, msg, ackC); - } - } - /** */ private LogListener newClassPathListener() { return logListener("New ClassPath created [uploadNode=" + grid(0).localNode().id()); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java index f66f7ae810537..57a427143622b 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java @@ -19,6 +19,7 @@ import java.nio.file.Path; import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; @@ -77,7 +78,7 @@ public void testMaliciousClassPathName() { /** */ @Test - public void testUnknownFilename() { + public void testUnknownFilename() throws IgniteCheckedException { UUID icpId = cpProc().startCreation("mycp", new String[]{"file.txt"}, new long[]{42}); assertThrows( diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java index db1640615f9de..0f851848632d6 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java @@ -31,6 +31,7 @@ import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.util.typedef.internal.U; +import static org.apache.ignite.testframework.GridTestUtils.getFieldValue; import static org.junit.Assert.assertEquals; /** */ @@ -106,4 +107,9 @@ public static void checkFilesExists(IgniteEx node, String cpName, Set cpFi assertEquals(Files.size(cpFile), Files.size(nodeFile)); } } + + /** */ + static ClassPathFilesTransmissionHandler transmissionHandler(IgniteEx grid1) { + return getFieldValue(grid1.context().classPath(), "icpFilesHnd"); + } } From d676a802d4963f642c2087136cae8a6b3b1a24bf Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Fri, 19 Jun 2026 21:57:54 +0300 Subject: [PATCH 30/54] IGNITE-28207 Classpath creation process --- .../ClassPathFilesTransmissionHandler.java | 4 +- .../ClassPathCreationFailoverTest.java | 192 +++++++++++------- 2 files changed, 123 insertions(+), 73 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index 3af3fa678bc1a..04f5d4a00730b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -242,8 +242,8 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { log.debug(errMsg); if (!cancel(active, new IgniteException(errMsg), t -> t.icp.id().equals(msg.icpId))) { - if (log.isInfoEnabled()) { - log.warning("A stale ClassPath failure message has been received. Will be ignored " + + if (log.isDebugEnabled()) { + log.debug("A stale ClassPath failure message has been received. Will be ignored " + "[fromNodeId=" + nodeId + ", icpId=" + msg.icpId + "]: " + msg.err); } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index dcea6767ca886..eeba685735c71 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.classpath; +import java.io.File; import java.nio.file.Path; import java.util.Set; import org.apache.ignite.IgniteException; @@ -51,6 +52,9 @@ public class ClassPathCreationFailoverTest extends GridCommonAbstractTest { /** */ private static boolean sendMessage; + /** */ + private static Runnable callback; + /** */ private ListeningTestLogger lsnrLog; @@ -65,6 +69,17 @@ public class ClassPathCreationFailoverTest extends GridCommonAbstractTest { lsnrLog = new ListeningTestLogger(log); } + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + failedNode = null; + + sendMessage = false; + + callback = null; + } + /** {@inheritDoc} */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { return super.getConfiguration(igniteInstanceName) @@ -75,7 +90,8 @@ public class ClassPathCreationFailoverTest extends GridCommonAbstractTest { && ((GridIoMessage)msg).message() instanceof DownloadClassPathMessage && !failedNode.localNode().id().equals(ignite.cluster().localNode().id()) ) { - GridTestUtils.runAsync(() -> failedNode.close()); + if (callback != null) + callback.run(); if (!sendMessage) return; @@ -87,70 +103,66 @@ public class ClassPathCreationFailoverTest extends GridCommonAbstractTest { } // TODO: add stopped check during async operations. - // TODO create classpath files on DownloadClassPathRequest - to check error while receiving file. - // TODO: don't create on client node. + // TODO: don't create on client node. ??? /** */ @Test public void testUploadNodeFailDuringDeployment() throws Exception { failedNode = startGrid(0); - try { - IgniteEx grid1 = startGrid(1); + callback = () -> GridTestUtils.runAsync(() -> failedNode.close()); + + IgniteEx grid1 = startGrid(1); - awaitPartitionMapExchange(); + awaitPartitionMapExchange(); - Set cpFiles = ClassPathTestUtils.files(); + Set cpFiles = ClassPathTestUtils.files(); - LogListener createdMsg = newClassPathListener(); - LogListener uploadNodeFailedMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); - LogListener rmvMsg = - logListener("All nodes fail to deploy ClassPath. Will be removed. Retry creation [icp=testcp]"); + LogListener createdMsg = newClassPathListener(); + LogListener uploadNodeFailedMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); + LogListener rmvMsg = + logListener("All nodes fail to deploy ClassPath. Will be removed. Retry creation [icp=testcp]"); - lsnrLog.registerAllListeners(createdMsg, uploadNodeFailedMsg, rmvMsg); + lsnrLog.registerAllListeners(createdMsg, uploadNodeFailedMsg, rmvMsg); - ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); + ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); - arg.name("testcp"); - arg.files(ClassPathTestUtils.fileArg(cpFiles)); + arg.name("testcp"); + arg.files(ClassPathTestUtils.fileArg(cpFiles)); - // ClassPath must be created on `failedNode`. Because, it first in cluster. - assertThrows( - null, - () -> new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)), - ComputeTaskCancelledException.class, - "Task cancelled due to stopping of the grid" - ); + // ClassPath must be created on `failedNode`. Because, it first in cluster. + assertThrows( + null, + () -> new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)), + ComputeTaskCancelledException.class, + "Task cancelled due to stopping of the grid" + ); - assertTrue(waitForCondition(createdMsg::check, 10_000)); - assertTrue(failedNode.context().isStopping()); + assertTrue(waitForCondition(createdMsg::check, 10_000)); + assertTrue(failedNode.context().isStopping()); - stopGrid(0); + stopGrid(0); - assertEquals(1, Ignition.allGrids().size()); + assertEquals(1, Ignition.allGrids().size()); - assertTrue(waitForCondition(() -> { - Object t = getFieldValue(ClassPathTestUtils.transmissionHandler(grid1), "active"); + assertTrue(waitForCondition(() -> { + Object t = getFieldValue(ClassPathTestUtils.transmissionHandler(grid1), "active"); - if (t == null) - return true; + if (t == null) + return true; - GridFutureAdapter res = getFieldValue(t, "res"); + GridFutureAdapter res = getFieldValue(t, "res"); - return res.isDone(); - }, 10_000)); + return res.isDone(); + }, 10_000)); - assertTrue(waitForCondition(uploadNodeFailedMsg::check, 10_000)); - assertTrue(waitForCondition(rmvMsg::check, 10_000)); - assertTrue(waitForCondition( - () -> !grid1.context().pdsFolderResolver().fileTree().classPathRoot("testcp").exists(), - 10_000 - )); - assertNull(grid1.context().distributedMetastorage().read(metastorageKey("testcp"))); - } - finally { - failedNode = null; - } + assertTrue(waitForCondition(uploadNodeFailedMsg::check, 10_000)); + assertTrue(waitForCondition(rmvMsg::check, 10_000)); + assertTrue(waitForCondition( + () -> !grid1.context().pdsFolderResolver().fileTree().classPathRoot("testcp").exists(), + 10_000 + )); + assertNull(grid1.context().distributedMetastorage().read(metastorageKey("testcp"))); } /** */ @@ -158,45 +170,83 @@ public void testUploadNodeFailDuringDeployment() throws Exception { public void testDownloadNodeFailDuringDeployment() throws Exception { startGrids(3); - try { - failedNode = grid(1); - sendMessage = true; + callback = () -> GridTestUtils.runAsync(() -> failedNode.close()); + + failedNode = grid(1); + sendMessage = true; + + awaitPartitionMapExchange(); + + Set cpFiles = ClassPathTestUtils.files(); + + LogListener createdMsg = newClassPathListener(); + LogListener oneNodeFailMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); + LogListener readyMsg = logListener("ClassPath is READY. 2 of 3 nodes has its files"); + + lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg, readyMsg); + + ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); + + arg.name("testcp"); + arg.files(ClassPathTestUtils.fileArg(cpFiles)); + + // ClassPath must be created on `failedNode`. Because, it first in cluster. + new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)); + + assertTrue(waitForCondition(createdMsg::check, 10_000)); + assertTrue(failedNode.context().isStopping()); + + stopGrid(1); + + assertEquals(2, Ignition.allGrids().size()); + + assertTrue(waitForCondition(oneNodeFailMsg::check, 10_000)); + assertTrue(waitForCondition(readyMsg::check, 10_000)); + + ClassPathTestUtils.checkFilesExists(grid(0), "testcp", cpFiles); + ClassPathTestUtils.checkFilesExists(grid(2), "testcp", cpFiles); + } + + /** */ + @Test + public void testConcurrentFileCreationDuringDeployment() throws Exception { + startGrids(2); + + sendMessage = true; + failedNode = grid(0); + + awaitPartitionMapExchange(); - awaitPartitionMapExchange(); + Set cpFiles = ClassPathTestUtils.files(); - Set cpFiles = ClassPathTestUtils.files(); + callback = () -> { + File cpRoot = grid(1).context().pdsFolderResolver().fileTree().classPathRoot("testcp"); - LogListener createdMsg = newClassPathListener(); - LogListener oneNodeFailMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); - LogListener readyMsg = logListener("ClassPath is READY. 2 of 3 nodes has its files"); + ClassPathTestUtils.fileNames(cpFiles).forEach(f -> new File(cpRoot, f).mkdirs()); + }; - lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg, readyMsg); + LogListener createdMsg = newClassPathListener(); + LogListener oneNodeFailMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); + LogListener readyMsg = logListener("ClassPath is READY. 1 of 2 nodes has its files"); - ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); + lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg, readyMsg); - arg.name("testcp"); - arg.files(ClassPathTestUtils.fileArg(cpFiles)); + ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); - // ClassPath must be created on `failedNode`. Because, it first in cluster. - new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)); + arg.name("testcp"); + arg.files(ClassPathTestUtils.fileArg(cpFiles)); - assertTrue(waitForCondition(createdMsg::check, 10_000)); - assertTrue(failedNode.context().isStopping()); + // ClassPath must be created on `failedNode`. Because, it first in cluster. + new ClassPathCreateCommand().execute(null, grid(0), arg, l -> grid(0).log().info(l)); - stopGrid(1); + assertTrue(waitForCondition(createdMsg::check, 10_000)); - assertEquals(2, Ignition.allGrids().size()); + assertEquals(2, Ignition.allGrids().size()); - assertTrue(waitForCondition(oneNodeFailMsg::check, 10_000)); - assertTrue(waitForCondition(readyMsg::check, 10_000)); + assertTrue(waitForCondition(oneNodeFailMsg::check, 10_000)); + assertTrue(waitForCondition(readyMsg::check, 10_000)); - ClassPathTestUtils.checkFilesExists(grid(0), "testcp", cpFiles); - ClassPathTestUtils.checkFilesExists(grid(2), "testcp", cpFiles); - } - finally { - failedNode = null; - sendMessage = false; - } + ClassPathTestUtils.checkFilesExists(grid(0), "testcp", cpFiles); } /** */ From dc1c2b8909799c0a407cd7743e941f58323b1058 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 22 Jun 2026 01:33:16 +0300 Subject: [PATCH 31/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../ignite/internal/CoreMessagesProvider.java | 4 - .../classpath/ClassPathChangeListener.java | 87 ++++++ .../ClassPathDeployToAllRequest.java | 51 ---- .../ClassPathDeployToAllResponse.java | 46 --- .../ClassPathFilesTransmissionHandler.java | 8 +- .../classpath/ClassPathProcessor.java | 207 +++++++++++-- .../classpath/DeployToAllProcess.java | 279 ------------------ .../classpath/DownloadClassPathTask.java | 88 ++++++ .../internal/classpath/IgniteClassPath.java | 24 +- .../classpath/ClassPathCreateCommand.java | 18 +- ...k.java => SetClassPathStateReadyTask.java} | 18 +- .../util/distributed/DistributedProcess.java | 7 +- 12 files changed, 403 insertions(+), 434 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java rename modules/core/src/main/java/org/apache/ignite/internal/management/classpath/{ClassPathDistributeTask.java => SetClassPathStateReadyTask.java} (75%) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java index 8eabba605795d..615847f3961ae 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java @@ -23,8 +23,6 @@ import org.apache.ignite.internal.cache.query.index.IndexQueryResultMeta; import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyDefinition; import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyTypeSettings; -import org.apache.ignite.internal.classpath.ClassPathDeployToAllRequest; -import org.apache.ignite.internal.classpath.ClassPathDeployToAllResponse; import org.apache.ignite.internal.classpath.DownloadClassPathFailureMessage; import org.apache.ignite.internal.classpath.DownloadClassPathMessage; import org.apache.ignite.internal.management.cache.PartitionKey; @@ -670,8 +668,6 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchema(PartitionHashRecord.class); withNoSchema(TransactionsHashRecord.class); - withNoSchema(ClassPathDeployToAllRequest.class); - withNoSchema(ClassPathDeployToAllResponse.class); withNoSchema(DownloadClassPathMessage.class); withNoSchema(DownloadClassPathFailureMessage.class); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java new file mode 100644 index 0000000000000..d60423b94ffef --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -0,0 +1,87 @@ +package org.apache.ignite.internal.classpath; + +import java.io.Serializable; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorageListener; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +public class ClassPathChangeListener implements DistributedMetaStorageListener { + /** */ + private final IgniteLogger log; + + /** */ + private final GridKernalContext ctx; + + /** + * @param ctx Grid kernal context. + */ + public ClassPathChangeListener(GridKernalContext ctx) { + this.ctx = ctx; + this.log = ctx.log(ClassPathChangeListener.class); + } + + /** {@inheritDoc} */ + @Override public void onUpdate(@NotNull String key, @Nullable Serializable oldVal, @Nullable Serializable newVal) { + if (!(oldVal instanceof IgniteClassPath) || !(newVal instanceof IgniteClassPath)) { + String ot = oldVal == null ? null : oldVal.getClass().getName(); + String nt = newVal == null ? null : newVal.getClass().getName(); + + log.warning("Wrong data in IgniteClassPath metastorage data [key=" + key + ", oldVal=" + ot + ", newVal=" + nt + ']'); + + return; + } + + IgniteClassPath oldIcp = (IgniteClassPath)oldVal; + IgniteClassPath newIcp = (IgniteClassPath)newVal; + + if (newIcp == null) { + log.warning("IgniteClassPath removed. Remove operation not supported at a time"); + + return; + } + + switch (newIcp.state()) { + case NEW: + log.info("IgniteClassPath created. Waiting for READY state to start download file to local node."); + + break; + case READY: + if (oldIcp.state() == IgniteClassPathState.NEW) { + log.info("IgniteClassPath READY. Starting download to local node."); + + ctx.classPath().addClassPathTask(newIcp, new DownloadClassPathTask(ctx, newIcp.id())); + } + else { + log.warning("Wrong state change. Ignore [prev=" + oldIcp.state() + ", new=" + newIcp.state() + ']'); + } + + break; + + case REMOVING: + log.info("IgniteClassPath removed. Remove operation not supported at a time"); + + break; + + default: + throw new IllegalArgumentException("Unknown IgniteClassPath state: " + newIcp.state()); + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java deleted file mode 100644 index ea4199b86c031..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllRequest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.classpath; - -import java.util.UUID; -import org.apache.ignite.internal.Order; -import org.apache.ignite.internal.util.distributed.DistributedProcess; -import org.apache.ignite.plugin.extensions.communication.Message; - -/** - * Class path deploy to all request for {@link DistributedProcess} initiate message. - */ -public class ClassPathDeployToAllRequest implements Message { - /** - * Classpath ID. - * - * @see IgniteClassPath#id() - */ - @Order(0) - UUID icpId; - - /** Node containing class path files. */ - @Order(1) - UUID uploadNodeId; - - /** */ - public ClassPathDeployToAllRequest() { - // No-op. - } - - /** */ - public ClassPathDeployToAllRequest(UUID icpId, UUID uploadNodeId) { - this.icpId = icpId; - this.uploadNodeId = uploadNodeId; - } -} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java deleted file mode 100644 index c05efc2014f10..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathDeployToAllResponse.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.classpath; - -import java.util.UUID; -import org.apache.ignite.internal.Order; -import org.apache.ignite.internal.util.distributed.DistributedProcess; -import org.apache.ignite.plugin.extensions.communication.Message; - -/** - * Class path deploy to all response for {@link DistributedProcess} initiate message. - */ -public class ClassPathDeployToAllResponse implements Message { - /** - * Classpath ID. - * - * @see IgniteClassPath#id() - */ - @Order(0) - UUID icpId; - - /** */ - public ClassPathDeployToAllResponse() { - // No-op. - } - - /** */ - public ClassPathDeployToAllResponse(UUID icpId) { - this.icpId = icpId; - } -} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index 04f5d4a00730b..16ef854ed25f0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -50,7 +50,7 @@ import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; -import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; import static org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotManager.SNP_NODE_STOPPING_ERR_MSG; @@ -190,7 +190,7 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred IgniteClassPath icp = null; try { - icp = fromMetastorage(msg.icpId, NEW, ctx); + icp = fromMetastorage(msg.icpId, READY, ctx); NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); @@ -290,7 +290,7 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { UUID icpId = (UUID)fileMeta.params().get(ICP_ID_PARAM); String name = (String)fileMeta.params().get(NAME_PARAM); - IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); + IgniteClassPath icp = fromMetastorage(icpId, READY, ctx); DownloadClassPathTask task = active; @@ -313,7 +313,7 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { UUID icpId = (UUID)initMeta.params().get(ICP_ID_PARAM); String name = (String)initMeta.params().get(NAME_PARAM); - IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); + IgniteClassPath icp = fromMetastorage(icpId, READY, ctx); return file -> { DownloadClassPathTask task = active; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 506e20fb291ea..daa3fb5d6eb29 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -21,10 +21,18 @@ import java.io.RandomAccessFile; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Objects; +import java.util.Queue; +import java.util.Set; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.RejectedExecutionException; +import java.util.function.Function; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; +import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.GridProcessorAdapter; @@ -37,6 +45,7 @@ import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; /** * TODO: @@ -49,13 +58,13 @@ */ public class ClassPathProcessor extends GridProcessorAdapter { /** Prefix for metastorage keys. */ - private static final String METASTORE_PREFIX = "icp."; + static final String METASTORE_PREFIX = "icp."; /** Handles download requests for {@link IgniteClassPath} files. */ - private final ClassPathFilesTransmissionHandler icpFilesHnd; + final ClassPathFilesTransmissionHandler icpFilesHnd; - /** Distributed process that deploys classpath files to all nodes. */ - private final DeployToAllProcess deployToAllProc; + /** */ + private final ConcurrentMap>> icpTasks = new ConcurrentHashMap<>(); /** * @param ctx Kernal context. @@ -64,18 +73,18 @@ public ClassPathProcessor(GridKernalContext ctx) { super(ctx); icpFilesHnd = new ClassPathFilesTransmissionHandler(ctx); - deployToAllProc = new DeployToAllProcess(ctx, icpFilesHnd); } /** {@inheritDoc} */ @Override public void start() throws IgniteCheckedException { icpFilesHnd.start(); + + ctx.distributedMetastorage().listen(key -> key.startsWith(METASTORE_PREFIX), new ClassPathChangeListener(ctx)); } /** {@inheritDoc} */ @Override public void onKernalStop(boolean cancel) { icpFilesHnd.stop(); - deployToAllProc.stop(); } /** @@ -94,7 +103,7 @@ public UUID startCreation(String name, String[] files, long[] lengths) throws Ig for (String file : files) ensureFilename(file); - IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), name, files, lengths, NEW); + IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), Set.of(ctx.localNodeId()), name, files, lengths, NEW); File root = ctx.pdsFolderResolver().fileTree().classPathRoot(name); @@ -110,6 +119,13 @@ public UUID startCreation(String name, String[] files, long[] lengths) throws Ig return icp.id(); } + /** */ + public void makeReady(UUID icpId) throws IgniteCheckedException { + IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); + + casToMetastorageAsync(icp, icp.newState(READY)).get(); + } + /** * Writes {@code batch} to the Ignite Class Path file. * @@ -206,18 +222,70 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { } } - /** - * Deploy {@link IgniteClassPath} to all nodes. - * @param icpId ClassPath id. - * @return Future for process result. - */ - public IgniteInternalFuture deployToAll(@Nullable UUID icpId) { - return deployToAllProc.start(icpId); + /** */ + void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { + UUID icpId = icp.id(); + + task.result().listen(doneFut -> { + if (task.result().error() == null) + log.info("IgniteClassPath task done [task=" + task.name() + ", icp=" + icp + ", res=" + task.result().result() + ']'); + else + log.warning("IgniteClassPath task failure [task=" + task.name() + ", icp=" + icp + ']', task.result().error()); + + icpTasks.compute(icpId, (ignored, tasks) -> { + if (tasks == null) + tasks = new ConcurrentLinkedQueue<>(); + + if (tasks.peek().result() == doneFut) { + tasks.poll(); + + startAsync(tasks.peek()); + } + else + tasks.removeIf(t -> t == task); + + return tasks; + }); + }); + + icpTasks.compute(icpId, (ignored, tasks) -> { + if (tasks == null) + tasks = new ConcurrentLinkedQueue<>(); + + while (!F.isEmpty(tasks) && tasks.peek().result().isDone()) + tasks.poll(); + + boolean isFirst = F.isEmpty(tasks); + + tasks.add(task); + + if (isFirst) + startAsync(task); + + return tasks; + }); } - /** - * - */ + /** */ + private void startAsync(ClassPathTask t) { + // TODO: check is stopped. + // TODO: async task to invoke start required? + try { + ctx.pools().getSystemExecutorService().submit(() -> { + try { + t.start(); + } + catch (Throwable e) { + t.result().onDone(e); + } + }); + } + catch (RejectedExecutionException e) { + t.result().onDone(e); + } + } + + /** */ GridFutureAdapter casToMetastorageAsync(@Nullable IgniteClassPath prev, IgniteClassPath icp) { try { String key = metastorageKey(icp.name()); @@ -248,6 +316,68 @@ GridFutureAdapter casToMetastorageAsync(@Nullable IgniteClassPath prev, } } + /** + * Modifies {@link IgniteClassPath} in metastorage with thre provided {@code change}. + * Retries modification if {@link #casToMetastorageAsync(IgniteClassPath, IgniteClassPath)} failed. + * If {@code change} returns same {@link IgniteClassPath} no updates will be done. + * If {@code change} or read from metastorge throws then operation will finish with the corresponding exception. + */ + public GridFutureAdapter modifyInMetastorageAsync( + UUID icpId, + IgniteClassPathState state, + Function change + ) { + GridFutureAdapter res = new GridFutureAdapter<>(); + + modifyWithRetriesAsync(icpId, state, change, res, 100); + + return res; + } + + /** */ + private void modifyWithRetriesAsync( + UUID icpId, + IgniteClassPathState state, + Function change, + GridFutureAdapter res, + int hardLimit + ) { + if (hardLimit == 0) { + log.error("Reached hard limit on CAS attempts. Fail operation [icpId=" + icpId + ", state=" + state + ']'); + + res.onDone(new IgniteException("Hard limit of CAS reached")); + } + + try { + IgniteClassPath prev = fromMetastorage(icpId, state, ctx); + IgniteClassPath icp = change.apply(prev); + + if (Objects.equals(prev, icp)) { + res.onDone(); + + return; + } + + if (log.isDebugEnabled()) + log.debug("Trying to CAS [prev=" + prev + ", new=" + icp + ", hardLmit=" + hardLimit + ']'); + + casToMetastorageAsync(prev, icp).listen(casRes -> { + if (casRes.error() != null) { + res.onDone(casRes.error()); + + return; + } + + // Concurrent node modifies first? It's OK, trying to repeat. + if (casRes.result() == null || !casRes.result()) + modifyWithRetriesAsync(icpId, state, change, res, hardLimit - 1); + }); + } + catch (Exception e) { + res.onDone(e); + } + } + /** * @param icpId ClassPath id. * @param ctx Kernal context. @@ -265,7 +395,7 @@ static IgniteClassPath fromMetastorage(UUID icpId, @Nullable IgniteClassPathStat if (icp[0] == null) throw new IgniteException("ClassPath not found: " + icpId); - if (expState != null && icp[0].state() != expState) + if (icp[0].state() != expState) throw new IgniteException("ClassPath in wrong state [expected=" + expState + ", status=" + icp[0].state() + ']'); return icp[0]; @@ -356,4 +486,45 @@ void cleanup(IgniteClassPath icp, boolean loc) { U.delete(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); } + + /** */ + abstract static class ClassPathTask { + /** */ + private final GridFutureAdapter taskRes = new GridFutureAdapter(); + + /** */ + protected final GridKernalContext ctx; + + /** */ + protected final UUID icpId; + + /** */ + protected final IgniteLogger log; + + /** */ + protected ClassPathTask(GridKernalContext ctx, UUID icpId) { + this.ctx = ctx; + this.icpId = icpId; + this.log = ctx.log(getClass()); + } + + /** + * Starts task execution. + * Must be nonblocking and fast. + * In case any exception throwed, {@link #result()} will be finished and task treated as done. + */ + abstract void start() throws Exception; + + /** + * @return Task name. + */ + abstract String name(); + + /** + * @return Task results. + */ + GridFutureAdapter result() { + return taskRes; + } + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java deleted file mode 100644 index 890b2900b95b2..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DeployToAllProcess.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.classpath; - -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.ignite.IgniteException; -import org.apache.ignite.IgniteLogger; -import org.apache.ignite.internal.GridKernalContext; -import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; -import org.apache.ignite.internal.util.distributed.DistributedProcess; -import org.apache.ignite.internal.util.future.GridFinishedFuture; -import org.apache.ignite.internal.util.future.GridFutureAdapter; -import org.apache.ignite.internal.util.lang.GridClosureException; -import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.U; - -import static org.apache.ignite.internal.classpath.ClassPathProcessor.createRootAndCheckIsEmpty; -import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; -import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; -import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; -import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.CLASSPATH_DEPLOY_TO_ALL; - -/** Distributed process to spread {@link IgniteClassPath} files across cluster. */ -class DeployToAllProcess { - /** Logger. */ - private final IgniteLogger log; - - /** Kernal context. */ - private final GridKernalContext ctx; - - /** Files handler. */ - private final ClassPathFilesTransmissionHandler icpFilesHnd; - - /** Distribute process that distributes new Ignite class path across all server nodes. */ - private final DistributedProcess deployToAllProc; - - /** Future results of started distributed process. */ - private final Map> futs = new ConcurrentHashMap<>(); - - /** */ - public DeployToAllProcess(GridKernalContext ctx, ClassPathFilesTransmissionHandler icpFilesHnd) { - log = ctx.log(DeployToAllProcess.class); - - this.ctx = ctx; - this.icpFilesHnd = icpFilesHnd; - this.deployToAllProc = new DistributedProcess<>( - ctx, - CLASSPATH_DEPLOY_TO_ALL, - this::downloadLocally, - this::processDeployToAllResult - ); - } - - /** - * @param icpId ClassPath ID. - * @return Future for deploy process result. - */ - public IgniteInternalFuture start(UUID icpId) { - boolean added = false; - - try { - GridFutureAdapter deployRes = new GridFutureAdapter<>(); - - synchronized (this) { - IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); - - ClassPathDeployToAllRequest req = new ClassPathDeployToAllRequest(icpId, ctx.localNodeId()); - - added = futs.putIfAbsent(icpId, deployRes) == null; - - if (!added) { - return new GridFinishedFuture<>( - new IllegalStateException("Deploy to all process started, already: " + icp.name()) - ); - } - - deployToAllProc.start(icpId, req); - } - - return deployRes; - } - catch (Exception e) { - if (added) - futs.remove(icpId); - - return new GridFinishedFuture<>(e); - } - } - - /** */ - public void stop() { - synchronized (this) { - Exception err = new IgniteException("Node stopped"); - - futs.forEach((icpId, res) -> res.onDone(err)); - - futs.clear(); - } - } - - /** - * @param req Request on snapshot creation. - * @return Future which will be completed when a snapshot has been started. - */ - private IgniteInternalFuture downloadLocally(ClassPathDeployToAllRequest req) { - try { - if (req.uploadNodeId.equals(ctx.localNodeId())) { - if (log.isDebugEnabled()) - log.debug("Skip download ClassPath files for upload node [id=" + req.icpId + ']'); - - return new GridFinishedFuture<>(); - } - - IgniteClassPath icp = fromMetastorage(req.icpId, NEW, ctx); - - createRootAndCheckIsEmpty(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); - - IgniteInternalFuture res = icpFilesHnd.downloadLocally(req.uploadNodeId, icp); - - res.listen(f -> { - if (f.error() == null) { - if (log.isInfoEnabled()) - log.info("Classpath files from remote node has been fully received [icp=" + icp.name() + ']'); - - return; - } - - // Cleanup local files. - ctx.classPath().cleanupAsync(icp, true); - - log.warning( - "Failed to download ClassPath files from remote node [icp=" + icp.name() + "]", - f.error() - ); - }); - - return res.chain(f -> { - if (f.error() == null) - return new ClassPathDeployToAllResponse(icp.id()); - - NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); - - U.delete(ft.classPathRoot(icp.name())); - - throw new GridClosureException(f.error()); - }); - } - catch (Throwable e) { - return new GridFinishedFuture<>(e); - } - } - - /** - * @param id Request id. - * @param res Results. - * @param err Errors. - */ - private void processDeployToAllResult( - UUID id, - Map res, - Map err - ) { - // Not null only on node that will answer to the user. - GridFutureAdapter depProcResFut = futs.remove(id); - - try { - IgniteClassPath icp; - - try { - icp = fromMetastorage(id, null, ctx); - - if (icp.state() == READY) { - if (depProcResFut != null) - depProcResFut.onDone("OK", null); - - return; - } - } - catch (IgniteException e) { - if (depProcResFut != null) - depProcResFut.onDone(e); - - return; - } - - if (depProcResFut == null && !U.isLocalNodeCoordinator(ctx.discovery())) { - if (log.isDebugEnabled()) - log.debug("Skip IgnitClassPath metastorage update. Not coordinator and not start node [icp=" + icp + ']'); - - return; - } - - if (res.isEmpty()) { - String msg = "All nodes fail to deploy ClassPath. Will be removed. Retry creation [icp=" + icp.name() + ']'; - - log.warning(msg); - - try { - ctx.classPath().cleanupAsync(icp, false); - } - finally { - if (depProcResFut != null) - depProcResFut.onDone(new IgniteException(msg)); - } - - return; - } - - // Perform CAS async to release discovery thread and let CAS proceed. - // Start node or coordinator will succeed. - ctx.classPath().casToMetastorageAsync(icp, icp.newState(IgniteClassPathState.READY)).listen(casFut -> { - boolean metastorageWritten = casFut.error() == null && casFut.result() != null && casFut.result(); - - if (!metastorageWritten && casFut.error() == null) { - try { - metastorageWritten = fromMetastorage(icp.id(), READY, ctx) != null; - } - catch (Exception e) { - if (depProcResFut != null) - depProcResFut.onDone(e); - - return; - } - } - - if (metastorageWritten) { - if (!F.isEmpty(res)) { - log.info("Nodes that successfully download ClassPath files:"); - - res.forEach((nodeId, resp) -> log.info(" ^-- " + nodeId)); - } - - if (!F.isEmpty(err)) { - log.info("Nodes that fail to download ClassPath file (will retry on first usage):"); - - err.forEach((nodeId, t) -> log.info(" ^-- " + nodeId + ": " + t.getMessage())); - } - - log.info("ClassPath is READY. " + res.size() + " of " + (res.size() + err.size()) + " nodes has its files"); - } - - Throwable t = metastorageWritten - ? null - : casFut.error() != null - ? casFut.error() - : new IgniteException("Fail to change ClassPath state. Concurrent removal?"); - - if (depProcResFut != null && !depProcResFut.onDone(metastorageWritten ? "OK" : null, t)) { - log.warning("Distribute process in wrong state [" + - "canceled=" + depProcResFut.isCancelled() + - ", failed=" + depProcResFut.isFailed() + - ", done=" + depProcResFut.isDone() + ']'); - } - }); - } - catch (Exception e) { - if (depProcResFut != null) - depProcResFut.onDone(e); - } - } -} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java new file mode 100644 index 0000000000000..81ee615d3ed55 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.classpath; + +import java.util.UUID; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.typedef.F; + +import static org.apache.ignite.internal.classpath.ClassPathProcessor.createRootAndCheckIsEmpty; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; + +/** + * Download {@link IgniteClassPath} files to local node from random node that has files, already. + * + * @see ClassPathFilesTransmissionHandler + */ +public class DownloadClassPathTask extends ClassPathProcessor.ClassPathTask { + /** + * @param ctx Kernal context. + * @param icpId Ignite class path. + */ + protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { + super(ctx, icpId); + } + + /** {@inheritDoc} */ + @Override public void start() throws Exception { + IgniteClassPath icp = fromMetastorage(icpId, READY, ctx); + + if (icp.deployedOnNodes().contains(ctx.localNodeId())) { + if (log.isDebugEnabled()) + log.debug("Skip download ClassPath files. Node has files, already [icp=" + icp.name() + ']'); + + result().onDone(); + } + + createRootAndCheckIsEmpty(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); + + UUID rmtNode = F.rand(icp.deployedOnNodes()); + + if (log.isInfoEnabled()) + log.info("Start download Classpath files [icp=" + icp.name() + ", node=" + rmtNode + ']'); + + IgniteInternalFuture downloadRes = ctx.classPath().icpFilesHnd.downloadLocally(rmtNode, icp); + + downloadRes.listen(f -> { + if (f.error() == null) { + if (log.isInfoEnabled()) + log.info("Classpath files from remote node has been fully received [icp=" + icp.name() + ']'); + + ctx.classPath().modifyInMetastorageAsync(icpId, READY, state -> state.addDeployeOnNode(ctx.localNodeId())) + .listen(modifyRes -> result().onDone(modifyRes.result(), modifyRes.error())); + + return; + } + + // Cleanup local files. + ctx.classPath().cleanupAsync(icp, true); + + log.warning( + "Failed to download ClassPath files from remote node [icp=" + icp.name() + "]", + f.error() + ); + }); + } + + /** {@inheritDoc} */ + @Override public String name() { + return "Download files"; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index c141de7569e64..c14796aa7f557 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -19,7 +19,9 @@ import java.io.Serializable; import java.util.Arrays; +import java.util.HashSet; import java.util.Objects; +import java.util.Set; import java.util.UUID; import org.apache.ignite.internal.util.typedef.internal.S; @@ -33,6 +35,10 @@ public class IgniteClassPath implements Serializable { /** */ private UUID id; + /** */ + // TODO: remove on OnNodeLeft event. + private Set deployedOnNodes; + /** */ private String name; @@ -52,12 +58,14 @@ public class IgniteClassPath implements Serializable { */ public IgniteClassPath( UUID id, + Set deployedOnNodes, String name, String[] files, long[] lengths, IgniteClassPathState state ) { this.id = id; + this.deployedOnNodes = deployedOnNodes; this.name = name; this.files = files; this.lengths = lengths; @@ -68,7 +76,16 @@ public IgniteClassPath( * @param state New state. */ IgniteClassPath newState(IgniteClassPathState state) { - return new IgniteClassPath(id, name, files, lengths, state); + return new IgniteClassPath(id, deployedOnNodes, name, files, lengths, state); + } + + IgniteClassPath addDeployeOnNode(UUID locNode) { + Set deployedOnNodes0 = new HashSet<>(deployedOnNodes); + + deployedOnNodes0.add(locNode); + + return new IgniteClassPath(id, deployedOnNodes0, name, files, lengths, state); + } /** */ @@ -81,6 +98,11 @@ public UUID id() { return id; } + /** */ + public Set deployedOnNodes() { + return deployedOnNodes; + } + /** */ public String name() { return name; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index d618509362f9a..537b83d8a1618 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -71,25 +71,13 @@ public class ClassPathCreateCommand implements NativeCommand diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index d60423b94ffef..686a1aba35fc1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -1,12 +1,3 @@ -package org.apache.ignite.internal.classpath; - -import java.io.Serializable; -import org.apache.ignite.IgniteLogger; -import org.apache.ignite.internal.GridKernalContext; -import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorageListener; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -23,6 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.ignite.internal.classpath; + +import java.io.Serializable; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.classpath.ClassPathProcessor.ClassPathTask; +import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorage; +import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorageListener; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Listener of {@link DistributedMetaStorage} updates related to {@link IgniteClassPath} instances. + * Starts {@link ClassPathTask} to handle {@link IgniteClassPath} changes on local node. + * + * @see ClassPathProcessor + */ public class ClassPathChangeListener implements DistributedMetaStorageListener { /** */ private final IgniteLogger log; @@ -40,7 +48,7 @@ public ClassPathChangeListener(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void onUpdate(@NotNull String key, @Nullable Serializable oldVal, @Nullable Serializable newVal) { - if (!(oldVal instanceof IgniteClassPath) || !(newVal instanceof IgniteClassPath)) { + if (!(oldVal instanceof IgniteClassPath oldIcp) || !(newVal instanceof IgniteClassPath newIcp)) { String ot = oldVal == null ? null : oldVal.getClass().getName(); String nt = newVal == null ? null : newVal.getClass().getName(); @@ -49,9 +57,6 @@ public ClassPathChangeListener(GridKernalContext ctx) { return; } - IgniteClassPath oldIcp = (IgniteClassPath)oldVal; - IgniteClassPath newIcp = (IgniteClassPath)newVal; - if (newIcp == null) { log.warning("IgniteClassPath removed. Remove operation not supported at a time"); @@ -64,14 +69,13 @@ public ClassPathChangeListener(GridKernalContext ctx) { break; case READY: - if (oldIcp.state() == IgniteClassPathState.NEW) { + if (oldIcp.state() == IgniteClassPathState.NEW && !newIcp.deployedOnNodes().contains(ctx.localNodeId())) { log.info("IgniteClassPath READY. Starting download to local node."); ctx.classPath().addClassPathTask(newIcp, new DownloadClassPathTask(ctx, newIcp.id())); } - else { + else log.warning("Wrong state change. Ignore [prev=" + oldIcp.state() + ", new=" + newIcp.state() + ']'); - } break; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index daa3fb5d6eb29..adf5a3850bec2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -55,6 +55,8 @@ * Do we want to have some flag to skip remove in this case? (if we preparing for ICP registration). * 3. Should we include CP into snapshots and dumps? * 4. Should we control file size to ensure disk free space enough to upload CP files? + * + // TODO: remove from deployedNodes on OnNodeLeft event. */ public class ClassPathProcessor extends GridProcessorAdapter { /** Prefix for metastorage keys. */ @@ -506,6 +508,14 @@ protected ClassPathTask(GridKernalContext ctx, UUID icpId) { this.ctx = ctx; this.icpId = icpId; this.log = ctx.log(getClass()); + + result().listen(resFut -> { + if (resFut.error() == null) + ok(); + else + fail(resFut.error()); + }); + } /** @@ -526,5 +536,11 @@ protected ClassPathTask(GridKernalContext ctx, UUID icpId) { GridFutureAdapter result() { return taskRes; } + + /** */ + abstract void ok(); + + /** */ + abstract void fail(Throwable t); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java index 81ee615d3ed55..0136daf9f5b68 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.classpath; import java.util.UUID; +import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.util.typedef.F; @@ -49,6 +50,14 @@ protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { log.debug("Skip download ClassPath files. Node has files, already [icp=" + icp.name() + ']'); result().onDone(); + + return; + } + + if (icp.deployedOnNodes().isEmpty()) { + result().onDone(new IgniteException("Deployed on nodes empty. Can't download files: " + icpId)); + + return; } createRootAndCheckIsEmpty(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); @@ -56,31 +65,50 @@ protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { UUID rmtNode = F.rand(icp.deployedOnNodes()); if (log.isInfoEnabled()) - log.info("Start download Classpath files [icp=" + icp.name() + ", node=" + rmtNode + ']'); + log.info("Start download ClassPath files [icp=" + icp.name() + ", node=" + rmtNode + ']'); IgniteInternalFuture downloadRes = ctx.classPath().icpFilesHnd.downloadLocally(rmtNode, icp); downloadRes.listen(f -> { - if (f.error() == null) { - if (log.isInfoEnabled()) - log.info("Classpath files from remote node has been fully received [icp=" + icp.name() + ']'); - - ctx.classPath().modifyInMetastorageAsync(icpId, READY, state -> state.addDeployeOnNode(ctx.localNodeId())) - .listen(modifyRes -> result().onDone(modifyRes.result(), modifyRes.error())); + if (f.error() != null) { + result().onDone(f.error()); return; } - // Cleanup local files. - ctx.classPath().cleanupAsync(icp, true); + if (log.isDebugEnabled()) + log.debug("ClassPath files from remote node has been fully received [icp=" + icp.name() + ']'); - log.warning( - "Failed to download ClassPath files from remote node [icp=" + icp.name() + "]", - f.error() - ); + ctx.classPath().modifyInMetastorageAsync(icpId, READY, state -> state.addDeployeOnNode(ctx.localNodeId())) + .listen(modifyRes -> result().onDone(modifyRes.result(), modifyRes.error())); }); } + /** {@inheritDoc} */ + @Override public void ok() { + try { + log.info("ClassPath files downloaded [icp=" + fromMetastorage(icpId, READY, ctx).name() + ']'); + } + catch (Exception e) { + log.warning("onDowloadSucceed", e); + } + } + + /** {@inheritDoc} */ + @Override public void fail(Throwable t) { + try { + IgniteClassPath icp = fromMetastorage(icpId, READY, ctx); + + log.warning("Failed to download ClassPath files [icp=" + icp.name() + "]", t); + + // Cleanup local files. + ctx.classPath().cleanupAsync(icp, true); + } + catch (Exception e) { + log.warning("onDowloadFailed", e); + } + } + /** {@inheritDoc} */ @Override public String name() { return "Download files"; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index c14796aa7f557..0e34f4bc24afd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -36,7 +36,6 @@ public class IgniteClassPath implements Serializable { private UUID id; /** */ - // TODO: remove on OnNodeLeft event. private Set deployedOnNodes; /** */ @@ -79,6 +78,11 @@ IgniteClassPath newState(IgniteClassPathState state) { return new IgniteClassPath(id, deployedOnNodes, name, files, lengths, state); } + /** + * Adds {@code locNode} to {@link #deployedOnNodes()} set and returns new instance. + * @param locNode Node to add. + * @return Instance with modified set. + */ IgniteClassPath addDeployeOnNode(UUID locNode) { Set deployedOnNodes0 = new HashSet<>(deployedOnNodes); @@ -127,12 +131,16 @@ public long[] lengths() { @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; IgniteClassPath that = (IgniteClassPath)o; - return Objects.equals(id, that.id) && Objects.equals(name, that.name) && Objects.deepEquals(files, that.files) - && Objects.deepEquals(lengths, that.lengths) && state == that.state; + return Objects.equals(id, that.id) + && Objects.equals(deployedOnNodes, that.deployedOnNodes) + && Objects.equals(name, that.name) + && Objects.deepEquals(files, that.files) + && Objects.deepEquals(lengths, that.lengths) + && state == that.state; } /** {@inheritDoc} */ @Override public int hashCode() { - return Objects.hash(id, name, Arrays.hashCode(files), Arrays.hashCode(lengths), state); + return Objects.hash(id, deployedOnNodes, name, Arrays.hashCode(files), Arrays.hashCode(lengths), state); } } From 2a9f760cdfee0f019978fb4ef3db2fe7f4980623 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 22 Jun 2026 17:01:33 +0300 Subject: [PATCH 33/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../util/GridCommandHandlerClassPathTest.java | 25 +++-- .../classpath/ChangeClassPathStateTask.java | 55 +++++++++++ .../classpath/ClassPathChangeListener.java | 38 +++++-- .../ClassPathFilesTransmissionHandler.java | 11 ++- .../classpath/ClassPathProcessor.java | 98 ++++++++++++++++--- .../classpath/DownloadClassPathTask.java | 16 +-- .../internal/classpath/IgniteClassPath.java | 56 +++++++++-- .../classpath/IgniteClassPathState.java | 3 + .../RemoveNodeFromClassPathTask.java | 54 ++++++++++ .../ClassPathCreationFailoverTest.java | 82 ++++++++++------ .../ClassPathMailicuosRequestsTest.java | 13 ++- 11 files changed, 360 insertions(+), 91 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 4a5cdfd770837..de0b5ee550cf0 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -105,19 +105,23 @@ public void testCreate() throws Exception { if (commandHandler.equals(JMX_CMD_HND)) assertTrue(grid(0).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).mkdirs()); - LogListener cpReadyLsnr = readyLogListener(GRID_CNT); + LogListener cpReadyLsnr = readyLogListener(GRID_CNT - 1); lsnrLog.registerListener(cpReadyLsnr); assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName(), "--files", filesArg)); + assertTrue(waitForCondition(cpReadyLsnr::check, 30_000)); + IgniteClassPath icp = classPath(); assertEquals(READY, icp.state()); + assertEquals(GRID_CNT, icp.deployedOnNodes().size()); + assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); + assertTrue(icp.deployedOnNodes().contains(grid(1).localNode().id())); + assertTrue(icp.deployedOnNodes().contains(grid(2).localNode().id())); checkFilesExists(cpName(), -1); - - assertTrue(waitForCondition(cpReadyLsnr::check, 30_000)); } /** Tests --create command. */ @@ -135,19 +139,22 @@ public void testCreateWhenRootExists() throws Exception { assertTrue(f.createNewFile()); - LogListener cpReadyLsnr = readyLogListener(GRID_CNT - 1); + LogListener downloadSucceedMsg = readyLogListener(1); - lsnrLog.registerListener(cpReadyLsnr); + lsnrLog.registerListener(downloadSucceedMsg); assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "create", "--name", cpName(), "--files", filesArg)); + assertTrue(waitForCondition(downloadSucceedMsg::check, 30_000)); + IgniteClassPath icp = classPath(); assertEquals(READY, icp.state()); + assertEquals(2, icp.deployedOnNodes().size()); + assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); + assertTrue(icp.deployedOnNodes().contains(grid(1).localNode().id())); checkFilesExists(cpName(), FAIL_NODE_IDX); - - assertTrue(waitForCondition(cpReadyLsnr::check, 30_000)); } /** */ @@ -291,8 +298,8 @@ private IgniteClassPath classPath() throws IgniteCheckedException { /** */ private static LogListener readyLogListener(int succeed) { return LogListener - .matches("ClassPath is READY. " + succeed + " of " + GRID_CNT + " nodes has its files") - .times(1) + .matches("IgniteClassPath task done [task=Download files") + .times(succeed) .build(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java new file mode 100644 index 0000000000000..40257cd84f5f2 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.classpath; + + +import java.util.UUID; +import org.apache.ignite.internal.GridKernalContext; + +/** */ +public class ChangeClassPathStateTask extends ClassPathProcessor.ClassPathTask { + /** New {@link IgniteClassPath} state. */ + private final IgniteClassPathState state; + + /** */ + public ChangeClassPathStateTask(GridKernalContext ctx, UUID icpId, IgniteClassPathState state) { + super(ctx, icpId); + + this.state = state; + } + + /** {@inheritDoc} */ + @Override void start() { + ctx.classPath().modifyInMetastorageAsync(icpId, null,icp -> icp.newState(state)).listen(this::finishTaskWithFutureResult); + } + + /** {@inheritDoc} */ + @Override String name() { + return "ChangeClassPathState[newState=" + state + ']'; + } + + /** {@inheritDoc} */ + @Override void ok() { + if (log.isDebugEnabled()) + log.debug("ClassPath state changed [icpId=" + icpId + ", newState=" + state + ']'); + } + + /** {@inheritDoc} */ + @Override void fail(Throwable t) { + log.warning("Fail to change ClassPath state [icpId=" + icpId + ", newState=" + state + ']', t); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index 686a1aba35fc1..173fa2f7d6e72 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -25,6 +25,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.className; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.isClassPath; + /** * Listener of {@link DistributedMetaStorage} updates related to {@link IgniteClassPath} instances. * Starts {@link ClassPathTask} to handle {@link IgniteClassPath} changes on local node. @@ -48,28 +51,51 @@ public ClassPathChangeListener(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void onUpdate(@NotNull String key, @Nullable Serializable oldVal, @Nullable Serializable newVal) { - if (!(oldVal instanceof IgniteClassPath oldIcp) || !(newVal instanceof IgniteClassPath newIcp)) { - String ot = oldVal == null ? null : oldVal.getClass().getName(); - String nt = newVal == null ? null : newVal.getClass().getName(); - - log.warning("Wrong data in IgniteClassPath metastorage data [key=" + key + ", oldVal=" + ot + ", newVal=" + nt + ']'); + if (!isClassPath(oldVal) || !isClassPath(newVal)) { + log.warning("Wrong data in IgniteClassPath metastorage data " + + "[key=" + key + ", oldVal=" + className(oldVal) + ", newVal=" + className(newVal) + ']'); return; } + IgniteClassPath oldIcp = (IgniteClassPath)oldVal; + IgniteClassPath newIcp = (IgniteClassPath)newVal; + if (newIcp == null) { log.warning("IgniteClassPath removed. Remove operation not supported at a time"); return; } + if (newIcp.deployedOnNodes().isEmpty()) { + log.warning("All nodes that haves IgniteClassPath files left the grid [icp=" + newIcp.name() + ']'); + + ctx.classPath().addClassPathTask(newIcp, new ChangeClassPathStateTask(ctx, newIcp.id(), IgniteClassPathState.LOST)); + + return; + } + + if (newIcp.equalsWithoutNodes(oldIcp)) { + if (log.isDebugEnabled()) + log.debug("Event ignored. Old and new state equals [old=" + oldIcp + ", new = " + newIcp + ']'); + + return; + } + switch (newIcp.state()) { case NEW: log.info("IgniteClassPath created. Waiting for READY state to start download file to local node."); break; case READY: - if (oldIcp.state() == IgniteClassPathState.NEW && !newIcp.deployedOnNodes().contains(ctx.localNodeId())) { + if (oldIcp.state() == IgniteClassPathState.NEW) { + if (newIcp.deployedOnNodes().contains(ctx.localNodeId())) { + if (log.isDebugEnabled()) + log.debug("Event ignored. IgniteClassPath deployed on node, already: " + newIcp); + + return; + } + log.info("IgniteClassPath READY. Starting download to local node."); ctx.classPath().addClassPathTask(newIcp, new DownloadClassPathTask(ctx, newIcp.id())); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index 16ef854ed25f0..ab912422bbaae 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -103,7 +103,8 @@ public ClassPathFilesTransmissionHandler(GridKernalContext ctx) { IgniteInternalFuture downloadLocally(UUID rmtNodeId, IgniteClassPath icp) { assert !rmtNodeId.equals(ctx.localNodeId()); - log.info("Start download ClassPath files [name=" + icp.name() + ", id=" + icp.id() + ']'); + if (log.isInfoEnabled()) + log.info("Start download ClassPath files [icp=" + icp.name() + ", rmtNode=" + rmtNodeId + ']'); DownloadClassPathTask task = new DownloadClassPathTask(rmtNodeId, icp); @@ -250,7 +251,7 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { } } catch (Throwable e) { - U.error(log, "Processing snapshot request from remote node fails with an error", e); + U.error(log, "Processing ClassPath request from remote node fails with an error", e); ctx.failure().process(new FailureContext(FailureType.CRITICAL_ERROR, e)); } @@ -295,7 +296,7 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { DownloadClassPathTask task = active; if (!ensureTask(nodeId, task)) { - throw new TransmissionCancelledException("Stale snapshot transmission will be ignored " + + throw new TransmissionCancelledException("Stale ClassPath transmission will be ignored " + "[icpId=" + icp.id() + ", file=" + name + ']'); } @@ -319,14 +320,14 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { DownloadClassPathTask task = active; if (!ensureTask(nodeId, task)) { - throw new TransmissionCancelledException("Stale snapshot transmission will be ignored " + + throw new TransmissionCancelledException("Stale ClassPath transmission will be ignored " + "[icpId=" + icp.id() + ", file=" + name + ']'); } int filesLeft = task.filesLeft.decrementAndGet(); if (log.isInfoEnabled()) { - log.info("Classpath file from remote node has been received " + + log.info("ClassPath file from remote node has been received " + "[icp=" + task.icp.name() + ", file=" + name + ", filesLeft=" + filesLeft + ']'); } }; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index adf5a3850bec2..8bd7d772e98eb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -19,6 +19,7 @@ import java.io.File; import java.io.RandomAccessFile; +import java.io.Serializable; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; @@ -35,8 +36,10 @@ import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.managers.eventstorage.DiscoveryEventListener; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.internal.processors.metastorage.DistributedMetastorageLifecycleListener; import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; @@ -44,6 +47,8 @@ import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; +import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; @@ -58,13 +63,16 @@ * // TODO: remove from deployedNodes on OnNodeLeft event. */ -public class ClassPathProcessor extends GridProcessorAdapter { +public class ClassPathProcessor extends GridProcessorAdapter implements DistributedMetastorageLifecycleListener { /** Prefix for metastorage keys. */ static final String METASTORE_PREFIX = "icp."; /** Handles download requests for {@link IgniteClassPath} files. */ final ClassPathFilesTransmissionHandler icpFilesHnd; + /** System discovery message listener. */ + private DiscoveryEventListener discoLsnr; + /** */ private final ConcurrentMap>> icpTasks = new ConcurrentHashMap<>(); @@ -81,12 +89,46 @@ public ClassPathProcessor(GridKernalContext ctx) { @Override public void start() throws IgniteCheckedException { icpFilesHnd.start(); + synchronized (this) { + ctx.event().addDiscoveryEventListener(discoLsnr = (evt, discoCache) -> { + UUID leftNodeId = evt.eventNode().id(); + + try { + ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, val) -> { + if (!isClassPath(val)) { + log.warning("Wrong data in IgniteClassPath metastorage data [key=" + key + ", val=" + (val) + ']'); + + return; + } + + IgniteClassPath icp = (IgniteClassPath)val; + + addClassPathTask(icp, new RemoveNodeFromClassPathTask(ctx, icp.id(), leftNodeId)); + }); + } + catch (IgniteCheckedException e) { + log.warning("Distributed metastore iteration error", e); + } + + }, EVT_NODE_LEFT, EVT_NODE_FAILED); + } + } + + /** {@inheritDoc} */ + @Override public void onKernalStart(boolean active) throws IgniteCheckedException { + super.onKernalStart(active); + ctx.distributedMetastorage().listen(key -> key.startsWith(METASTORE_PREFIX), new ClassPathChangeListener(ctx)); } /** {@inheritDoc} */ @Override public void onKernalStop(boolean cancel) { icpFilesHnd.stop(); + + synchronized (this) { + if (discoLsnr != null) + ctx.event().removeDiscoveryEventListener(discoLsnr); + } } /** @@ -121,13 +163,6 @@ public UUID startCreation(String name, String[] files, long[] lengths) throws Ig return icp.id(); } - /** */ - public void makeReady(UUID icpId) throws IgniteCheckedException { - IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); - - casToMetastorageAsync(icp, icp.newState(READY)).get(); - } - /** * Writes {@code batch} to the Ignite Class Path file. * @@ -224,6 +259,17 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { } } + /** */ + public void makeReady(UUID icpId) throws IgniteCheckedException { + IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); + + ChangeClassPathStateTask task = new ChangeClassPathStateTask(ctx, icpId, READY); + + addClassPathTask(icp, task); + + task.result().get(); + } + /** */ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { UUID icpId = icp.id(); @@ -326,7 +372,7 @@ GridFutureAdapter casToMetastorageAsync(@Nullable IgniteClassPath prev, */ public GridFutureAdapter modifyInMetastorageAsync( UUID icpId, - IgniteClassPathState state, + @Nullable IgniteClassPathState state, Function change ) { GridFutureAdapter res = new GridFutureAdapter<>(); @@ -339,7 +385,7 @@ public GridFutureAdapter modifyInMetastorageAsync( /** */ private void modifyWithRetriesAsync( UUID icpId, - IgniteClassPathState state, + @Nullable IgniteClassPathState state, Function change, GridFutureAdapter res, int hardLimit @@ -370,9 +416,17 @@ private void modifyWithRetriesAsync( return; } + boolean metastorageWritten = casRes.result() != null && casRes.result(); + + if (metastorageWritten) { + res.onDone((Void)null); + + return; + } + // Concurrent node modifies first? It's OK, trying to repeat. - if (casRes.result() == null || !casRes.result()) - modifyWithRetriesAsync(icpId, state, change, res, hardLimit - 1); + modifyWithRetriesAsync(icpId, state, change, res, hardLimit - 1); + }); } catch (Exception e) { @@ -397,7 +451,7 @@ static IgniteClassPath fromMetastorage(UUID icpId, @Nullable IgniteClassPathStat if (icp[0] == null) throw new IgniteException("ClassPath not found: " + icpId); - if (icp[0].state() != expState) + if (expState != null && icp[0].state() != expState) throw new IgniteException("ClassPath in wrong state [expected=" + expState + ", status=" + icp[0].state() + ']'); return icp[0]; @@ -489,6 +543,16 @@ void cleanup(IgniteClassPath icp, boolean loc) { U.delete(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); } + /** */ + public static boolean isClassPath(Serializable icp) { + return icp == null || icp instanceof IgniteClassPath; + } + + /** */ + public static String className(@Nullable Serializable oldVal) { + return oldVal == null ? null : oldVal.getClass().getName(); + } + /** */ abstract static class ClassPathTask { /** */ @@ -518,6 +582,14 @@ protected ClassPathTask(GridKernalContext ctx, UUID icpId) { } + /** */ + void finishTaskWithFutureResult(IgniteInternalFuture action) { + if (action.error() == null) + result().onDone(); + else + result().onDone(action.error()); + } + /** * Starts task execution. * Must be nonblocking and fast. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java index 0136daf9f5b68..2473638bc0202 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -64,9 +64,6 @@ protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { UUID rmtNode = F.rand(icp.deployedOnNodes()); - if (log.isInfoEnabled()) - log.info("Start download ClassPath files [icp=" + icp.name() + ", node=" + rmtNode + ']'); - IgniteInternalFuture downloadRes = ctx.classPath().icpFilesHnd.downloadLocally(rmtNode, icp); downloadRes.listen(f -> { @@ -79,19 +76,16 @@ protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { if (log.isDebugEnabled()) log.debug("ClassPath files from remote node has been fully received [icp=" + icp.name() + ']'); - ctx.classPath().modifyInMetastorageAsync(icpId, READY, state -> state.addDeployeOnNode(ctx.localNodeId())) - .listen(modifyRes -> result().onDone(modifyRes.result(), modifyRes.error())); + ctx.classPath() + .modifyInMetastorageAsync(icpId, READY, state -> state.addDeployeOnNode(ctx.localNodeId())) + .listen(this::finishTaskWithFutureResult); }); } /** {@inheritDoc} */ @Override public void ok() { - try { - log.info("ClassPath files downloaded [icp=" + fromMetastorage(icpId, READY, ctx).name() + ']'); - } - catch (Exception e) { - log.warning("onDowloadSucceed", e); - } + if (log.isDebugEnabled()) + log.debug("ClassPath files downloaded [icpId=" + icpId + ']'); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index 0e34f4bc24afd..d3c4d52eaba9a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -71,25 +71,66 @@ public IgniteClassPath( this.state = state; } + /** + * @return {@code True} if {@code this} and {@code that} instances has all fields equals except {@link #deployedOnNodes}. + */ + public boolean equalsWithoutNodes(IgniteClassPath that) { + return equals(that, false); + } + + /** */ + private boolean equals(IgniteClassPath that, boolean includeNodes) { + if (that == null) + return false; + + return Objects.equals(id, that.id) + && (!includeNodes || Objects.equals(deployedOnNodes, that.deployedOnNodes)) + && Objects.equals(name, that.name) + && Objects.deepEquals(files, that.files) + && Objects.deepEquals(lengths, that.lengths) + && state == that.state; + } + /** * @param state New state. */ IgniteClassPath newState(IgniteClassPathState state) { + if (this.state == state) + return this; + return new IgniteClassPath(id, deployedOnNodes, name, files, lengths, state); } /** - * Adds {@code locNode} to {@link #deployedOnNodes()} set and returns new instance. - * @param locNode Node to add. + * Adds {@code node} to {@link #deployedOnNodes()} set and returns new instance. + * @param node Node to add. * @return Instance with modified set. */ - IgniteClassPath addDeployeOnNode(UUID locNode) { + IgniteClassPath addDeployeOnNode(UUID node) { + if (deployedOnNodes.contains(node)) + return this; + Set deployedOnNodes0 = new HashSet<>(deployedOnNodes); - deployedOnNodes0.add(locNode); + deployedOnNodes0.add(node); return new IgniteClassPath(id, deployedOnNodes0, name, files, lengths, state); + } + + /** + * Removes {@code node} from {@link #deployedOnNodes()} set and returns new instance. + * @param node Node to add. + * @return Instance with modified set. + */ + public IgniteClassPath removeDeployeOnNode(UUID node) { + if (!deployedOnNodes.contains(node)) + return this; + + Set deployedOnNodes0 = new HashSet<>(deployedOnNodes); + deployedOnNodes0.remove(node); + + return new IgniteClassPath(id, deployedOnNodes0, name, files, lengths, state); } /** */ @@ -131,12 +172,7 @@ public long[] lengths() { @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; IgniteClassPath that = (IgniteClassPath)o; - return Objects.equals(id, that.id) - && Objects.equals(deployedOnNodes, that.deployedOnNodes) - && Objects.equals(name, that.name) - && Objects.deepEquals(files, that.files) - && Objects.deepEquals(lengths, that.lengths) - && state == that.state; + return equals(that, true); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java index 2cf677a206dda..5f3a3f0d26010 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPathState.java @@ -25,6 +25,9 @@ public enum IgniteClassPathState { /** Ready for usage. */ READY, + /** There are no nodes with ClassPath files. */ + LOST, + /** Marked for removal. Newly started code can't use corresponding classpath. */ REMOVING } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java new file mode 100644 index 0000000000000..da8f1eb07c767 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.classpath; + +import java.util.UUID; +import org.apache.ignite.internal.GridKernalContext; + +public class RemoveNodeFromClassPathTask extends ClassPathProcessor.ClassPathTask { + /** Node to remove from {@link IgniteClassPath#deployedOnNodes()} set. */ + private final UUID node2rmv; + + /** */ + public RemoveNodeFromClassPathTask(GridKernalContext ctx, UUID icpId, UUID node2rmv) { + super(ctx, icpId); + this.node2rmv = node2rmv; + } + + /** {@inheritDoc} */ + @Override void start() { + ctx.classPath() + .modifyInMetastorageAsync(icpId, null, icp -> icp.removeDeployeOnNode(node2rmv)) + .listen(this::finishTaskWithFutureResult); + } + + /** {@inheritDoc} */ + @Override String name() { + return "Remove node"; + } + + /** {@inheritDoc} */ + @Override void ok() { + if (log.isDebugEnabled()) + log.debug("Node removed from ClassPath [icpId=" + icpId + ", node2rmv=" + node2rmv + ']'); + } + + /** {@inheritDoc} */ + @Override void fail(Throwable t) { + log.warning("Fail to remove node from ClassPath [icpId=" + icpId + ", node2rmv=" + node2rmv + ']', t); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index eeba685735c71..c00d6290943a7 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -23,7 +23,6 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.Ignition; import org.apache.ignite.cluster.ClusterNode; -import org.apache.ignite.compute.ComputeTaskCancelledException; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.management.classpath.ClassPathCreateCommand; @@ -40,12 +39,16 @@ import org.junit.Test; import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; -import static org.apache.ignite.testframework.GridTestUtils.assertThrows; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.LOST; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.testframework.GridTestUtils.getFieldValue; import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; /** */ public class ClassPathCreationFailoverTest extends GridCommonAbstractTest { + /** */ + public static final int TIMEOUT = 10_000; + /** */ private static IgniteEx failedNode; @@ -119,11 +122,11 @@ public void testUploadNodeFailDuringDeployment() throws Exception { Set cpFiles = ClassPathTestUtils.files(); LogListener createdMsg = newClassPathListener(); - LogListener uploadNodeFailedMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); - LogListener rmvMsg = - logListener("All nodes fail to deploy ClassPath. Will be removed. Retry creation [icp=testcp]"); + LogListener uploadNodeFailedMsg = logListener("Failed to download ClassPath files [icp=testcp]"); + LogListener lostStateMsg = + LogListener.matches("IgniteClassPath task done [task=ChangeClassPathState[newState=LOST]").times(2).build(); - lsnrLog.registerAllListeners(createdMsg, uploadNodeFailedMsg, rmvMsg); + lsnrLog.registerAllListeners(createdMsg, uploadNodeFailedMsg, lostStateMsg); ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); @@ -131,15 +134,10 @@ public void testUploadNodeFailDuringDeployment() throws Exception { arg.files(ClassPathTestUtils.fileArg(cpFiles)); // ClassPath must be created on `failedNode`. Because, it first in cluster. - assertThrows( - null, - () -> new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)), - ComputeTaskCancelledException.class, - "Task cancelled due to stopping of the grid" - ); + new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)); - assertTrue(waitForCondition(createdMsg::check, 10_000)); - assertTrue(failedNode.context().isStopping()); + assertTrue(waitForCondition(createdMsg::check, TIMEOUT)); + assertTrue(waitForCondition(() -> failedNode.context().isStopping(), TIMEOUT)); stopGrid(0); @@ -154,15 +152,20 @@ public void testUploadNodeFailDuringDeployment() throws Exception { GridFutureAdapter res = getFieldValue(t, "res"); return res.isDone(); - }, 10_000)); + }, TIMEOUT)); - assertTrue(waitForCondition(uploadNodeFailedMsg::check, 10_000)); - assertTrue(waitForCondition(rmvMsg::check, 10_000)); + assertTrue(waitForCondition(uploadNodeFailedMsg::check, TIMEOUT)); + assertTrue(waitForCondition(lostStateMsg::check, TIMEOUT)); assertTrue(waitForCondition( () -> !grid1.context().pdsFolderResolver().fileTree().classPathRoot("testcp").exists(), - 10_000 + TIMEOUT )); - assertNull(grid1.context().distributedMetastorage().read(metastorageKey("testcp"))); + + IgniteClassPath icp = grid1.context().distributedMetastorage().read(metastorageKey("testcp")); + + assertNotNull(icp); + assertEquals(LOST, icp.state()); + assertTrue(icp.deployedOnNodes().isEmpty()); } /** */ @@ -180,10 +183,10 @@ public void testDownloadNodeFailDuringDeployment() throws Exception { Set cpFiles = ClassPathTestUtils.files(); LogListener createdMsg = newClassPathListener(); - LogListener oneNodeFailMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); - LogListener readyMsg = logListener("ClassPath is READY. 2 of 3 nodes has its files"); + LogListener oneNodeFailMsg = logListener("IgniteClassPath task failure [task=Download files"); + LogListener donloadSucceedMsg = logListener("IgniteClassPath task done [task=Download files"); - lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg, readyMsg); + lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg, donloadSucceedMsg); ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); @@ -193,18 +196,26 @@ public void testDownloadNodeFailDuringDeployment() throws Exception { // ClassPath must be created on `failedNode`. Because, it first in cluster. new ClassPathCreateCommand().execute(null, grid(0), arg, l -> failedNode.log().info(l)); - assertTrue(waitForCondition(createdMsg::check, 10_000)); - assertTrue(failedNode.context().isStopping()); + assertTrue(waitForCondition(createdMsg::check, TIMEOUT)); + assertTrue(waitForCondition(() -> failedNode.context().isStopping(), TIMEOUT)); stopGrid(1); assertEquals(2, Ignition.allGrids().size()); - assertTrue(waitForCondition(oneNodeFailMsg::check, 10_000)); - assertTrue(waitForCondition(readyMsg::check, 10_000)); + assertTrue(waitForCondition(oneNodeFailMsg::check, TIMEOUT)); + assertTrue(waitForCondition(donloadSucceedMsg::check, TIMEOUT)); ClassPathTestUtils.checkFilesExists(grid(0), "testcp", cpFiles); ClassPathTestUtils.checkFilesExists(grid(2), "testcp", cpFiles); + + IgniteClassPath icp = grid(0).context().distributedMetastorage().read(ClassPathProcessor.metastorageKey("testcp")); + + assertNotNull(icp); + assertEquals(READY, icp.state()); + assertEquals(2, icp.deployedOnNodes().size()); + assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); + assertTrue(icp.deployedOnNodes().contains(grid(2).localNode().id())); } /** */ @@ -226,10 +237,9 @@ public void testConcurrentFileCreationDuringDeployment() throws Exception { }; LogListener createdMsg = newClassPathListener(); - LogListener oneNodeFailMsg = logListener("Failed to download ClassPath files from remote node [icp=testcp]"); - LogListener readyMsg = logListener("ClassPath is READY. 1 of 2 nodes has its files"); + LogListener oneNodeFailMsg = logListener("Failed to download ClassPath files [icp=testcp]"); - lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg, readyMsg); + lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg); ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); @@ -239,14 +249,22 @@ public void testConcurrentFileCreationDuringDeployment() throws Exception { // ClassPath must be created on `failedNode`. Because, it first in cluster. new ClassPathCreateCommand().execute(null, grid(0), arg, l -> grid(0).log().info(l)); - assertTrue(waitForCondition(createdMsg::check, 10_000)); + assertTrue(waitForCondition(createdMsg::check, TIMEOUT)); assertEquals(2, Ignition.allGrids().size()); - assertTrue(waitForCondition(oneNodeFailMsg::check, 10_000)); - assertTrue(waitForCondition(readyMsg::check, 10_000)); + assertTrue(waitForCondition(oneNodeFailMsg::check, TIMEOUT)); ClassPathTestUtils.checkFilesExists(grid(0), "testcp", cpFiles); + + IgniteClassPath icp = grid(0).context().distributedMetastorage().read(metastorageKey("testcp")); + + assertNotNull(icp); + assertEquals(READY, icp.state()); + assertEquals(1, icp.deployedOnNodes().size()); + assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); + + assertFalse(grid(1).context().pdsFolderResolver().fileTree().classPathRoot("testcp").exists()); } /** */ diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java index 57a427143622b..7064b1091212c 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java @@ -20,6 +20,7 @@ import java.nio.file.Path; import java.util.UUID; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; @@ -79,25 +80,27 @@ public void testMaliciousClassPathName() { /** */ @Test public void testUnknownFilename() throws IgniteCheckedException { - UUID icpId = cpProc().startCreation("mycp", new String[]{"file.txt"}, new long[]{42}); + UUID icpId0 = cpProc().startCreation("mycp", new String[]{"file.txt"}, new long[]{42}); assertThrows( null, () -> { - cpProc().copyClassPathFileLocally(icpId, Path.of("other.txt")); + cpProc().copyClassPathFileLocally(icpId0, Path.of("other.txt")); return null; }, - IllegalArgumentException.class, + IgniteException.class, "Unknown lib" ); + UUID icpId1 = cpProc().startCreation("mycp", new String[]{"file.txt"}, new long[]{42}); + assertThrows( null, () -> { - cpProc().writeFilePartFromClient(icpId, "other.txt", 0, new byte[1]); + cpProc().writeFilePartFromClient(icpId1, "other.txt", 0, new byte[1]); return null; }, - IllegalArgumentException.class, + IgniteException.class, "Unknown lib" ); } From 3249cf95df84109670c4d8f80913a43e118e56aa Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 22 Jun 2026 18:22:34 +0300 Subject: [PATCH 34/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../util/GridCommandHandlerClassPathTest.java | 1 + .../classpath/ChangeClassPathStateTask.java | 7 ++- .../classpath/ClassPathChangeListener.java | 11 +++- .../classpath/ClassPathProcessor.java | 59 +++++++++++++------ .../classpath/DownloadClassPathTask.java | 2 +- .../internal/classpath/IgniteClassPath.java | 4 +- .../RemoveNodeFromClassPathTask.java | 5 +- .../ClassPathCreationFailoverTest.java | 3 +- 8 files changed, 62 insertions(+), 30 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index de0b5ee550cf0..befdd926e6f36 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -93,6 +93,7 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT // Support pretty print for command. // TODO: reboot of in-memory cluster erase distributed metastorage state. ??? + // TODO: support deployment on newly joined node. /** Tests --create command. */ @Test diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java index 40257cd84f5f2..ee99f20525d4b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java @@ -16,11 +16,12 @@ */ package org.apache.ignite.internal.classpath; - import java.util.UUID; import org.apache.ignite.internal.GridKernalContext; -/** */ +/** + * Changes {@link IgniteClassPath} state to {@link #state}. + */ public class ChangeClassPathStateTask extends ClassPathProcessor.ClassPathTask { /** New {@link IgniteClassPath} state. */ private final IgniteClassPathState state; @@ -34,7 +35,7 @@ public ChangeClassPathStateTask(GridKernalContext ctx, UUID icpId, IgniteClassPa /** {@inheritDoc} */ @Override void start() { - ctx.classPath().modifyInMetastorageAsync(icpId, null,icp -> icp.newState(state)).listen(this::finishTaskWithFutureResult); + ctx.classPath().modifyInMetastorageAsync(icpId, null, icp -> icp.newState(state)).listen(this::finishTaskWithFutureResult); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index 173fa2f7d6e72..9bda008c80712 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -27,6 +27,8 @@ import static org.apache.ignite.internal.classpath.ClassPathProcessor.className; import static org.apache.ignite.internal.classpath.ClassPathProcessor.isClassPath; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; /** * Listener of {@link DistributedMetaStorage} updates related to {@link IgniteClassPath} instances. @@ -67,7 +69,7 @@ public ClassPathChangeListener(GridKernalContext ctx) { return; } - if (newIcp.deployedOnNodes().isEmpty()) { + if (newIcp.deployedOnNodes().isEmpty() && (newIcp.state() == NEW || newIcp.state() == READY)) { log.warning("All nodes that haves IgniteClassPath files left the grid [icp=" + newIcp.name() + ']'); ctx.classPath().addClassPathTask(newIcp, new ChangeClassPathStateTask(ctx, newIcp.id(), IgniteClassPathState.LOST)); @@ -88,7 +90,7 @@ public ClassPathChangeListener(GridKernalContext ctx) { break; case READY: - if (oldIcp.state() == IgniteClassPathState.NEW) { + if (oldIcp == null || oldIcp.state() == NEW) { if (newIcp.deployedOnNodes().contains(ctx.localNodeId())) { if (log.isDebugEnabled()) log.debug("Event ignored. IgniteClassPath deployed on node, already: " + newIcp); @@ -105,6 +107,11 @@ public ClassPathChangeListener(GridKernalContext ctx) { break; + case LOST: + log.info("IgniteClassPath lost. Handle of LOST state not supported at a time"); + + break; + case REMOVING: log.info("IgniteClassPath removed. Remove operation not supported at a time"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 8bd7d772e98eb..68f0c7438ee6a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -60,8 +60,6 @@ * Do we want to have some flag to skip remove in this case? (if we preparing for ICP registration). * 3. Should we include CP into snapshots and dumps? * 4. Should we control file size to ensure disk free space enough to upload CP files? - * - // TODO: remove from deployedNodes on OnNodeLeft event. */ public class ClassPathProcessor extends GridProcessorAdapter implements DistributedMetastorageLifecycleListener { /** Prefix for metastorage keys. */ @@ -94,22 +92,28 @@ public ClassPathProcessor(GridKernalContext ctx) { UUID leftNodeId = evt.eventNode().id(); try { - ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, val) -> { - if (!isClassPath(val)) { - log.warning("Wrong data in IgniteClassPath metastorage data [key=" + key + ", val=" + (val) + ']'); + ctx.pools().getSystemExecutorService().submit(() -> { + try { + ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, val) -> { + if (!isClassPath(val)) { + log.warning("Wrong data in IgniteClassPath metastorage data [key=" + key + ", val=" + (val) + ']'); - return; - } + return; + } - IgniteClassPath icp = (IgniteClassPath)val; + IgniteClassPath icp = (IgniteClassPath)val; - addClassPathTask(icp, new RemoveNodeFromClassPathTask(ctx, icp.id(), leftNodeId)); + addClassPathTask(icp, new RemoveNodeFromClassPathTask(ctx, icp.id(), leftNodeId)); + }); + } + catch (IgniteCheckedException e) { + log.warning("Distributed metastore iteration error", e); + } }); } - catch (IgniteCheckedException e) { - log.warning("Distributed metastore iteration error", e); + catch (RejectedExecutionException e) { + log.warning("System pool rejected task", e); } - }, EVT_NODE_LEFT, EVT_NODE_FAILED); } } @@ -284,15 +288,16 @@ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { if (tasks == null) tasks = new ConcurrentLinkedQueue<>(); - if (tasks.peek().result() == doneFut) { + if (tasks.peek() != null && tasks.peek().result() == doneFut) { tasks.poll(); - startAsync(tasks.peek()); + if (!F.isEmpty(tasks)) + startAsync(tasks.peek()); } else tasks.removeIf(t -> t == task); - return tasks; + return F.isEmpty(tasks) ? null : tasks; }); }); @@ -394,6 +399,8 @@ private void modifyWithRetriesAsync( log.error("Reached hard limit on CAS attempts. Fail operation [icpId=" + icpId + ", state=" + state + ']'); res.onDone(new IgniteException("Hard limit of CAS reached")); + + return; } try { @@ -574,10 +581,24 @@ protected ClassPathTask(GridKernalContext ctx, UUID icpId) { this.log = ctx.log(getClass()); result().listen(resFut -> { - if (resFut.error() == null) - ok(); - else - fail(resFut.error()); + try { + if (resFut.error() == null) + ok(); + else + fail(resFut.error()); + } + finally { + ClassPathTask t = this; + + ctx.classPath().icpTasks.compute(icpId, (ignored, tasks) -> { + if (tasks == null) + return null; + + tasks.remove(t); + + return F.isEmpty(tasks) ? null : tasks; + }); + } }); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java index 2473638bc0202..727142c7cecde 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -77,7 +77,7 @@ protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { log.debug("ClassPath files from remote node has been fully received [icp=" + icp.name() + ']'); ctx.classPath() - .modifyInMetastorageAsync(icpId, READY, state -> state.addDeployeOnNode(ctx.localNodeId())) + .modifyInMetastorageAsync(icpId, READY, state -> state.addDeployedOnNode(ctx.localNodeId())) .listen(this::finishTaskWithFutureResult); }); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index d3c4d52eaba9a..08bf21b058487 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -106,7 +106,7 @@ IgniteClassPath newState(IgniteClassPathState state) { * @param node Node to add. * @return Instance with modified set. */ - IgniteClassPath addDeployeOnNode(UUID node) { + IgniteClassPath addDeployedOnNode(UUID node) { if (deployedOnNodes.contains(node)) return this; @@ -122,7 +122,7 @@ IgniteClassPath addDeployeOnNode(UUID node) { * @param node Node to add. * @return Instance with modified set. */ - public IgniteClassPath removeDeployeOnNode(UUID node) { + public IgniteClassPath removeDeployedOnNode(UUID node) { if (!deployedOnNodes.contains(node)) return this; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java index da8f1eb07c767..cf383e5ad943e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java @@ -19,6 +19,9 @@ import java.util.UUID; import org.apache.ignite.internal.GridKernalContext; +/** + * Removes {@link #node2rmv} from {@link IgniteClassPath#deployedOnNodes()} set. + */ public class RemoveNodeFromClassPathTask extends ClassPathProcessor.ClassPathTask { /** Node to remove from {@link IgniteClassPath#deployedOnNodes()} set. */ private final UUID node2rmv; @@ -32,7 +35,7 @@ public RemoveNodeFromClassPathTask(GridKernalContext ctx, UUID icpId, UUID node2 /** {@inheritDoc} */ @Override void start() { ctx.classPath() - .modifyInMetastorageAsync(icpId, null, icp -> icp.removeDeployeOnNode(node2rmv)) + .modifyInMetastorageAsync(icpId, null, icp -> icp.removeDeployedOnNode(node2rmv)) .listen(this::finishTaskWithFutureResult); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index c00d6290943a7..41a360d946ec8 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -123,8 +123,7 @@ public void testUploadNodeFailDuringDeployment() throws Exception { LogListener createdMsg = newClassPathListener(); LogListener uploadNodeFailedMsg = logListener("Failed to download ClassPath files [icp=testcp]"); - LogListener lostStateMsg = - LogListener.matches("IgniteClassPath task done [task=ChangeClassPathState[newState=LOST]").times(2).build(); + LogListener lostStateMsg = logListener("IgniteClassPath task done [task=ChangeClassPathState[newState=LOST]"); lsnrLog.registerAllListeners(createdMsg, uploadNodeFailedMsg, lostStateMsg); From 4e8ee6931d5124be0912f9843fd38f2f3eb812b0 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 23 Jun 2026 00:19:34 +0300 Subject: [PATCH 35/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../util/GridCommandHandlerClassPathTest.java | 1 + .../ClassPathFilesTransmissionHandler.java | 22 +++++----- .../classpath/ClassPathProcessor.java | 40 ++++++++++++++----- .../DownloadClassPathFailureMessage.java | 4 +- .../classpath/ClassPathCreateCommand.java | 7 +++- .../classpath/ClassPathStartCreationTask.java | 2 +- .../ClassPathMailicuosRequestsTest.java | 19 +++++++++ 7 files changed, 68 insertions(+), 27 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index befdd926e6f36..db560addb0f39 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -94,6 +94,7 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT // Support pretty print for command. // TODO: reboot of in-memory cluster erase distributed metastorage state. ??? // TODO: support deployment on newly joined node. + // TODO: add MAX file size check, free disk amount check. /** Tests --create command. */ @Test diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index ab912422bbaae..cece90a05e3e1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -221,18 +221,16 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred catch (Exception t) { U.error(log, "Error processing ClassPath file request [request=" + msg + ", nodeId=" + nodeId + ']', t); - if (icp != null) { - try { - ctx.io().sendToCustomTopic( - nodeId, - FILES_TOPIC, - new DownloadClassPathFailureMessage(icp, t.getMessage()), - SYSTEM_POOL - ); - } - catch (Exception e) { - log.warning("Error notifying node of send error", e); - } + try { + ctx.io().sendToCustomTopic( + nodeId, + FILES_TOPIC, + new DownloadClassPathFailureMessage(msg.icpId, t.getMessage()), + SYSTEM_POOL + ); + } + catch (Exception e) { + log.warning("Error notifying node of send error", e); } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 68f0c7438ee6a..ab84242eb0985 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.classpath; import java.io.File; +import java.io.IOException; import java.io.RandomAccessFile; import java.io.Serializable; import java.nio.file.Files; @@ -31,6 +32,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.RejectedExecutionException; import java.util.function.Function; +import java.util.function.LongSupplier; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; @@ -184,7 +186,7 @@ public synchronized void writeFilePartFromClient( IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); try { - ensureKnownFilename(name, icp); + ensureKnownFilename(name, icp, () -> offset + batch.length); File root = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); @@ -213,7 +215,7 @@ public synchronized void writeFilePartFromClient( log.error("Failed to upload ClassPath file, the ClassPath will be removed " + "[name=" + icp.name() + ", id=" + icpId + ", file=" + name + ']', e); - cleanup(icp, false); + cleanup(icpId, false); throw new IgniteException(e); } @@ -231,7 +233,14 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { try { String name = file.getFileName().toString(); - ensureKnownFilename(name, icp); + ensureKnownFilename(name, icp, () -> { + try { + return Files.size(file); + } + catch (IOException e) { + throw new IgniteException(e); + } + }); File root = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); @@ -257,7 +266,7 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { log.error("Failed to copy ClassPath file locally, the ClassPath will be removed " + "[name=" + icp.name() + ", id=" + icpId + ']', e); - cleanup(icp, false); + cleanup(icpId, false); throw new IgniteException(e); } @@ -481,11 +490,18 @@ private static void ensureFilename(String file) { } /** */ - private static void ensureKnownFilename(String name, IgniteClassPath icp) { + private static void ensureKnownFilename(String name, IgniteClassPath icp, LongSupplier lastByteOffset) { ensureFilename(name); - if (F.indexOf(icp.files(), name) == -1) + int idx = F.indexOf(icp.files(), name); + + if (idx == -1) throw new IllegalArgumentException("Unknown lib [icp=" + icp.name() + ", unknown_lib=" + name + ']'); + + long length = icp.lengths()[idx]; + + if (lastByteOffset.getAsLong() > length) + throw new IllegalArgumentException("Unexpected file offset [icp=" + icp.name() + ", file=" + name + ']'); } /** */ @@ -499,16 +515,16 @@ else if (!F.isEmpty(root.listFiles())) /** * Asynchronously removes the classpath metastorage record and deletes its local files. * - * @param icp ClassPath to clean up. + * @param icpId ClassPath id. * @param loc If {@code true} then delete local files, only. Don't remove distributed key. */ - IgniteInternalFuture cleanupAsync(IgniteClassPath icp, boolean loc) { + IgniteInternalFuture cleanupAsync(UUID icpId, boolean loc) { try { GridFutureAdapter res = new GridFutureAdapter<>(); ctx.pools().getSystemExecutorService().submit(() -> { try { - cleanup(icp, loc); + cleanup(icpId, loc); res.onDone((Void)null); } @@ -534,10 +550,12 @@ IgniteInternalFuture cleanupAsync(IgniteClassPath icp, boolean loc) { /** * Removes the classpath metastorage record and deletes its local files. * - * @param icp ClassPath to clean up. + * @param icpId ClassPath id to clean up. * @param loc If {@code true} then delete local files, only. Don't remove distributed key. */ - void cleanup(IgniteClassPath icp, boolean loc) { + void cleanup(UUID icpId, boolean loc) { + IgniteClassPath icp = fromMetastorage(icpId, null, ctx); + if (!loc) { try { ctx.distributedMetastorage().remove(metastorageKey(icp.name())); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathFailureMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathFailureMessage.java index d93581013a5d6..5fd7811808fcd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathFailureMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathFailureMessage.java @@ -48,8 +48,8 @@ public DownloadClassPathFailureMessage() { } /** */ - public DownloadClassPathFailureMessage(IgniteClassPath icp, String err) { - this.icpId = icp.id(); + public DownloadClassPathFailureMessage(UUID icpId, String err) { + this.icpId = icpId; this.err = err; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java index 537b83d8a1618..eba7fe83498f4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCreateCommand.java @@ -145,7 +145,12 @@ private static ClusterNode uploadNode(IgniteClient client, Ignite ignite) { if (F.isEmpty(nodes)) throw new IllegalStateException("Not connected to node"); - return client.cluster().node(F.first(nodes)); + ClusterNode node = client.cluster().node(F.first(nodes)); + + if (node == null) + throw new IllegalStateException("Selected node leave the cluster: "); + + return node; } return ignite.cluster().localNode(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java index 4376bbb38b30c..606253e5a85e0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathStartCreationTask.java @@ -50,7 +50,7 @@ protected ClassPathStartCreationJob(@Nullable ClassPathCreateCommandArg arg, boo return ignite.context().classPath().startCreation(arg.name, arg.files, arg.lengths); } catch (IgniteCheckedException e) { - throw new RuntimeException(e); + throw new IgniteException(e); } } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java index 7064b1091212c..762301629f86b 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java @@ -21,6 +21,7 @@ import java.util.UUID; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; @@ -105,6 +106,24 @@ public void testUnknownFilename() throws IgniteCheckedException { ); } + + /** */ + @Test + public void testWrongOffset() throws IgniteCheckedException { + UUID icpId = cpProc().startCreation("mycp", new String[]{"file.txt"}, new long[]{42}); + + assertThrows( + null, + () -> { + cpProc().writeFilePartFromClient(icpId, "file.txt", U.GB, new byte[] {0}); + return null; + }, + IgniteException.class, + "Unexpected file offset [icp=mycp, file=file.txt]" + ); + } + + /** */ private ClassPathProcessor cpProc() { return grid(0).context().classPath(); From 114405a4c5520c5ab9887c64dd81669d68b6981f Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 23 Jun 2026 00:32:49 +0300 Subject: [PATCH 36/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../classpath/ClassPathProcessor.java | 19 ++++++++++++++----- .../classpath/DownloadClassPathTask.java | 2 +- .../ClassPathMailicuosRequestsTest.java | 1 - 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index ab84242eb0985..1200f316c51dc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -556,12 +556,21 @@ IgniteInternalFuture cleanupAsync(UUID icpId, boolean loc) { void cleanup(UUID icpId, boolean loc) { IgniteClassPath icp = fromMetastorage(icpId, null, ctx); + String key = metastorageKey(icp.name()); + if (!loc) { - try { - ctx.distributedMetastorage().remove(metastorageKey(icp.name())); - } - catch (IgniteCheckedException e) { - log.error("Failed to remove ClassPath metastorage record [name=" + icp.name() + ']', e); + boolean rmvd = false; + + while (!rmvd) { + try { + rmvd = ctx.distributedMetastorage().compareAndRemove(key, icp) || ctx.distributedMetastorage().read(key) == null; + + if (!rmvd) + icp = fromMetastorage(icpId, null, ctx); + } + catch (IgniteCheckedException e) { + log.error("Failed to remove ClassPath metastorage record [name=" + icp.name() + ']', e); + } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java index 727142c7cecde..f0c223a1a1a6e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java @@ -96,7 +96,7 @@ protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { log.warning("Failed to download ClassPath files [icp=" + icp.name() + "]", t); // Cleanup local files. - ctx.classPath().cleanupAsync(icp, true); + ctx.classPath().cleanupAsync(icp.id(), true); } catch (Exception e) { log.warning("onDowloadFailed", e); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java index 762301629f86b..6fc6e6ba7e559 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java @@ -106,7 +106,6 @@ public void testUnknownFilename() throws IgniteCheckedException { ); } - /** */ @Test public void testWrongOffset() throws IgniteCheckedException { From 1de4f9579ddbc8ca184bd8f24ff440704a52b6cb Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 23 Jun 2026 00:51:35 +0300 Subject: [PATCH 37/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../internal/classpath/ClassPathMailicuosRequestsTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java index 6fc6e6ba7e559..6ca8bf977db59 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java @@ -122,7 +122,6 @@ public void testWrongOffset() throws IgniteCheckedException { ); } - /** */ private ClassPathProcessor cpProc() { return grid(0).context().classPath(); From bc4e1e5df0e9d8d68e74aa550b7fd664daed2e5d Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 23 Jun 2026 01:05:34 +0300 Subject: [PATCH 38/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../org/apache/ignite/util/GridCommandHandlerClassPathTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index db560addb0f39..800e7a16d9f3d 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -95,6 +95,7 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT // TODO: reboot of in-memory cluster erase distributed metastorage state. ??? // TODO: support deployment on newly joined node. // TODO: add MAX file size check, free disk amount check. + // TODO: concurrent command with the same name: MUST succeed only one /** Tests --create command. */ @Test From b73e53a2aacc677adf56b3584043323d0053ae2c Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 23 Jun 2026 01:49:07 +0300 Subject: [PATCH 39/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../util/GridCommandHandlerClassPathTest.java | 87 +++++++++++++++++-- .../classpath/ClassPathTestUtils.java | 2 +- 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 800e7a16d9f3d..2699e35b86a9f 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -20,7 +20,14 @@ import java.io.File; import java.io.IOException; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.GridKernalContext; @@ -28,11 +35,13 @@ import org.apache.ignite.internal.classpath.ClassPathTestUtils; import org.apache.ignite.internal.classpath.IgniteClassPath; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.ListeningTestLogger; import org.apache.ignite.testframework.LogListener; import org.junit.Test; import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; +import static org.apache.ignite.internal.classpath.ClassPathTestUtils.file; import static org.apache.ignite.internal.classpath.ClassPathTestUtils.fileNames; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_INVALID_ARGUMENTS; @@ -95,7 +104,75 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT // TODO: reboot of in-memory cluster erase distributed metastorage state. ??? // TODO: support deployment on newly joined node. // TODO: add MAX file size check, free disk amount check. - // TODO: concurrent command with the same name: MUST succeed only one + + /** Concurrent {@code --create} commands with the same name must result in exactly one success. */ + @Test + public void testConcurrentCreateSameName() throws Exception { + injectTestSystemOut(); + + int cmdCnt = 4; + + LogListener cpReadyLsnr = readyLogListener(GRID_CNT - 1); + + lsnrLog.registerListener(cpReadyLsnr); + + List> fileSets = new ArrayList<>(); + + for (int i = 0; i < cmdCnt; i++) + fileSets.add(Set.of(file(1000L * (i + 1) + i))); + + TestCommandHandler[] hnds = new TestCommandHandler[cmdCnt]; + + for (int i = 0; i < cmdCnt; i++) + hnds[i] = newCommandHandler(createTestLogger()); + + AtomicInteger okCnt = new AtomicInteger(); + AtomicInteger failCnt = new AtomicInteger(); + AtomicInteger idx = new AtomicInteger(); + + Set okFiles = new HashSet<>(); + + CountDownLatch latch = new CountDownLatch(cmdCnt); + + GridTestUtils.runMultiThreadedAsync(() -> { + int i = idx.getAndIncrement(); + + latch.countDown(); + + assertTrue(latch.await(getTestTimeout(), TimeUnit.MILLISECONDS)); + + int res = execute( + hnds[i], + "--class-path", "create", + "--name", cpName(), + "--files", String.join(",", ClassPathTestUtils.fileArg(fileSets.get(i))) + ); + + if (res == EXIT_CODE_OK) { + okCnt.incrementAndGet(); + + okFiles.addAll(fileSets.get(i)); + } + else + failCnt.incrementAndGet(); + + return null; + }, cmdCnt, "concurrent-cp-create").get(getTestTimeout()); + + assertEquals(1, okCnt.get()); + assertEquals(cmdCnt - 1, failCnt.get()); + assertTrue(waitForCondition(cpReadyLsnr::check, 30_000)); + + IgniteClassPath icp = classPath(); + + assertNotNull(icp); + assertEquals(READY, icp.state()); + assertEquals(GRID_CNT, icp.deployedOnNodes().size()); + + assertEquals(fileNames(okFiles), new HashSet<>(Arrays.asList(icp.files()))); + + checkFilesExists(cpName(), -1, okFiles); + } /** Tests --create command. */ @Test @@ -124,7 +201,7 @@ public void testCreate() throws Exception { assertTrue(icp.deployedOnNodes().contains(grid(1).localNode().id())); assertTrue(icp.deployedOnNodes().contains(grid(2).localNode().id())); - checkFilesExists(cpName(), -1); + checkFilesExists(cpName(), -1, cpFiles); } /** Tests --create command. */ @@ -157,7 +234,7 @@ public void testCreateWhenRootExists() throws Exception { assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); assertTrue(icp.deployedOnNodes().contains(grid(1).localNode().id())); - checkFilesExists(cpName(), FAIL_NODE_IDX); + checkFilesExists(cpName(), FAIL_NODE_IDX, cpFiles); } /** */ @@ -284,12 +361,12 @@ public void testEmptyFilesArgument() { } /** */ - private void checkFilesExists(String cpName, int skip) throws IOException { + private void checkFilesExists(String cpName, int skip, Set files) throws IOException { for (int i = 0; i < GRID_CNT; i++) { if (skip == i) continue; - ClassPathTestUtils.checkFilesExists(grid(i), cpName, cpFiles); + ClassPathTestUtils.checkFilesExists(grid(i), cpName, files); } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java index 0f851848632d6..84c60b64a3660 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java @@ -61,7 +61,7 @@ public static String[] fileArg(Set cpFiles) { } /** */ - private static Path file(long size) throws IOException { + public static Path file(long size) throws IOException { File f = File.createTempFile(size + "_bytes", ".temp"); f.deleteOnExit(); From d83a0809bbc5b6b180a329c403ce37c165e6ab24 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 23 Jun 2026 02:15:43 +0300 Subject: [PATCH 40/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../SecurityCommandHandlerPermissionsTest.java | 13 +++++++++++++ .../util/GridCommandHandlerClassPathTest.java | 1 - 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/SecurityCommandHandlerPermissionsTest.java b/modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/SecurityCommandHandlerPermissionsTest.java index 902bc9797d750..2eea8d8b0f745 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/SecurityCommandHandlerPermissionsTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/SecurityCommandHandlerPermissionsTest.java @@ -39,6 +39,7 @@ import org.apache.ignite.compute.ComputeTaskFuture; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.classpath.ClassPathTestUtils; import org.apache.ignite.internal.client.thin.ServicesTest; import org.apache.ignite.internal.managers.systemview.GridSystemViewManager; import org.apache.ignite.internal.processors.security.impl.TestSecurityData; @@ -67,6 +68,7 @@ import static org.apache.ignite.internal.processors.job.GridJobProcessor.JOBS_VIEW; import static org.apache.ignite.internal.processors.task.GridTaskProcessor.TASKS_VIEW; import static org.apache.ignite.internal.util.IgniteUtils.resolveIgnitePath; +import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_OPS; import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_CREATE; import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_DESTROY; import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_READ; @@ -150,6 +152,17 @@ public void testCacheClear() throws Exception { checkCommandPermissions(asList("--cache", "clear", "--caches", DEFAULT_CACHE_NAME), cachePermission(CACHE_REMOVE)); } + /** */ + @Test + public void testClassPathCreate() throws Exception { + String files = String.join(",", ClassPathTestUtils.fileArg(ClassPathTestUtils.files())); + + checkCommandPermissions( + asList("--class-path", "create", "--name", "secured_app", "--files", files), + systemPermissions(ADMIN_OPS) + ); + } + /** */ @Test public void testCacheCreate() throws Exception { diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 2699e35b86a9f..97e9022c4957a 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -96,7 +96,6 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT stopAllGrids(); } - // TODO: add test that classpath can be created only with ADMIN_OPS privelege. // TODO: add CRC or other check of file integrity. // TODO add in production code checks of files integriy. Perform file integrity check on startup. From 4e97e1da8dfec02a65053683ff449583f344e5d2 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 23 Jun 2026 11:38:40 +0300 Subject: [PATCH 41/54] IGNITE-28207 Move logic to metastorage listener instead of DistributedProcess --- .../internal/classpath/ClassPathProcessor.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 1200f316c51dc..30dd55d653a04 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -73,7 +73,10 @@ public class ClassPathProcessor extends GridProcessorAdapter implements Distribu /** System discovery message listener. */ private DiscoveryEventListener discoLsnr; - /** */ + /** + * {@link IgniteClassPath} tasks. + * Any actions with the specific {@link IgniteClassPath} instance must be done one by one to ensure local atomicity of changes. + */ private final ConcurrentMap>> icpTasks = new ConcurrentHashMap<>(); /** @@ -330,10 +333,14 @@ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { /** */ private void startAsync(ClassPathTask t) { - // TODO: check is stopped. - // TODO: async task to invoke start required? try { ctx.pools().getSystemExecutorService().submit(() -> { + if (ctx.isStopping()) { + t.result().onDone(new IgniteException("Not stopping")); + + return; + } + try { t.start(); } @@ -627,7 +634,6 @@ protected ClassPathTask(GridKernalContext ctx, UUID icpId) { }); } }); - } /** */ From a26ce2cada38e88545684f62ec15f474f67a2870 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 24 Jun 2026 19:10:15 +0300 Subject: [PATCH 42/54] IGNITE-28809 Logic for new node to catch up with cluster state. --- .../util/GridCommandHandlerClassPathTest.java | 12 +- ...lassPathTask.java => ChangeNodesTask.java} | 34 ++- ...athStateTask.java => ChangeStateTask.java} | 4 +- .../classpath/ClassPathChangeListener.java | 6 +- .../classpath/ClassPathProcessor.java | 206 ++++++++++++------ .../internal/classpath/CleanupTask.java | 91 ++++++++ ...adClassPathTask.java => DownloadTask.java} | 15 +- .../internal/classpath/IgniteClassPath.java | 54 ++++- .../persistence/filename/NodeFileTree.java | 26 ++- .../ClassPathCreationFailoverTest.java | 23 +- .../ClassPathMailicuosRequestsTest.java | 4 +- .../internal/classpath/ClassPathSelfTest.java | 166 ++++++++++++++ .../classpath/ClassPathTestUtils.java | 26 ++- 13 files changed, 566 insertions(+), 101 deletions(-) rename modules/core/src/main/java/org/apache/ignite/internal/classpath/{RemoveNodeFromClassPathTask.java => ChangeNodesTask.java} (54%) rename modules/core/src/main/java/org/apache/ignite/internal/classpath/{ChangeClassPathStateTask.java => ChangeStateTask.java} (90%) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java rename modules/core/src/main/java/org/apache/ignite/internal/classpath/{DownloadClassPathTask.java => DownloadTask.java} (88%) create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 97e9022c4957a..906e3f024de96 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -196,9 +196,10 @@ public void testCreate() throws Exception { assertEquals(READY, icp.state()); assertEquals(GRID_CNT, icp.deployedOnNodes().size()); - assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); - assertTrue(icp.deployedOnNodes().contains(grid(1).localNode().id())); - assertTrue(icp.deployedOnNodes().contains(grid(2).localNode().id())); + + ClassPathTestUtils.checkDeployedOn(grid(0), cpName()); + ClassPathTestUtils.checkDeployedOn(grid(1), cpName()); + ClassPathTestUtils.checkDeployedOn(grid(2), cpName()); checkFilesExists(cpName(), -1, cpFiles); } @@ -230,8 +231,9 @@ public void testCreateWhenRootExists() throws Exception { assertEquals(READY, icp.state()); assertEquals(2, icp.deployedOnNodes().size()); - assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); - assertTrue(icp.deployedOnNodes().contains(grid(1).localNode().id())); + + ClassPathTestUtils.checkDeployedOn(grid(0), cpName()); + ClassPathTestUtils.checkDeployedOn(grid(1), cpName()); checkFilesExists(cpName(), FAIL_NODE_IDX, cpFiles); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java similarity index 54% rename from modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java rename to modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java index cf383e5ad943e..c6bb2413dec9d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/RemoveNodeFromClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java @@ -20,38 +20,52 @@ import org.apache.ignite.internal.GridKernalContext; /** - * Removes {@link #node2rmv} from {@link IgniteClassPath#deployedOnNodes()} set. + * Removes {@link #node} from {@link IgniteClassPath#deployedOnNodes()} set. */ -public class RemoveNodeFromClassPathTask extends ClassPathProcessor.ClassPathTask { - /** Node to remove from {@link IgniteClassPath#deployedOnNodes()} set. */ - private final UUID node2rmv; +public class ChangeNodesTask extends ClassPathProcessor.ClassPathTask { + /** Node. */ + private final UUID node; + + /** Add flag. */ + private final boolean add; /** */ - public RemoveNodeFromClassPathTask(GridKernalContext ctx, UUID icpId, UUID node2rmv) { + private ChangeNodesTask(GridKernalContext ctx, UUID icpId, UUID node, boolean add) { super(ctx, icpId); - this.node2rmv = node2rmv; + this.node = node; + this.add = add; + } + + /** */ + public static ChangeNodesTask removeNode(GridKernalContext ctx, UUID icpId, UUID node) { + return new ChangeNodesTask(ctx, icpId, node, false); + } + + /** */ + public static ChangeNodesTask addNode(GridKernalContext ctx, UUID icpId, UUID node) { + return new ChangeNodesTask(ctx, icpId, node, true); } /** {@inheritDoc} */ @Override void start() { ctx.classPath() - .modifyInMetastorageAsync(icpId, null, icp -> icp.removeDeployedOnNode(node2rmv)) + .modifyInMetastorageAsync(icpId, null, icp -> add ? icp.addDeployedOnNode(node) : icp.removeDeployedOnNode(node)) .listen(this::finishTaskWithFutureResult); } /** {@inheritDoc} */ @Override String name() { - return "Remove node"; + return add ? "Add node" : "Remove node"; } /** {@inheritDoc} */ @Override void ok() { if (log.isDebugEnabled()) - log.debug("Node removed from ClassPath [icpId=" + icpId + ", node2rmv=" + node2rmv + ']'); + log.debug("ClassPath nodes changed [icpId=" + icpId + ", node=" + node + ", add=" + add + ']'); } /** {@inheritDoc} */ @Override void fail(Throwable t) { - log.warning("Fail to remove node from ClassPath [icpId=" + icpId + ", node2rmv=" + node2rmv + ']', t); + log.warning("Fail to change ClassPath nodes [icpId=" + icpId + ", node=" + node + ", add=" + add + ']', t); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java similarity index 90% rename from modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java rename to modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java index ee99f20525d4b..0a96962642208 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeClassPathStateTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java @@ -22,12 +22,12 @@ /** * Changes {@link IgniteClassPath} state to {@link #state}. */ -public class ChangeClassPathStateTask extends ClassPathProcessor.ClassPathTask { +class ChangeStateTask extends ClassPathProcessor.ClassPathTask { /** New {@link IgniteClassPath} state. */ private final IgniteClassPathState state; /** */ - public ChangeClassPathStateTask(GridKernalContext ctx, UUID icpId, IgniteClassPathState state) { + public ChangeStateTask(GridKernalContext ctx, UUID icpId, IgniteClassPathState state) { super(ctx, icpId); this.state = state; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index 9bda008c80712..f026da6efe285 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -36,7 +36,7 @@ * * @see ClassPathProcessor */ -public class ClassPathChangeListener implements DistributedMetaStorageListener { +class ClassPathChangeListener implements DistributedMetaStorageListener { /** */ private final IgniteLogger log; @@ -72,7 +72,7 @@ public ClassPathChangeListener(GridKernalContext ctx) { if (newIcp.deployedOnNodes().isEmpty() && (newIcp.state() == NEW || newIcp.state() == READY)) { log.warning("All nodes that haves IgniteClassPath files left the grid [icp=" + newIcp.name() + ']'); - ctx.classPath().addClassPathTask(newIcp, new ChangeClassPathStateTask(ctx, newIcp.id(), IgniteClassPathState.LOST)); + ctx.classPath().addClassPathTask(newIcp, new ChangeStateTask(ctx, newIcp.id(), IgniteClassPathState.LOST)); return; } @@ -100,7 +100,7 @@ public ClassPathChangeListener(GridKernalContext ctx) { log.info("IgniteClassPath READY. Starting download to local node."); - ctx.classPath().addClassPathTask(newIcp, new DownloadClassPathTask(ctx, newIcp.id())); + ctx.classPath().addClassPathTask(newIcp, new DownloadTask(ctx, newIcp.id())); } else log.warning("Wrong state change. Ignore [prev=" + oldIcp.state() + ", new=" + newIcp.state() + ']'); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 30dd55d653a04..f4d10bdf7d7d7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -18,12 +18,15 @@ package org.apache.ignite.internal.classpath; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.io.Serializable; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; +import java.util.Properties; import java.util.Queue; import java.util.Set; import java.util.UUID; @@ -31,18 +34,20 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.RejectedExecutionException; +import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.LongSupplier; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; +import org.apache.ignite.failure.FailureContext; +import org.apache.ignite.failure.FailureType; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.managers.eventstorage.DiscoveryEventListener; import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.processors.metastorage.DistributedMetastorageLifecycleListener; -import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; @@ -51,8 +56,11 @@ import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; +import static org.apache.ignite.internal.classpath.ChangeNodesTask.addNode; +import static org.apache.ignite.internal.classpath.ChangeNodesTask.removeNode; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.REMOVING; /** * TODO: @@ -99,17 +107,9 @@ public ClassPathProcessor(GridKernalContext ctx) { try { ctx.pools().getSystemExecutorService().submit(() -> { try { - ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, val) -> { - if (!isClassPath(val)) { - log.warning("Wrong data in IgniteClassPath metastorage data [key=" + key + ", val=" + (val) + ']'); - - return; - } - - IgniteClassPath icp = (IgniteClassPath)val; - - addClassPathTask(icp, new RemoveNodeFromClassPathTask(ctx, icp.id(), leftNodeId)); - }); + iterateMetastorage( + (key, icp) -> addClassPathTask(icp, removeNode(ctx, icp.id(), leftNodeId)) + ); } catch (IgniteCheckedException e) { log.warning("Distributed metastore iteration error", e); @@ -127,7 +127,36 @@ public ClassPathProcessor(GridKernalContext ctx) { @Override public void onKernalStart(boolean active) throws IgniteCheckedException { super.onKernalStart(active); + // Removing stale local data: + // 1. Partially downloaded: descriptor not exists or can't be read. + // 2. Differs from cluster state: id not equals. + // 3. Remove in progress: state REMOVING. + File[] staleRoots = staleLocalRoots(); + + if (!F.isEmpty(staleRoots)) { + for (File cpRoot : staleRoots) + removeClassPathLocally(cpRoot); + } + ctx.distributedMetastorage().listen(key -> key.startsWith(METASTORE_PREFIX), new ClassPathChangeListener(ctx)); + + iterateMetastorage((key, icp) -> { + NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); + + IgniteClassPath loc = readClassPathDescriptor(ft.classPathDescriptor(icp.name())); + + // Partially donwloaded or locally unknown ClassPath. + if (loc == null) { + addClassPathTask(icp, CleanupTask.localCleanup(ctx, icp.id())); + + if (icp.state() == READY) + addClassPathTask(icp, new DownloadTask(ctx, icp.id())); + + return; + } + + addClassPathTask(icp, addNode(ctx, icp.id(), ctx.localNodeId())); + }); } /** {@inheritDoc} */ @@ -218,7 +247,8 @@ public synchronized void writeFilePartFromClient( log.error("Failed to upload ClassPath file, the ClassPath will be removed " + "[name=" + icp.name() + ", id=" + icpId + ", file=" + name + ']', e); - cleanup(icpId, false); + // Cleaning up synchronously. + CleanupTask.clusterWideCleanup(ctx, icpId).start(); throw new IgniteException(e); } @@ -269,7 +299,8 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { log.error("Failed to copy ClassPath file locally, the ClassPath will be removed " + "[name=" + icp.name() + ", id=" + icpId + ']', e); - cleanup(icpId, false); + // Cleaning up synchronously. + CleanupTask.clusterWideCleanup(ctx, icpId).start(); throw new IgniteException(e); } @@ -279,7 +310,7 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { public void makeReady(UUID icpId) throws IgniteCheckedException { IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); - ChangeClassPathStateTask task = new ChangeClassPathStateTask(ctx, icpId, READY); + ChangeStateTask task = new ChangeStateTask(ctx, icpId, READY); addClassPathTask(icp, task); @@ -520,78 +551,121 @@ else if (!F.isEmpty(root.listFiles())) } /** - * Asynchronously removes the classpath metastorage record and deletes its local files. - * - * @param icpId ClassPath id. - * @param loc If {@code true} then delete local files, only. Don't remove distributed key. + * Iterates all existing {@link IgniteClassPath} in metastorage. + * @param action Action to invoke for each {@link IgniteClassPath} instance. + * @throws IgniteCheckedException In case of error. */ - IgniteInternalFuture cleanupAsync(UUID icpId, boolean loc) { - try { - GridFutureAdapter res = new GridFutureAdapter<>(); + private void iterateMetastorage(BiConsumer action) throws IgniteCheckedException { + ctx.distributedMetastorage().iterate(METASTORE_PREFIX, (key, val) -> { + if (!isClassPath(val)) { + log.warning("Wrong data in IgniteClassPath metastorage data [key=" + key + ", val=" + (val) + ']'); - ctx.pools().getSystemExecutorService().submit(() -> { - try { - cleanup(icpId, loc); + return; + } - res.onDone((Void)null); - } - catch (Throwable e) { - res.onDone(e); - } - }); + action.accept(key, (IgniteClassPath)val); + }); + } - if (log.isDebugEnabled()) { - res.listen(f -> { - if (log.isDebugEnabled()) - log.debug("Async cleanup done. " + (res.error() == null ? "OK" : "FAIL")); - }); - } + /** */ + public static boolean isClassPath(Serializable icp) { + return icp == null || icp instanceof IgniteClassPath; + } - return res; + /** */ + public static String className(@Nullable Serializable oldVal) { + return oldVal == null ? null : oldVal.getClass().getName(); + } + + /** */ + public static void writeClassPathDescriptor(NodeFileTree ft, IgniteClassPath icp) throws IOException { + File desc = ft.classPathDescriptor(icp.name()); + + try (FileOutputStream fos = new FileOutputStream(desc)) { + icp.toProperties().store(fos, null); } - catch (RejectedExecutionException e) { - return new GridFinishedFuture<>(e); + } + + /** */ + public @Nullable IgniteClassPath readClassPathDescriptor(File desc) { + if (!desc.exists()) + return null; + + try (FileInputStream fis = new FileInputStream(desc)) { + Properties p = new Properties(); + + p.load(fis); + + return IgniteClassPath.fromProperties(p, ctx.localNodeId()); + } + catch (Exception e) { + log.warning("Can't read ClassPath descriptor", e); + + return null; } } + /** */ + void removeClassPathLocally(File cpRoot) { + if (!cpRoot.exists() || U.delete(cpRoot)) + return; + + String err = "Can't delete local files. Remove manually [dir=" + cpRoot + ']'; + + log.warning(err); + + ctx.failure().process(new FailureContext(FailureType.CRITICAL_ERROR, new IgniteException(err))); + } + /** - * Removes the classpath metastorage record and deletes its local files. + * Checks local ClassPath roots with the cluster state. * - * @param icpId ClassPath id to clean up. - * @param loc If {@code true} then delete local files, only. Don't remove distributed key. + * @return Array of local ClassPath root directories to remove on start. */ - void cleanup(UUID icpId, boolean loc) { - IgniteClassPath icp = fromMetastorage(icpId, null, ctx); + private File[] staleLocalRoots() { + NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); - String key = metastorageKey(icp.name()); + return ft.classPathRoot().listFiles(cpRoot -> { + if (!cpRoot.isDirectory()) + return false; - if (!loc) { - boolean rmvd = false; + try { + IgniteClassPath loc = readClassPathDescriptor(ft.classPathDescriptor(cpRoot.getName())); - while (!rmvd) { - try { - rmvd = ctx.distributedMetastorage().compareAndRemove(key, icp) || ctx.distributedMetastorage().read(key) == null; + if (loc == null) + return true; + + Serializable fromMetastore = ctx.distributedMetastorage().read(metastorageKey(loc.name())); - if (!rmvd) - icp = fromMetastorage(icpId, null, ctx); + if (fromMetastore == null) { + log.info("Unknown local data. Removing [icp=" + loc + ']'); + + return true; } - catch (IgniteCheckedException e) { - log.error("Failed to remove ClassPath metastorage record [name=" + icp.name() + ']', e); + + if (!isClassPath(fromMetastore)) { + log.warning("Wrong data in IgniteClassPath metastorage data " + + "[key=" + metastorageKey(loc.name()) + ", val=" + fromMetastore + ']'); + + return true; } - } - } - U.delete(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); - } + IgniteClassPath rmt = (IgniteClassPath)fromMetastore; - /** */ - public static boolean isClassPath(Serializable icp) { - return icp == null || icp instanceof IgniteClassPath; - } + if (!Objects.equals(loc.id(), rmt.id()) || rmt.state() == REMOVING) { + log.info("Stale local data. Removing [loc=" + loc + ", rmt=" + rmt + ']'); - /** */ - public static String className(@Nullable Serializable oldVal) { - return oldVal == null ? null : oldVal.getClass().getName(); + return true; + } + } + catch (Exception e) { + log.warning("Error filter local root: " + cpRoot, e); + + return true; + } + + return false; + }); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java new file mode 100644 index 0000000000000..35f6ce769ba38 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.classpath; + +import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.GridKernalContext; + +import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; + +/** + * Removes {@link IgniteClassPath} metastorage record and deletes its local files. + */ +class CleanupTask extends ClassPathProcessor.ClassPathTask { + /** If {@code true} then remove only local data. */ + private final boolean loc; + + /** */ + private CleanupTask(GridKernalContext ctx, UUID icpId, boolean loc) { + super(ctx, icpId); + this.loc = loc; + } + + /** @return Task to clean up local files. */ + public static CleanupTask localCleanup(GridKernalContext ctx, UUID icpId) { + return new CleanupTask(ctx, icpId, true); + } + + /** @return Task to clean up both local files and metastorage record. */ + public static CleanupTask clusterWideCleanup(GridKernalContext ctx, UUID icpId) { + return new CleanupTask(ctx, icpId, false); + } + + /** {@inheritDoc} */ + @Override void start() { + IgniteClassPath icp = fromMetastorage(icpId, null, ctx); + + String key = metastorageKey(icp.name()); + + if (!loc) { + boolean rmvd = false; + + while (!rmvd) { + try { + rmvd = ctx.distributedMetastorage().compareAndRemove(key, icp) || ctx.distributedMetastorage().read(key) == null; + + if (!rmvd) + icp = fromMetastorage(icpId, null, ctx); + } + catch (IgniteCheckedException e) { + log.error("Failed to remove ClassPath metastorage record [name=" + icp.name() + ']', e); + } + } + } + + ctx.classPath().removeClassPathLocally(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); + + result().onDone(); + } + + /** {@inheritDoc} */ + @Override String name() { + return (loc ? "local " : "") + "cleanup"; + } + + /** {@inheritDoc} */ + @Override void ok() { + if (log.isDebugEnabled()) + log.debug("ClassPath cleanup done [icpId=" + icpId + ", loc=" + loc + ']'); + } + + /** {@inheritDoc} */ + @Override void fail(Throwable t) { + log.warning("Fail to cleanup ClassPath [icpId=" + icpId + ", loc=" + loc + ']', t); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java similarity index 88% rename from modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java rename to modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java index f0c223a1a1a6e..5ec944cbc7adc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadClassPathTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java @@ -32,12 +32,12 @@ * * @see ClassPathFilesTransmissionHandler */ -public class DownloadClassPathTask extends ClassPathProcessor.ClassPathTask { +class DownloadTask extends ClassPathProcessor.ClassPathTask { /** * @param ctx Kernal context. * @param icpId Ignite class path. */ - protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { + protected DownloadTask(GridKernalContext ctx, UUID icpId) { super(ctx, icpId); } @@ -76,6 +76,15 @@ protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { if (log.isDebugEnabled()) log.debug("ClassPath files from remote node has been fully received [icp=" + icp.name() + ']'); + try { + ClassPathProcessor.writeClassPathDescriptor(ctx.pdsFolderResolver().fileTree(), icp); + } + catch (Exception e) { + result().onDone(e); + + return; + } + ctx.classPath() .modifyInMetastorageAsync(icpId, READY, state -> state.addDeployedOnNode(ctx.localNodeId())) .listen(this::finishTaskWithFutureResult); @@ -96,7 +105,7 @@ protected DownloadClassPathTask(GridKernalContext ctx, UUID icpId) { log.warning("Failed to download ClassPath files [icp=" + icp.name() + "]", t); // Cleanup local files. - ctx.classPath().cleanupAsync(icp.id(), true); + ctx.classPath().addClassPathTask(icp, CleanupTask.localCleanup(ctx, icp.id())); } catch (Exception e) { log.warning("onDowloadFailed", e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java index 08bf21b058487..c4064ec6b5f22 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/IgniteClassPath.java @@ -21,10 +21,13 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Objects; +import java.util.Properties; import java.util.Set; import java.util.UUID; import org.apache.ignite.internal.util.typedef.internal.S; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; + /** * Class path POJO. */ @@ -63,6 +66,8 @@ public IgniteClassPath( long[] lengths, IgniteClassPathState state ) { + assert files.length == lengths.length; + this.id = id; this.deployedOnNodes = deployedOnNodes; this.name = name; @@ -71,6 +76,47 @@ public IgniteClassPath( this.state = state; } + /** */ + public static IgniteClassPath fromProperties(Properties p, UUID locNodeId) { + int sz = 0; + + while (p.containsKey("files." + sz)) + sz++; + + String[] files = new String[sz]; + long[] lengths = new long[sz]; + + for (int i = 0; i < sz; i++) { + files[i] = p.getProperty("files." + i); + lengths[i] = Long.parseLong(p.getProperty("length." + i)); + } + + return new IgniteClassPath( + UUID.fromString(p.getProperty("id")), + Set.of(locNodeId), + p.getProperty("name"), + files, + lengths, + IgniteClassPathState.valueOf(p.getProperty("state")) + ); + } + + /** */ + public Properties toProperties() { + Properties p = new Properties(); + + p.setProperty("id", id.toString()); + p.setProperty("name", name); + p.setProperty("state", state.name()); + + for (int i = 0; i < files.length; i++) { + p.setProperty("files." + i, files[i]); + p.setProperty("length." + i, Long.toString(lengths[i])); + } + + return p; + } + /** * @return {@code True} if {@code this} and {@code that} instances has all fields equals except {@link #deployedOnNodes}. */ @@ -114,7 +160,9 @@ IgniteClassPath addDeployedOnNode(UUID node) { deployedOnNodes0.add(node); - return new IgniteClassPath(id, deployedOnNodes0, name, files, lengths, state); + IgniteClassPathState newState = state == IgniteClassPathState.LOST ? READY : state; + + return new IgniteClassPath(id, deployedOnNodes0, name, files, lengths, newState); } /** @@ -130,7 +178,9 @@ public IgniteClassPath removeDeployedOnNode(UUID node) { deployedOnNodes0.remove(node); - return new IgniteClassPath(id, deployedOnNodes0, name, files, lengths, state); + IgniteClassPathState newState = (state == READY && deployedOnNodes0.isEmpty()) ? IgniteClassPathState.LOST : state; + + return new IgniteClassPath(id, deployedOnNodes0, name, files, lengths, newState); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java index 1ec5b0477e37f..ce5be13792d80 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/filename/NodeFileTree.java @@ -37,6 +37,7 @@ import org.apache.ignite.internal.cdc.CdcMain; import org.apache.ignite.internal.cdc.CdcManager; import org.apache.ignite.internal.cdc.CdcMode; +import org.apache.ignite.internal.classpath.IgniteClassPath; import org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; @@ -99,6 +100,16 @@ * │ ├── lock * │ ├── marshaller ← marshaller (shared between all local nodes) * │ │ └── 1645778359.classname0 + * │ ├── classpath ← classpath (shared between all local nodes) + * │ │ └── node00-e57e62a9-2ccf-4e1b-a11e-c24c21b9ed4c ← node classpath root dir (node 0). + * │ │ └── myapp_v1 ← classpath dir (ClassPath name "myapp_v1"). + * │ │ ├── mapp-api-1.0.0.jar ← classpath lib. + * │ │ └── mapp-impl-1.0.0.jar ← classpath lib. + * │ │ └── icp.properties ← classpath descriptor. + * │ │ └── myapp_v2 ← classpath dir (ClassPath name "myapp_v2"). + * │ │ ├── mapp-api-2.0.0.jar ← classpath lib. + * │ │ └── mapp-impl-2.0.0.jar ← classpath lib. + * │ │ └── icp.properties ← classpath descriptor. * │ ├── node00-e57e62a9-2ccf-4e1b-a11e-c24c21b9ed4c ← nodeStorage (node 0). * │ │ ├── cache-default ← cacheStorage (cache name "default"). * │ │ │ ├── cache_data.dat ← cache("default") configuration file. @@ -286,6 +297,9 @@ public class NodeFileTree extends SharedFileTree { /** Maintenance file name. */ private static final String MAINTENANCE_FILE_NAME = "maintenance_tasks.mntc"; + /** {@link IgniteClassPath} descriptor name. */ + public static final String ICP_DESCRIPTOR_NAME = "icp.properties"; + /** Folder name for consistent id. */ private final String folderName; @@ -1093,13 +1107,21 @@ public File maintenanceFile() { } /** - * @param name IgniteClassPath name. - * @return IgniteClassPath directory. + * @param name {@link IgniteClassPath} name. + * @return {@link IgniteClassPath} directory. */ public File classPathRoot(String name) { return new File(icp, name); } + /** + * @param name {@link IgniteClassPath} name. + * @return {@link IgniteClassPath} descriptor file. + */ + public File classPathDescriptor(String name) { + return new File(classPathRoot(name), ICP_DESCRIPTOR_NAME); + } + /** * @param includeMeta If {@code true} then include metadata directory into results. * @param filter Cache group names to filter. diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index 41a360d946ec8..f21025a577738 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -20,6 +20,7 @@ import java.io.File; import java.nio.file.Path; import java.util.Set; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.Ignition; import org.apache.ignite.cluster.ClusterNode; @@ -123,9 +124,8 @@ public void testUploadNodeFailDuringDeployment() throws Exception { LogListener createdMsg = newClassPathListener(); LogListener uploadNodeFailedMsg = logListener("Failed to download ClassPath files [icp=testcp]"); - LogListener lostStateMsg = logListener("IgniteClassPath task done [task=ChangeClassPathState[newState=LOST]"); - lsnrLog.registerAllListeners(createdMsg, uploadNodeFailedMsg, lostStateMsg); + lsnrLog.registerAllListeners(createdMsg, uploadNodeFailedMsg); ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); @@ -154,7 +154,16 @@ public void testUploadNodeFailDuringDeployment() throws Exception { }, TIMEOUT)); assertTrue(waitForCondition(uploadNodeFailedMsg::check, TIMEOUT)); - assertTrue(waitForCondition(lostStateMsg::check, TIMEOUT)); + assertTrue(waitForCondition(() -> { + try { + return grid1.context().distributedMetastorage().read(metastorageKey("testcp")).state() == LOST; + } + catch (IgniteCheckedException e) { + return false; + } + }, + TIMEOUT + )); assertTrue(waitForCondition( () -> !grid1.context().pdsFolderResolver().fileTree().classPathRoot("testcp").exists(), TIMEOUT @@ -213,8 +222,9 @@ public void testDownloadNodeFailDuringDeployment() throws Exception { assertNotNull(icp); assertEquals(READY, icp.state()); assertEquals(2, icp.deployedOnNodes().size()); - assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); - assertTrue(icp.deployedOnNodes().contains(grid(2).localNode().id())); + + ClassPathTestUtils.checkDeployedOn(grid(0), "testcp"); + ClassPathTestUtils.checkDeployedOn(grid(2), "testcp"); } /** */ @@ -261,7 +271,8 @@ public void testConcurrentFileCreationDuringDeployment() throws Exception { assertNotNull(icp); assertEquals(READY, icp.state()); assertEquals(1, icp.deployedOnNodes().size()); - assertTrue(icp.deployedOnNodes().contains(grid(0).localNode().id())); + + ClassPathTestUtils.checkDeployedOn(grid(0), "testcp"); assertFalse(grid(1).context().pdsFolderResolver().fileTree().classPathRoot("testcp").exists()); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java index 6ca8bf977db59..8c9064f92a3d1 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java @@ -27,7 +27,9 @@ import static org.apache.ignite.testframework.GridTestUtils.assertThrows; -/** */ +/** + * TODO: add filter for class path descriptor. + */ public class ClassPathMailicuosRequestsTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override protected void beforeTestsStarted() throws Exception { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java new file mode 100644 index 0000000000000..e9dbff408e028 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.classpath; + + +import java.io.File; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Set; +import java.util.UUID; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.management.classpath.ClassPathCreateCommand; +import org.apache.ignite.internal.management.classpath.ClassPathCreateCommandArg; +import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.testframework.ListeningTestLogger; +import org.apache.ignite.testframework.LogListener; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Test; + +import static org.apache.ignite.internal.classpath.ClassPathCreationFailoverTest.TIMEOUT; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; + +/** */ +public class ClassPathSelfTest extends GridCommonAbstractTest { + // New node moves LOST to READY. + // Check corrupted descriptor don't break node. + + /** {@inheritDoc} */ + @Override protected void beforeTest() throws Exception { + super.beforeTest(); + + stopAllGrids(); + + cleanPersistenceDir(); + } + + /** */ + @Test + public void testNewNodeDownloadExistingClassPathes() throws Exception { + IgniteEx srv = startGrid(0); + + Set cpFiles = ClassPathTestUtils.files(); + + ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); + + arg.name("testcp"); + arg.files(ClassPathTestUtils.fileArg(cpFiles)); + + new ClassPathCreateCommand().execute(null, grid(0), arg, l -> log.info(l)); + + checkState(srv, "testcp"); + + ClassPathTestUtils.checkDeployedOn(srv, "testcp"); + ClassPathTestUtils.checkFilesExists(srv, "testcp", cpFiles); + + IgniteEx srv1 = startGrid(1); + + ClassPathTestUtils.checkDeployedOn(srv1, "testcp"); + ClassPathTestUtils.checkFilesExists(grid(1), "testcp", cpFiles); + } + + /** */ + @Test + public void testNewNodeRemoveStaleOnStart() throws Exception { + IgniteEx srv = startGrid(0); + + Set cpFiles = ClassPathTestUtils.files(); + + ClassPathCreateCommandArg arg = new ClassPathCreateCommandArg(); + + arg.name("testcp"); + arg.files(ClassPathTestUtils.fileArg(cpFiles)); + + new ClassPathCreateCommand().execute(null, grid(0), arg, l -> log.info(l)); + + arg.name("testcp_v2"); + arg.files(ClassPathTestUtils.fileArg(cpFiles)); + + new ClassPathCreateCommand().execute(null, grid(0), arg, l -> log.info(l)); + + checkState(srv, "testcp"); + checkState(srv, "testcp_v2"); + + ClassPathTestUtils.checkFilesExists(grid(0), "testcp", cpFiles); + ClassPathTestUtils.checkFilesExists(grid(0), "testcp_v2", cpFiles); + + NodeFileTree ft = new NodeFileTree(new File(U.defaultWorkDirectory()), "second_node"); + + IgniteClassPath stale = new IgniteClassPath( + UUID.randomUUID(), + Collections.emptySet(), + "testcp_v2", + new String[] {".stale"}, + new long[] {42}, + READY + ); + + IgniteClassPath unknown = new IgniteClassPath( + UUID.randomUUID(), + Collections.emptySet(), + "unknown", + new String[] {".unknown"}, + new long[] {42}, + READY + ); + + + assertTrue(ft.classPathRoot(stale.name()).mkdirs()); + assertTrue(ft.classPathRoot(unknown.name()).mkdirs()); + + ClassPathProcessor.writeClassPathDescriptor(ft, stale); + ClassPathProcessor.writeClassPathDescriptor(ft, unknown); + + ListeningTestLogger lsnrLog = new ListeningTestLogger(log); + + LogListener rmvStaleLsnr = LogListener.matches("Stale local data. Removing " + + "[loc=IgniteClassPath [id=" + stale.id() + ", name=" + stale.name() + ", state=" + stale.state() + "]") + .times(1).build(); + + LogListener rmvUnknownLsnr = LogListener.matches("Unknown local data. Removing " + + "[icp=IgniteClassPath [id=" + unknown.id() + ", name=" + unknown.name() + ", state=" + unknown.state() + "]]") + .times(1).build(); + + + lsnrLog.registerAllListeners(rmvStaleLsnr, rmvUnknownLsnr); + + IgniteEx srv1 = startGrid(getConfiguration(getTestIgniteInstanceName(1)) + .setConsistentId("second_node") + .setGridLogger(lsnrLog)); + + assertTrue(waitForCondition(rmvStaleLsnr::check, TIMEOUT)); + assertTrue(waitForCondition(rmvUnknownLsnr::check, TIMEOUT)); + + ClassPathTestUtils.checkDeployedOn(srv, "testcp"); + ClassPathTestUtils.checkDeployedOn(srv1, "testcp_v2"); + + assertNull(srv.context().distributedMetastorage().read(metastorageKey("unknown"))); + } + + /** */ + private static void checkState(IgniteEx srv, String testcp_v2) throws IgniteCheckedException { + IgniteClassPath icp = srv.context().distributedMetastorage().read(metastorageKey(testcp_v2)); + + assertNotNull(icp); + assertEquals(READY, icp.state()); + assertTrue(icp.deployedOnNodes().contains(srv.localNode().id())); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java index 84c60b64a3660..7c9a0abf4bdfb 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java @@ -27,12 +27,18 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.util.typedef.internal.U; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; import static org.apache.ignite.testframework.GridTestUtils.getFieldValue; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** */ public class ClassPathTestUtils { @@ -93,10 +99,14 @@ public static void checkFilesExists(IgniteEx node, String cpName, Set cpFi Set nodeCpFiles = Files.list(ft.classPathRoot(cpName).toPath()).collect(Collectors.toSet()); + Set nodeCpFilesNames = fileNames(nodeCpFiles); + + nodeCpFilesNames.remove(NodeFileTree.ICP_DESCRIPTOR_NAME); + assertEquals( "Files must be deployed on each node", fileNames(cpFiles), - fileNames(nodeCpFiles) + nodeCpFilesNames ); for (Path cpFile : cpFiles) { @@ -108,6 +118,20 @@ public static void checkFilesExists(IgniteEx node, String cpName, Set cpFi } } + /** */ + public static void checkDeployedOn(IgniteEx srv, String cpName) throws IgniteInterruptedCheckedException { + assertTrue(waitForCondition(() -> { + try { + return srv.context().distributedMetastorage().read(metastorageKey(cpName)) + .deployedOnNodes().contains(srv.localNode().id()); + } + catch (IgniteCheckedException e) { + throw new IgniteException(e); + } + }, 10_000)); + } + + /** */ static ClassPathFilesTransmissionHandler transmissionHandler(IgniteEx grid1) { return getFieldValue(grid1.context().classPath(), "icpFilesHnd"); From 4a8440bff1dc0f3adf714584fd308c507aff062b Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 25 Jun 2026 01:14:36 +0300 Subject: [PATCH 43/54] IGNITE-28809 Logic for new node to catch up with cluster state. --- .../util/GridCommandHandlerClassPathTest.java | 6 +- .../classpath/ClassPathProcessor.java | 63 +++++++++++----- .../internal/classpath/CleanupTask.java | 73 ++++++++++++------- .../internal/classpath/DownloadTask.java | 5 +- .../internal/classpath/ClassPathSelfTest.java | 4 - .../classpath/ClassPathTestUtils.java | 5 +- .../IgniteSpiDeploymentSelfTestSuite.java | 2 + 7 files changed, 100 insertions(+), 58 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 906e3f024de96..49b64819c63dc 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -306,8 +306,8 @@ public void testFailWhenMetastoreExists() throws Exception { assertTrue(out.contains("Fail to register ClassPath. Same ClassPath exists, already?")); assertNotNull(grid(0).context().distributedMetastorage().read(ClassPathProcessor.metastorageKey(cpName()))); - assertTrue( - "Classpath directory must be created", + assertFalse( + "Classpath directory must be removed", grid(0).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).exists() ); assertTrue( @@ -362,7 +362,7 @@ public void testEmptyFilesArgument() { } /** */ - private void checkFilesExists(String cpName, int skip, Set files) throws IOException { + private void checkFilesExists(String cpName, int skip, Set files) throws IOException, IgniteCheckedException { for (int i = 0; i < GRID_CNT; i++) { if (skip == i) continue; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index f4d10bdf7d7d7..9fa8c87577d43 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -135,7 +135,8 @@ public ClassPathProcessor(GridKernalContext ctx) { if (!F.isEmpty(staleRoots)) { for (File cpRoot : staleRoots) - removeClassPathLocally(cpRoot); + if (!U.delete(cpRoot)) + throw new IgniteException("Cant delete stale ClassPath root: " + cpRoot); } ctx.distributedMetastorage().listen(key -> key.startsWith(METASTORE_PREFIX), new ClassPathChangeListener(ctx)); @@ -147,7 +148,7 @@ public ClassPathProcessor(GridKernalContext ctx) { // Partially donwloaded or locally unknown ClassPath. if (loc == null) { - addClassPathTask(icp, CleanupTask.localCleanup(ctx, icp.id())); + addClassPathTask(icp, CleanupTask.localCleanup(ctx, icp)); if (icp.state() == READY) addClassPathTask(icp, new DownloadTask(ctx, icp.id())); @@ -187,16 +188,18 @@ public UUID startCreation(String name, String[] files, long[] lengths) throws Ig IgniteClassPath icp = new IgniteClassPath(UUID.randomUUID(), Set.of(ctx.localNodeId()), name, files, lengths, NEW); - File root = ctx.pdsFolderResolver().fileTree().classPathRoot(name); - - createRootAndCheckIsEmpty(root); + createRootAndCheckIsEmpty(icp); Boolean metastorageWritten = casToMetastorageAsync(null, icp).get(); - if (metastorageWritten != null && !metastorageWritten) + if (metastorageWritten != null && !metastorageWritten) { + removeClassPathLocally(icp, true); + throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); + } - log.info("New IgniteClasspath created [root = " + root + ", icp=" + icp + ']'); + log.info("New IgniteClasspath created " + + "[root = " + ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()) + ", icp=" + icp + ']'); return icp.id(); } @@ -248,7 +251,7 @@ public synchronized void writeFilePartFromClient( "[name=" + icp.name() + ", id=" + icpId + ", file=" + name + ']', e); // Cleaning up synchronously. - CleanupTask.clusterWideCleanup(ctx, icpId).start(); + CleanupTask.clusterWideCleanup(ctx, icp).start(); throw new IgniteException(e); } @@ -300,7 +303,7 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { "[name=" + icp.name() + ", id=" + icpId + ']', e); // Cleaning up synchronously. - CleanupTask.clusterWideCleanup(ctx, icpId).start(); + CleanupTask.clusterWideCleanup(ctx, icp).start(); throw new IgniteException(e); } @@ -367,7 +370,7 @@ private void startAsync(ClassPathTask t) { try { ctx.pools().getSystemExecutorService().submit(() -> { if (ctx.isStopping()) { - t.result().onDone(new IgniteException("Not stopping")); + t.result().onDone(new IgniteException("Node stopping")); return; } @@ -542,14 +545,6 @@ private static void ensureKnownFilename(String name, IgniteClassPath icp, LongSu throw new IllegalArgumentException("Unexpected file offset [icp=" + icp.name() + ", file=" + name + ']'); } - /** */ - static void createRootAndCheckIsEmpty(File root) { - if (!root.exists()) - NodeFileTree.mkdir(root, "Ignite Class Path root"); - else if (!F.isEmpty(root.listFiles())) - throw new IgniteException("ClassPath root exists and not empty: " + root); - } - /** * Iterates all existing {@link IgniteClassPath} in metastorage. * @param action Action to invoke for each {@link IgniteClassPath} instance. @@ -606,7 +601,32 @@ public static void writeClassPathDescriptor(NodeFileTree ft, IgniteClassPath icp } /** */ - void removeClassPathLocally(File cpRoot) { + synchronized void createRootAndCheckIsEmpty(IgniteClassPath icp) { + File cpRoot = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); + + if (!cpRoot.exists()) + NodeFileTree.mkdir(cpRoot, "Ignite Class Path root"); + else if (!F.isEmpty(cpRoot.listFiles())) + throw new IgniteException("ClassPath root exists and not empty: " + cpRoot); + + try { + guardFile(cpRoot, icp.id()).createNewFile(); + } + catch (IOException e) { + throw new IgniteException(e); + } + } + + /** */ + synchronized void removeClassPathLocally(IgniteClassPath icp, boolean force) { + File cpRoot = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); + + if (!guardFile(cpRoot, icp.id()).exists() && !force) { + log.warning("No guard file found. Skip local data removal. ClassPath concurrently recreated? [icp=" + icp + ']'); + + return; + } + if (!cpRoot.exists() || U.delete(cpRoot)) return; @@ -617,6 +637,11 @@ void removeClassPathLocally(File cpRoot) { ctx.failure().process(new FailureContext(FailureType.CRITICAL_ERROR, new IgniteException(err))); } + /** */ + public static File guardFile(File cpRoot, UUID icpId) { + return new File(cpRoot, "." + icpId); + } + /** * Checks local ClassPath roots with the cluster state. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java index 35f6ce769ba38..1096415ef3d32 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java @@ -16,61 +16,80 @@ */ package org.apache.ignite.internal.classpath; -import java.util.UUID; +import java.io.Serializable; +import java.util.Objects; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; -import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; /** * Removes {@link IgniteClassPath} metastorage record and deletes its local files. */ class CleanupTask extends ClassPathProcessor.ClassPathTask { + /** */ + private final IgniteClassPath icp; + /** If {@code true} then remove only local data. */ private final boolean loc; /** */ - private CleanupTask(GridKernalContext ctx, UUID icpId, boolean loc) { - super(ctx, icpId); + private CleanupTask(GridKernalContext ctx, IgniteClassPath icp, boolean loc) { + super(ctx, icp.id()); + this.icp = icp; this.loc = loc; } /** @return Task to clean up local files. */ - public static CleanupTask localCleanup(GridKernalContext ctx, UUID icpId) { - return new CleanupTask(ctx, icpId, true); + public static CleanupTask localCleanup(GridKernalContext ctx, IgniteClassPath icp) { + return new CleanupTask(ctx, icp, true); } /** @return Task to clean up both local files and metastorage record. */ - public static CleanupTask clusterWideCleanup(GridKernalContext ctx, UUID icpId) { - return new CleanupTask(ctx, icpId, false); + public static CleanupTask clusterWideCleanup(GridKernalContext ctx, IgniteClassPath icp) { + return new CleanupTask(ctx, icp, false); } /** {@inheritDoc} */ @Override void start() { - IgniteClassPath icp = fromMetastorage(icpId, null, ctx); + if (!loc) + removeFromMetastorage(); - String key = metastorageKey(icp.name()); + ctx.classPath().removeClassPathLocally(icp, false); - if (!loc) { - boolean rmvd = false; + result().onDone(); + } - while (!rmvd) { - try { - rmvd = ctx.distributedMetastorage().compareAndRemove(key, icp) || ctx.distributedMetastorage().read(key) == null; + /** */ + private void removeFromMetastorage() { + try { + String key = metastorageKey(icp.name()); - if (!rmvd) - icp = fromMetastorage(icpId, null, ctx); - } - catch (IgniteCheckedException e) { - log.error("Failed to remove ClassPath metastorage record [name=" + icp.name() + ']', e); - } - } - } + int iter = 0; - ctx.classPath().removeClassPathLocally(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); + while (true) { + Serializable curData = ctx.distributedMetastorage().read(key); - result().onDone(); + if (curData == null || !ClassPathProcessor.isClassPath(curData) || !Objects.equals(((IgniteClassPath)curData).id(), icp.id())) + break; + + if (ctx.distributedMetastorage().compareAndRemove(key, curData)) + break; + + iter++; + + if (iter == 500) + throw new IgniteException("Too many iterations"); + + if (iter % 100 == 0) + log.warning("Remove operation makes too many iterations. Bug? [icp=" + icp + ", curData=" + curData + ']'); + + } + } + catch (IgniteCheckedException e) { + result().onDone(e); + } } /** {@inheritDoc} */ @@ -81,11 +100,11 @@ public static CleanupTask clusterWideCleanup(GridKernalContext ctx, UUID icpId) /** {@inheritDoc} */ @Override void ok() { if (log.isDebugEnabled()) - log.debug("ClassPath cleanup done [icpId=" + icpId + ", loc=" + loc + ']'); + log.debug("ClassPath cleanup done [icp=" + icp + ", loc=" + loc + ']'); } /** {@inheritDoc} */ @Override void fail(Throwable t) { - log.warning("Fail to cleanup ClassPath [icpId=" + icpId + ", loc=" + loc + ']', t); + log.warning("Fail to cleanup ClassPath [icp=" + icp + ", loc=" + loc + ']', t); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java index 5ec944cbc7adc..9b83cfd9b7d07 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java @@ -23,7 +23,6 @@ import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.util.typedef.F; -import static org.apache.ignite.internal.classpath.ClassPathProcessor.createRootAndCheckIsEmpty; import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; @@ -60,7 +59,7 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { return; } - createRootAndCheckIsEmpty(ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name())); + ctx.classPath().createRootAndCheckIsEmpty(icp); UUID rmtNode = F.rand(icp.deployedOnNodes()); @@ -105,7 +104,7 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { log.warning("Failed to download ClassPath files [icp=" + icp.name() + "]", t); // Cleanup local files. - ctx.classPath().addClassPathTask(icp, CleanupTask.localCleanup(ctx, icp.id())); + ctx.classPath().addClassPathTask(icp, CleanupTask.localCleanup(ctx, icp)); } catch (Exception e) { log.warning("onDowloadFailed", e); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java index e9dbff408e028..55e40bab8e345 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java @@ -16,7 +16,6 @@ */ package org.apache.ignite.internal.classpath; - import java.io.File; import java.nio.file.Path; import java.util.Collections; @@ -41,7 +40,6 @@ /** */ public class ClassPathSelfTest extends GridCommonAbstractTest { // New node moves LOST to READY. - // Check corrupted descriptor don't break node. /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { @@ -122,7 +120,6 @@ public void testNewNodeRemoveStaleOnStart() throws Exception { READY ); - assertTrue(ft.classPathRoot(stale.name()).mkdirs()); assertTrue(ft.classPathRoot(unknown.name()).mkdirs()); @@ -139,7 +136,6 @@ public void testNewNodeRemoveStaleOnStart() throws Exception { "[icp=IgniteClassPath [id=" + unknown.id() + ", name=" + unknown.name() + ", state=" + unknown.state() + "]]") .times(1).build(); - lsnrLog.registerAllListeners(rmvStaleLsnr, rmvUnknownLsnr); IgniteEx srv1 = startGrid(getConfiguration(getTestIgniteInstanceName(1)) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java index 7c9a0abf4bdfb..6cd4b629a5ce0 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathTestUtils.java @@ -94,14 +94,16 @@ public static Path file(long size) throws IOException { } /** */ - public static void checkFilesExists(IgniteEx node, String cpName, Set cpFiles) throws IOException { + public static void checkFilesExists(IgniteEx node, String cpName, Set cpFiles) throws IOException, IgniteCheckedException { NodeFileTree ft = node.context().pdsFolderResolver().fileTree(); + IgniteClassPath icp = node.context().distributedMetastorage().read(metastorageKey(cpName)); Set nodeCpFiles = Files.list(ft.classPathRoot(cpName).toPath()).collect(Collectors.toSet()); Set nodeCpFilesNames = fileNames(nodeCpFiles); nodeCpFilesNames.remove(NodeFileTree.ICP_DESCRIPTOR_NAME); + nodeCpFilesNames.remove(ClassPathProcessor.guardFile(ft.classPathRoot(cpName), icp.id()).getName()); assertEquals( "Files must be deployed on each node", @@ -131,7 +133,6 @@ public static void checkDeployedOn(IgniteEx srv, String cpName) throws IgniteInt }, 10_000)); } - /** */ static ClassPathFilesTransmissionHandler transmissionHandler(IgniteEx grid1) { return getFieldValue(grid1.context().classPath(), "icpFilesHnd"); diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java index d3cf9d702b244..fc8f639f8079d 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java @@ -19,6 +19,7 @@ import org.apache.ignite.internal.classpath.ClassPathCreationFailoverTest; import org.apache.ignite.internal.classpath.ClassPathMailicuosRequestsTest; +import org.apache.ignite.internal.classpath.ClassPathSelfTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiSelfTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiStartStopSelfTest; import org.junit.runner.RunWith; @@ -31,6 +32,7 @@ @Suite.SuiteClasses({ GridLocalDeploymentSpiSelfTest.class, GridLocalDeploymentSpiStartStopSelfTest.class, + ClassPathSelfTest.class, ClassPathMailicuosRequestsTest.class, ClassPathCreationFailoverTest.class }) From a9722320c1d2ddbb111201908f15e6cae93da482 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 25 Jun 2026 01:36:09 +0300 Subject: [PATCH 44/54] IGNITE-28809 Logic for new node to catch up with cluster state. --- .../org/apache/ignite/internal/classpath/ChangeNodesTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java index c6bb2413dec9d..140ccc4b3d28b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java @@ -20,7 +20,7 @@ import org.apache.ignite.internal.GridKernalContext; /** - * Removes {@link #node} from {@link IgniteClassPath#deployedOnNodes()} set. + * Removes or adds {@link #node} to {@link IgniteClassPath#deployedOnNodes()} set. */ public class ChangeNodesTask extends ClassPathProcessor.ClassPathTask { /** Node. */ From 215a858389cf37b2acbd1f777a0d85d7b28dedda Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 25 Jun 2026 15:38:10 +0300 Subject: [PATCH 45/54] IGNITE-28809 Test and changes to move from LOST to READY, again. --- .../classpath/ClassPathChangeListener.java | 5 +- .../classpath/ClassPathProcessor.java | 10 +++- .../internal/classpath/CleanupTask.java | 3 +- .../internal/classpath/ClassPathSelfTest.java | 56 +++++++++++++++++++ 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index f026da6efe285..7387ab710e401 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -27,6 +27,7 @@ import static org.apache.ignite.internal.classpath.ClassPathProcessor.className; import static org.apache.ignite.internal.classpath.ClassPathProcessor.isClassPath; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.LOST; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; @@ -72,7 +73,7 @@ public ClassPathChangeListener(GridKernalContext ctx) { if (newIcp.deployedOnNodes().isEmpty() && (newIcp.state() == NEW || newIcp.state() == READY)) { log.warning("All nodes that haves IgniteClassPath files left the grid [icp=" + newIcp.name() + ']'); - ctx.classPath().addClassPathTask(newIcp, new ChangeStateTask(ctx, newIcp.id(), IgniteClassPathState.LOST)); + ctx.classPath().addClassPathTask(newIcp, new ChangeStateTask(ctx, newIcp.id(), LOST)); return; } @@ -90,7 +91,7 @@ public ClassPathChangeListener(GridKernalContext ctx) { break; case READY: - if (oldIcp == null || oldIcp.state() == NEW) { + if (oldIcp == null || oldIcp.state() == NEW || oldIcp.state() == LOST) { if (newIcp.deployedOnNodes().contains(ctx.localNodeId())) { if (log.isDebugEnabled()) log.debug("Event ignored. IgniteClassPath deployed on node, already: " + newIcp); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 9fa8c87577d43..5b6f898ea2c22 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -25,6 +25,7 @@ import java.io.Serializable; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.Objects; import java.util.Properties; import java.util.Queue; @@ -61,6 +62,7 @@ import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.internal.classpath.IgniteClassPathState.REMOVING; +import static org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree.TMP_SUFFIX; /** * TODO: @@ -576,9 +578,15 @@ public static String className(@Nullable Serializable oldVal) { public static void writeClassPathDescriptor(NodeFileTree ft, IgniteClassPath icp) throws IOException { File desc = ft.classPathDescriptor(icp.name()); - try (FileOutputStream fos = new FileOutputStream(desc)) { + File tmp = new File(desc.getParentFile(), desc.getName() + TMP_SUFFIX); + + try (FileOutputStream fos = new FileOutputStream(tmp)) { icp.toProperties().store(fos, null); + + fos.getFD().sync(); } + + Files.move(tmp.toPath(), desc.toPath(), StandardCopyOption.ATOMIC_MOVE); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java index 1096415ef3d32..edd299acf9f99 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java @@ -22,6 +22,7 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.isClassPath; import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; /** @@ -71,7 +72,7 @@ private void removeFromMetastorage() { while (true) { Serializable curData = ctx.distributedMetastorage().read(key); - if (curData == null || !ClassPathProcessor.isClassPath(curData) || !Objects.equals(((IgniteClassPath)curData).id(), icp.id())) + if (curData == null || !isClassPath(curData) || !Objects.equals(((IgniteClassPath)curData).id(), icp.id())) break; if (ctx.distributedMetastorage().compareAndRemove(key, curData)) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java index 55e40bab8e345..d4f1be0ada821 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.classpath; import java.io.File; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; import java.util.Set; @@ -34,6 +35,7 @@ import static org.apache.ignite.internal.classpath.ClassPathCreationFailoverTest.TIMEOUT; import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; +import static org.apache.ignite.internal.classpath.IgniteClassPathState.LOST; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; @@ -151,6 +153,60 @@ public void testNewNodeRemoveStaleOnStart() throws Exception { assertNull(srv.context().distributedMetastorage().read(metastorageKey("unknown"))); } + /** */ + @Test + public void testNewNodeMoveFromLostToReady() throws Exception { + IgniteEx srv = startGrid(0); + + Set cpFiles = ClassPathTestUtils.files(); + + int idx = 0; + String[] names = new String[cpFiles.size()]; + long[] lengths = new long[cpFiles.size()]; + + for (Path cpFile : cpFiles) { + names[idx] = cpFile.getFileName().toString(); + lengths[idx] = Files.size(cpFile); + idx++; + } + + IgniteClassPath lost = new IgniteClassPath( + UUID.randomUUID(), + Collections.emptySet(), + "testcp", + names, + lengths, + LOST + ); + + assertTrue(srv.context().distributedMetastorage().compareAndSet(metastorageKey(lost.name()), null, lost)); + + NodeFileTree ft = new NodeFileTree(new File(U.defaultWorkDirectory()), "second_node"); + + File cpRoot = ft.classPathRoot(lost.name()); + + assertTrue(cpRoot.mkdirs()); + assertTrue(ClassPathProcessor.guardFile(cpRoot, lost.id()).createNewFile()); + ClassPathProcessor.writeClassPathDescriptor(ft, lost); + + for (Path cpFile : cpFiles) + Files.copy(cpFile, new File(cpRoot, cpFile.getFileName().toString()).toPath()); + + ListeningTestLogger lsnrLog = new ListeningTestLogger(log); + + IgniteEx srv1 = startGrid(getConfiguration(getTestIgniteInstanceName(1)) + .setConsistentId("second_node") + .setGridLogger(lsnrLog)); + + ClassPathTestUtils.checkDeployedOn(srv, "testcp"); + ClassPathTestUtils.checkDeployedOn(srv1, "testcp"); + + ClassPathTestUtils.checkFilesExists(srv, "testcp", cpFiles); + ClassPathTestUtils.checkFilesExists(srv1, "testcp", cpFiles); + + assertEquals(READY, srv.context().distributedMetastorage().read(metastorageKey(lost.name())).state()); + } + /** */ private static void checkState(IgniteEx srv, String testcp_v2) throws IgniteCheckedException { IgniteClassPath icp = srv.context().distributedMetastorage().read(metastorageKey(testcp_v2)); From c70764f24518997ae3ed93b1ae9243c6fb4faac5 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 8 Jul 2026 15:20:17 +0300 Subject: [PATCH 46/54] IGNITE-28207 Remove implementation WIP --- .../internal/classpath/ChangeStateTask.java | 2 +- .../classpath/ClassPathChangeListener.java | 78 +++++++++- .../classpath/ClassPathProcessor.java | 147 +++++++++++++++++- .../internal/classpath/CleanupTask.java | 67 +++----- .../internal/classpath/DownloadTask.java | 9 +- .../classpath/ClassPathCommand.java | 6 +- .../classpath/ClassPathRemoveCommand.java | 38 +++++ .../classpath/ClassPathRemoveCommandArg.java | 57 +++++++ .../classpath/ClassPathRemoveTask.java | 57 +++++++ 9 files changed, 397 insertions(+), 64 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommand.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveTask.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java index 0a96962642208..296eef2122f14 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java @@ -34,7 +34,7 @@ public ChangeStateTask(GridKernalContext ctx, UUID icpId, IgniteClassPathState s } /** {@inheritDoc} */ - @Override void start() { + @Override void start0() { ctx.classPath().modifyInMetastorageAsync(icpId, null, icp -> icp.newState(state)).listen(this::finishTaskWithFutureResult); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index 7387ab710e401..762dc092ba624 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -29,7 +29,6 @@ import static org.apache.ignite.internal.classpath.ClassPathProcessor.isClassPath; import static org.apache.ignite.internal.classpath.IgniteClassPathState.LOST; import static org.apache.ignite.internal.classpath.IgniteClassPathState.NEW; -import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; /** * Listener of {@link DistributedMetaStorage} updates related to {@link IgniteClassPath} instances. @@ -65,15 +64,13 @@ public ClassPathChangeListener(GridKernalContext ctx) { IgniteClassPath newIcp = (IgniteClassPath)newVal; if (newIcp == null) { - log.warning("IgniteClassPath removed. Remove operation not supported at a time"); + onRemoveFromMetastorage(oldIcp); return; } - if (newIcp.deployedOnNodes().isEmpty() && (newIcp.state() == NEW || newIcp.state() == READY)) { - log.warning("All nodes that haves IgniteClassPath files left the grid [icp=" + newIcp.name() + ']'); - - ctx.classPath().addClassPathTask(newIcp, new ChangeStateTask(ctx, newIcp.id(), LOST)); + if (newIcp.deployedOnNodes().isEmpty()) { + onNoDeployNodes(newIcp); return; } @@ -85,6 +82,13 @@ public ClassPathChangeListener(GridKernalContext ctx) { return; } + onChange(newIcp, oldIcp); + } + + /** + * Handles regular change in {@link IgniteClassPath}. + */ + private void onChange(IgniteClassPath newIcp, IgniteClassPath oldIcp) { switch (newIcp.state()) { case NEW: log.info("IgniteClassPath created. Waiting for READY state to start download file to local node."); @@ -101,6 +105,7 @@ public ClassPathChangeListener(GridKernalContext ctx) { log.info("IgniteClassPath READY. Starting download to local node."); + // TODO: save new state in descriptor. ctx.classPath().addClassPathTask(newIcp, new DownloadTask(ctx, newIcp.id())); } else @@ -109,12 +114,17 @@ public ClassPathChangeListener(GridKernalContext ctx) { break; case LOST: - log.info("IgniteClassPath lost. Handle of LOST state not supported at a time"); + // No-op. break; case REMOVING: - log.info("IgniteClassPath removed. Remove operation not supported at a time"); + // Don't check anything. Download task may be in progress. + // Cleanup will just raise log warning if local data not exists. + log.info("IgniteClassPath remove operation started. Local cleanup: " + newIcp); + + ctx.classPath().addClassPathTask(newIcp, CleanupTask.localCleanup(ctx, newIcp)); + ctx.classPath().addClassPathTask(newIcp, ChangeNodesTask.removeNode(ctx, newIcp.id(), ctx.localNodeId())); break; @@ -122,4 +132,56 @@ public ClassPathChangeListener(GridKernalContext ctx) { throw new IllegalArgumentException("Unknown IgniteClassPath state: " + newIcp.state()); } } + + /** + * Handle {@link IgniteClassPath} event when it removed from metastorage. + */ + private void onRemoveFromMetastorage(IgniteClassPath icp) { + // Maybe remove with force flag or error while uploading. + // Cancelling all in flight and remove right away. + ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name()); + + if (!ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()).exists()) { + log.info("IgniteClassPath removed: " + icp); + + return; + } + + // Concurrent class path tasks not run. Cleaning up without queue. Mostly harmless (no local data at the moment). + CleanupTask t = CleanupTask.localCleanup(ctx, icp); + + t.result().listen(() -> log.info("IgniteClassPath removed: " + icp)); + + ctx.classPath().startAsync(t); + } + + /** Handle {@link IgniteClassPath} event when no nodes that stores ClassPath files in cluster. */ + private void onNoDeployNodes(IgniteClassPath icp) { + assert icp.deployedOnNodes().isEmpty(); + + switch (icp.state()) { + case READY: + case NEW: + log.warning("All nodes that haves IgniteClassPath files left the grid [icp=" + icp.name() + ']'); + + ctx.classPath().addClassPathTask(icp, new ChangeStateTask(ctx, icp.id(), LOST)); + + break; + + case REMOVING: + ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name()); + + // Remove from metastorage after all nodes cleanup. + ctx.classPath().startAsync(CleanupTask.clusterWideCleanup(ctx, icp)); + + break; + case LOST: + // No-op. + + break; + + default: + throw new IllegalStateException("Unknown state: " + icp.state()); + } + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 5b6f898ea2c22..33102c89f5cb8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -49,6 +49,7 @@ import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.processors.metastorage.DistributedMetastorageLifecycleListener; +import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; @@ -72,8 +73,14 @@ * Do we want to have some flag to skip remove in this case? (if we preparing for ICP registration). * 3. Should we include CP into snapshots and dumps? * 4. Should we control file size to ensure disk free space enough to upload CP files? + * 5. TODO: support --force flag + * 6. TODO: support tasks stop. + * 7. TODO: stop tasks on */ public class ClassPathProcessor extends GridProcessorAdapter implements DistributedMetastorageLifecycleListener { + /** */ + private static final Queue> NO_NEW_TASKS = new ConcurrentLinkedQueue<>(); + /** Prefix for metastorage keys. */ static final String METASTORE_PREFIX = "icp."; @@ -170,6 +177,13 @@ public ClassPathProcessor(GridKernalContext ctx) { if (discoLsnr != null) ctx.event().removeDiscoveryEventListener(discoLsnr); } + + if (cancel) { + Set ids = icpTasks.keySet(); + + for (UUID id : ids) + cancelTasksAndDisallowNew(id, "unknown"); + } } /** @@ -322,6 +336,76 @@ public void makeReady(UUID icpId) throws IgniteCheckedException { task.result().get(); } + /** */ + public IgniteInternalFuture remove(String name, boolean force) { + try { + Serializable icp0 = ctx.distributedMetastorage().read(metastorageKey(name)); + + if (!isClassPath(icp0)) + throw new IgniteException("ClassPath not found: " + name); + + IgniteClassPath icp = (IgniteClassPath)icp0; + + if (force) { + log.warning("Forcefully removing ClassPath: " + icp); + + try { + removeFromMetastorage(icp); + + // Cleanup will be performed in {@link ClassPathChangeListener}. + return new GridFinishedFuture<>(); + } + catch (Exception e) { + return new GridFinishedFuture<>(e); + } + finally { + // Cleanup queue after key removed from metastore. + cancelTasksAndDisallowNew(icp.id(), icp.name()); + + icpTasks.remove(icp.id()); + } + } + + if (icp.state() == REMOVING) + return new GridFinishedFuture<>(); + + // Cleanup and metastorage removal will be performed in {@link ClassPathChangeListener}. + ChangeStateTask changeState = new ChangeStateTask(ctx, icp.id(), REMOVING); + + addClassPathTask(icp, changeState); + + return changeState.result(); + } + catch (Exception e) { + log.warning("Error while removing ClassPath", e); + + return new GridFinishedFuture<>(e); + } + } + + /** */ + void cancelTasksAndDisallowNew(UUID icpId, String name) { + Queue> tasks = icpTasks.put(icpId, NO_NEW_TASKS); + + if (!F.isEmpty(tasks)) { + // TODO: add cancel support in all tasks. + for (ClassPathTask task : tasks) { + log.info("Cancelling task [icp=" + name + ", task=" + task.name() + ']'); + + task.stopped = true; + } + + for (ClassPathTask task : tasks) { + try { + task.result().get(); + } + catch (IgniteCheckedException e) { + log.warning("Stoped task exception", e); + } + } + } + } + /** */ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { UUID icpId = icp.id(); @@ -333,6 +417,12 @@ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { log.warning("IgniteClassPath task failure [task=" + task.name() + ", icp=" + icp + ']', task.result().error()); icpTasks.compute(icpId, (ignored, tasks) -> { + if (tasks == NO_NEW_TASKS) { + log.debug("Tasks dropped. No new task allowed for ClassPath. Remove in progress? [icp=" + icp + ']'); + + return NO_NEW_TASKS; + } + if (tasks == null) tasks = new ConcurrentLinkedQueue<>(); @@ -350,6 +440,12 @@ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { }); icpTasks.compute(icpId, (ignored, tasks) -> { + if (tasks == NO_NEW_TASKS) { + log.debug("Tasks dropped. No new task allowed for ClassPath. Remove in progress? [icp=" + icp + ']'); + + return NO_NEW_TASKS; + } + if (tasks == null) tasks = new ConcurrentLinkedQueue<>(); @@ -368,7 +464,7 @@ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { } /** */ - private void startAsync(ClassPathTask t) { + void startAsync(ClassPathTask t) { try { ctx.pools().getSystemExecutorService().submit(() -> { if (ctx.isStopping()) { @@ -390,6 +486,32 @@ private void startAsync(ClassPathTask t) { } } + /** */ + void removeFromMetastorage(IgniteClassPath icp) throws IgniteCheckedException { + String key = metastorageKey(icp.name()); + + int iter = 0; + + while (true) { + Serializable curData = ctx.distributedMetastorage().read(key); + + if (curData == null || !isClassPath(curData) || !Objects.equals(((IgniteClassPath)curData).id(), icp.id())) + break; + + if (ctx.distributedMetastorage().compareAndRemove(key, curData)) + break; + + iter++; + + if (iter == 500) + throw new IgniteException("Too many iterations"); + + if (iter % 100 == 0) + log.warning("Remove operation makes too many iterations. Bug? [icp=" + icp + ", curData=" + curData + ']'); + + } + } + /** */ GridFutureAdapter casToMetastorageAsync(@Nullable IgniteClassPath prev, IgniteClassPath icp) { try { @@ -630,7 +752,8 @@ synchronized void removeClassPathLocally(IgniteClassPath icp, boolean force) { File cpRoot = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); if (!guardFile(cpRoot, icp.id()).exists() && !force) { - log.warning("No guard file found. Skip local data removal. ClassPath concurrently recreated? [icp=" + icp + ']'); + log.debug("No guard file found. Skip local data removal. " + + "ClassPath not presented locally or concurrently recreated? [icp=" + icp + ']'); return; } @@ -715,6 +838,9 @@ abstract static class ClassPathTask { /** */ protected final IgniteLogger log; + /** */ + volatile boolean stopped; + /** */ protected ClassPathTask(GridKernalContext ctx, UUID icpId) { this.ctx = ctx; @@ -756,7 +882,22 @@ void finishTaskWithFutureResult(IgniteInternalFuture action) { * Must be nonblocking and fast. * In case any exception throwed, {@link #result()} will be finished and task treated as done. */ - abstract void start() throws Exception; + final void start() { + if (stopped) { + result().onDone(new IgniteException("Stoped before start")); + + return; + } + + start0(); + } + + /** + * Starts task execution. + * Must be nonblocking and fast. + * In case any exception throwed, {@link #result()} will be finished and task treated as done. + */ + abstract void start0(); /** * @return Task name. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java index edd299acf9f99..1b2b4bceaf57d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java @@ -16,15 +16,9 @@ */ package org.apache.ignite.internal.classpath; -import java.io.Serializable; -import java.util.Objects; import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridKernalContext; -import static org.apache.ignite.internal.classpath.ClassPathProcessor.isClassPath; -import static org.apache.ignite.internal.classpath.ClassPathProcessor.metastorageKey; - /** * Removes {@link IgniteClassPath} metastorage record and deletes its local files. */ @@ -32,80 +26,55 @@ class CleanupTask extends ClassPathProcessor.ClassPathTask { /** */ private final IgniteClassPath icp; - /** If {@code true} then remove only local data. */ - private final boolean loc; + /** If {@code true} then remove from metastore. */ + private final boolean rmvFromMetastore; /** */ - private CleanupTask(GridKernalContext ctx, IgniteClassPath icp, boolean loc) { + private CleanupTask(GridKernalContext ctx, IgniteClassPath icp, boolean rmvFromMetastore) { super(ctx, icp.id()); this.icp = icp; - this.loc = loc; + this.rmvFromMetastore = rmvFromMetastore; } /** @return Task to clean up local files. */ public static CleanupTask localCleanup(GridKernalContext ctx, IgniteClassPath icp) { - return new CleanupTask(ctx, icp, true); + return new CleanupTask(ctx, icp, false); } /** @return Task to clean up both local files and metastorage record. */ public static CleanupTask clusterWideCleanup(GridKernalContext ctx, IgniteClassPath icp) { - return new CleanupTask(ctx, icp, false); + return new CleanupTask(ctx, icp, true); } /** {@inheritDoc} */ - @Override void start() { - if (!loc) - removeFromMetastorage(); + @Override void start0() { + if (rmvFromMetastore) { + try { + ctx.classPath().removeFromMetastorage(icp); + } + catch (IgniteCheckedException e) { + result().onDone(e); + } + } ctx.classPath().removeClassPathLocally(icp, false); result().onDone(); } - /** */ - private void removeFromMetastorage() { - try { - String key = metastorageKey(icp.name()); - - int iter = 0; - - while (true) { - Serializable curData = ctx.distributedMetastorage().read(key); - - if (curData == null || !isClassPath(curData) || !Objects.equals(((IgniteClassPath)curData).id(), icp.id())) - break; - - if (ctx.distributedMetastorage().compareAndRemove(key, curData)) - break; - - iter++; - - if (iter == 500) - throw new IgniteException("Too many iterations"); - - if (iter % 100 == 0) - log.warning("Remove operation makes too many iterations. Bug? [icp=" + icp + ", curData=" + curData + ']'); - - } - } - catch (IgniteCheckedException e) { - result().onDone(e); - } - } - /** {@inheritDoc} */ @Override String name() { - return (loc ? "local " : "") + "cleanup"; + return (rmvFromMetastore ? "local " : "") + "cleanup"; } /** {@inheritDoc} */ @Override void ok() { if (log.isDebugEnabled()) - log.debug("ClassPath cleanup done [icp=" + icp + ", loc=" + loc + ']'); + log.debug("ClassPath cleanup done [icp=" + icp + ", loc=" + rmvFromMetastore + ']'); } /** {@inheritDoc} */ @Override void fail(Throwable t) { - log.warning("Fail to cleanup ClassPath [icp=" + icp + ", loc=" + loc + ']', t); + log.warning("Fail to cleanup ClassPath [icp=" + icp + ", loc=" + rmvFromMetastore + ']', t); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java index 9b83cfd9b7d07..d1d32d00f87f6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java @@ -41,7 +41,7 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { } /** {@inheritDoc} */ - @Override public void start() throws Exception { + @Override public void start0() { IgniteClassPath icp = fromMetastorage(icpId, READY, ctx); if (icp.deployedOnNodes().contains(ctx.localNodeId())) { @@ -63,6 +63,13 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { UUID rmtNode = F.rand(icp.deployedOnNodes()); + if (stopped) { + result().onDone(new IgniteException("Download task stoped")); + + return; + } + + // TODO: pass stop flag to download. IgniteInternalFuture downloadRes = ctx.classPath().icpFilesHnd.downloadLocally(rmtNode, icp); downloadRes.listen(f -> { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCommand.java index f297278661da7..b253c687f2765 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathCommand.java @@ -17,14 +17,16 @@ package org.apache.ignite.internal.management.classpath; +import org.apache.ignite.internal.classpath.IgniteClassPath; import org.apache.ignite.internal.management.api.CommandRegistryImpl; -/** Command to manage IgniteClassPath. */ +/** Command to manage {@link IgniteClassPath}. */ public class ClassPathCommand extends CommandRegistryImpl { /** */ public ClassPathCommand() { super( - new ClassPathCreateCommand() + new ClassPathCreateCommand(), + new ClassPathRemoveCommand() ); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommand.java new file mode 100644 index 0000000000000..e50f1496c4e08 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommand.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.management.classpath; + +import org.apache.ignite.internal.management.api.ComputeCommand; +import org.apache.ignite.internal.visor.VisorMultiNodeTask; + +/** */ +public class ClassPathRemoveCommand implements ComputeCommand { + /** {@inheritDoc} */ + @Override public Class> taskClass() { + return ClassPathRemoveTask.class; + } + + /** {@inheritDoc} */ + @Override public String description() { + return "Removes IgniteClassPath from cluster"; + } + + /** {@inheritDoc} */ + @Override public Class argClass() { + return ClassPathRemoveCommandArg.class; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java new file mode 100644 index 0000000000000..f3167b998a365 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.management.classpath; + + +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.dto.IgniteDataTransferObject; +import org.apache.ignite.internal.management.api.Argument; + +public class ClassPathRemoveCommandArg extends IgniteDataTransferObject { + /** */ + private static final long serialVersionUID = 0; + + /** */ + @Order(0) + @Argument(description = "Name of the classpath") + String name; + + /** */ + @Order(1) + @Argument(description = "Forcefully remove ClassPath. Don't wait for running tasks to finish. Use with cautious!") + boolean force; + + /** */ + public String name() { + return name; + } + + /** */ + public void name(String name) { + this.name = name; + } + + /** */ + public boolean force() { + return force; + } + + /** */ + public void force(boolean force) { + this.force = force; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveTask.java new file mode 100644 index 0000000000000..ead771d997621 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveTask.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.management.classpath; + +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.visor.VisorJob; +import org.apache.ignite.internal.visor.VisorOneNodeTask; +import org.jetbrains.annotations.Nullable; + +/** */ +public class ClassPathRemoveTask extends VisorOneNodeTask { + /** */ + private static final long serialVersionUID = 0L; + + /** {@inheritDoc} */ + @Override protected VisorJob job(ClassPathRemoveCommandArg arg) { + return new ClassPathRemoveJob(arg, debug); + } + + /** */ + private static class ClassPathRemoveJob extends VisorJob { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + protected ClassPathRemoveJob(@Nullable ClassPathRemoveCommandArg arg, boolean debug) { + super(arg, debug); + } + + /** {@inheritDoc} */ + @Override protected Void run(@Nullable ClassPathRemoveCommandArg arg) throws IgniteException { + try { + // TODO: distributed process to wait local cleanup? + return ignite.context().classPath().remove(arg.name(), arg.force()).get(); + } + catch (IgniteCheckedException e) { + throw new IgniteException(e); + } + } + } +} From 35e889336077466c611bf15bd32cca87b77c5b17 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 9 Jul 2026 12:19:03 +0300 Subject: [PATCH 47/54] IGNITE-28207 Remove implementation WIP --- .../internal/classpath/ChangeNodesTask.java | 4 +- .../internal/classpath/ChangeStateTask.java | 4 +- .../classpath/ClassPathChangeListener.java | 12 +- .../ClassPathFilesTransmissionHandler.java | 37 ++++- .../classpath/ClassPathProcessor.java | 126 +++++++++++++----- .../internal/classpath/CleanupTask.java | 25 ++-- .../internal/classpath/DownloadTask.java | 20 +-- .../classpath/ClassPathRemoveCommandArg.java | 2 +- ...va => ClassPathMaliciuosRequestsTest.java} | 2 +- .../IgniteSpiDeploymentSelfTestSuite.java | 4 +- 10 files changed, 157 insertions(+), 79 deletions(-) rename modules/core/src/test/java/org/apache/ignite/internal/classpath/{ClassPathMailicuosRequestsTest.java => ClassPathMaliciuosRequestsTest.java} (98%) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java index 140ccc4b3d28b..5cc6b59243228 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java @@ -47,9 +47,9 @@ public static ChangeNodesTask addNode(GridKernalContext ctx, UUID icpId, UUID no } /** {@inheritDoc} */ - @Override void start() { + @Override void start0() { ctx.classPath() - .modifyInMetastorageAsync(icpId, null, icp -> add ? icp.addDeployedOnNode(node) : icp.removeDeployedOnNode(node)) + .modifyInMetastorageAsync(icpId, null, icp -> add ? icp.addDeployedOnNode(node) : icp.removeDeployedOnNode(node), this::stopped) .listen(this::finishTaskWithFutureResult); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java index 296eef2122f14..47b8dea0aa2bb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java @@ -35,7 +35,9 @@ public ChangeStateTask(GridKernalContext ctx, UUID icpId, IgniteClassPathState s /** {@inheritDoc} */ @Override void start0() { - ctx.classPath().modifyInMetastorageAsync(icpId, null, icp -> icp.newState(state)).listen(this::finishTaskWithFutureResult); + ctx.classPath() + .modifyInMetastorageAsync(icpId, null, icp -> icp.newState(state), this::stopped) + .listen(this::finishTaskWithFutureResult); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index 762dc092ba624..1a7a1fb58d848 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -123,7 +123,7 @@ private void onChange(IgniteClassPath newIcp, IgniteClassPath oldIcp) { // Cleanup will just raise log warning if local data not exists. log.info("IgniteClassPath remove operation started. Local cleanup: " + newIcp); - ctx.classPath().addClassPathTask(newIcp, CleanupTask.localCleanup(ctx, newIcp)); + ctx.classPath().addClassPathTask(newIcp, CleanupTask.removeFiles(ctx, newIcp)); ctx.classPath().addClassPathTask(newIcp, ChangeNodesTask.removeNode(ctx, newIcp.id(), ctx.localNodeId())); break; @@ -139,7 +139,7 @@ private void onChange(IgniteClassPath newIcp, IgniteClassPath oldIcp) { private void onRemoveFromMetastorage(IgniteClassPath icp) { // Maybe remove with force flag or error while uploading. // Cancelling all in flight and remove right away. - ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name()); + ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name(), false); if (!ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()).exists()) { log.info("IgniteClassPath removed: " + icp); @@ -147,8 +147,8 @@ private void onRemoveFromMetastorage(IgniteClassPath icp) { return; } - // Concurrent class path tasks not run. Cleaning up without queue. Mostly harmless (no local data at the moment). - CleanupTask t = CleanupTask.localCleanup(ctx, icp); + // Concurrent class path tasks not run. Cleaning up without queue. Mostly harmless (no local data at the moment until force remove). + CleanupTask t = CleanupTask.removeFiles(ctx, icp); t.result().listen(() -> log.info("IgniteClassPath removed: " + icp)); @@ -169,10 +169,10 @@ private void onNoDeployNodes(IgniteClassPath icp) { break; case REMOVING: - ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name()); + ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name(), true); // Remove from metastorage after all nodes cleanup. - ctx.classPath().startAsync(CleanupTask.clusterWideCleanup(ctx, icp)); + ctx.classPath().startAsync(CleanupTask.removeFromMetastore(ctx, icp)); break; case LOST: diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java index cece90a05e3e1..c35e535fe75bc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathFilesTransmissionHandler.java @@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.Predicate; import org.apache.ignite.IgniteException; @@ -49,6 +50,7 @@ import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; +import static org.apache.ignite.internal.classpath.ClassPathProcessor.ensureNotStopped; import static org.apache.ignite.internal.classpath.ClassPathProcessor.fromMetastorage; import static org.apache.ignite.internal.classpath.IgniteClassPathState.READY; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; @@ -98,15 +100,16 @@ public ClassPathFilesTransmissionHandler(GridKernalContext ctx) { * Downloads {@link IgniteClassPath} files locally from the remote node specified by {@code rmtNodeId}. * @param rmtNodeId Remote node id. * @param icp ClassPath. + * @param stopped Stop flag supplier. * @return Future for download operation. */ - IgniteInternalFuture downloadLocally(UUID rmtNodeId, IgniteClassPath icp) { + IgniteInternalFuture downloadLocally(UUID rmtNodeId, IgniteClassPath icp, BooleanSupplier stopped) { assert !rmtNodeId.equals(ctx.localNodeId()); if (log.isInfoEnabled()) log.info("Start download ClassPath files [icp=" + icp.name() + ", rmtNode=" + rmtNodeId + ']'); - DownloadClassPathTask task = new DownloadClassPathTask(rmtNodeId, icp); + DownloadClassPathTask task = new DownloadClassPathTask(rmtNodeId, icp, stopped); try { submit(task); @@ -188,7 +191,7 @@ private synchronized boolean cancel(DownloadClassPathTask r, Throwable err, Pred @Override public void onMessage(UUID nodeId, Object msg0, byte plc) { try { if (msg0 instanceof DownloadClassPathMessage msg) { - IgniteClassPath icp = null; + IgniteClassPath icp; try { icp = fromMetastorage(msg.icpId, READY, ctx); @@ -262,6 +265,12 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { if (!ensureTask(nodeId, task)) return; + if (task.stopped.getAsBoolean()) { + task.res.onDone(new IgniteException("Stopped")); + + return; + } + int filesLeft = task.filesLeft.get(); if (filesLeft != 0) { @@ -281,6 +290,12 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { if (!ensureTask(nodeId, task)) return; + if (task.stopped.getAsBoolean()) { + task.res.onDone(new IgniteException("Stopped")); + + return; + } + task.res.onDone(ex); } @@ -298,6 +313,9 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { "[icpId=" + icp.id() + ", file=" + name + ']'); } + if (task.stopped.getAsBoolean()) + throw new TransmissionCancelledException("Task stopped [icpId=" + icp.id() + ", file=" + name + ']'); + NodeFileTree ft = ctx.pdsFolderResolver().fileTree(); File root = ft.classPathRoot(icp.name()); @@ -322,6 +340,9 @@ else if (msg0 instanceof DownloadClassPathFailureMessage msg) { "[icpId=" + icp.id() + ", file=" + name + ']'); } + if (task.stopped.getAsBoolean()) + throw new TransmissionCancelledException("Task stopped [icpId=" + icp.id() + ", file=" + name + ']'); + int filesLeft = task.filesLeft.decrementAndGet(); if (log.isInfoEnabled()) { @@ -370,9 +391,11 @@ private void submit(DownloadClassPathTask next) { try { // submit can be invoked from discovery thread. - // sendOrderedMessage can be blocking so invok it in separate thread to release discovery. + // sendOrderedMessage can be blocking so invoke it in separate thread to release discovery. ctx.pools().getSystemExecutorService().submit(() -> { try { + ensureNotStopped(next.stopped); + ctx.cache().context().gridIO().sendOrderedMessage( rmtNode, FILES_TOPIC, @@ -433,15 +456,19 @@ private static class DownloadClassPathTask { /** Result of download. */ final GridFutureAdapter res; + /** Stop flag supplier. */ + final BooleanSupplier stopped; + /** Files counter. */ final AtomicInteger filesLeft; /** */ - public DownloadClassPathTask(UUID rmtNodeId, IgniteClassPath icp) { + public DownloadClassPathTask(UUID rmtNodeId, IgniteClassPath icp, BooleanSupplier stopped) { this.rmtNodeId = rmtNodeId; this.icp = icp; this.res = new GridFutureAdapter<>(); this.filesLeft = new AtomicInteger(icp.files().length); + this.stopped = stopped; } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 33102c89f5cb8..1ae7252de82e5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -36,6 +36,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.RejectedExecutionException; import java.util.function.BiConsumer; +import java.util.function.BooleanSupplier; import java.util.function.Function; import java.util.function.LongSupplier; import org.apache.ignite.IgniteCheckedException; @@ -73,9 +74,7 @@ * Do we want to have some flag to skip remove in this case? (if we preparing for ICP registration). * 3. Should we include CP into snapshots and dumps? * 4. Should we control file size to ensure disk free space enough to upload CP files? - * 5. TODO: support --force flag - * 6. TODO: support tasks stop. - * 7. TODO: stop tasks on + * TODO: update local file on changes. */ public class ClassPathProcessor extends GridProcessorAdapter implements DistributedMetastorageLifecycleListener { /** */ @@ -155,9 +154,9 @@ public ClassPathProcessor(GridKernalContext ctx) { IgniteClassPath loc = readClassPathDescriptor(ft.classPathDescriptor(icp.name())); - // Partially donwloaded or locally unknown ClassPath. + // Partially downloaded or locally unknown ClassPath. if (loc == null) { - addClassPathTask(icp, CleanupTask.localCleanup(ctx, icp)); + addClassPathTask(icp, CleanupTask.removeFiles(ctx, icp)); if (icp.state() == READY) addClassPathTask(icp, new DownloadTask(ctx, icp.id())); @@ -182,7 +181,7 @@ public ClassPathProcessor(GridKernalContext ctx) { Set ids = icpTasks.keySet(); for (UUID id : ids) - cancelTasksAndDisallowNew(id, "unknown"); + cancelTasksAndDisallowNew(id, "unknown", false); } } @@ -208,14 +207,15 @@ public UUID startCreation(String name, String[] files, long[] lengths) throws Ig Boolean metastorageWritten = casToMetastorageAsync(null, icp).get(); - if (metastorageWritten != null && !metastorageWritten) { + if (metastorageWritten == null || !metastorageWritten) { removeClassPathLocally(icp, true); throw new IgniteException("Fail to register ClassPath. Same ClassPath exists, already?"); } - log.info("New IgniteClasspath created " + - "[root = " + ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()) + ", icp=" + icp + ']'); + File cpRoot = ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()); + + log.info("New IgniteClasspath created [root = " + cpRoot + ", icp=" + icp + ']'); return icp.id(); } @@ -267,7 +267,7 @@ public synchronized void writeFilePartFromClient( "[name=" + icp.name() + ", id=" + icpId + ", file=" + name + ']', e); // Cleaning up synchronously. - CleanupTask.clusterWideCleanup(ctx, icp).start(); + cleanAll(icp); throw new IgniteException(e); } @@ -319,12 +319,30 @@ public void copyClassPathFileLocally(UUID icpId, Path file) { "[name=" + icp.name() + ", id=" + icpId + ']', e); // Cleaning up synchronously. - CleanupTask.clusterWideCleanup(ctx, icp).start(); + cleanAll(icp); throw new IgniteException(e); } } + /** */ + private void cleanAll(IgniteClassPath icp) { + try { + removeFromMetastorage(icp, () -> false); + } + catch (IgniteCheckedException e) { + log.warning("Remove from mestastorage fail", e); + } + finally { + removeClassPathLocally(icp, false); + } + } + + /** */ + public void cleanQueue(UUID icpId) { + icpTasks.remove(icpId); + } + /** */ public void makeReady(UUID icpId) throws IgniteCheckedException { IgniteClassPath icp = fromMetastorage(icpId, NEW, ctx); @@ -350,7 +368,7 @@ public IgniteInternalFuture remove(String name, boolean force) { log.warning("Forcefully removing ClassPath: " + icp); try { - removeFromMetastorage(icp); + removeFromMetastorage(icp, () -> true); // Cleanup will be performed in {@link ClassPathChangeListener}. return new GridFinishedFuture<>(); @@ -360,9 +378,7 @@ public IgniteInternalFuture remove(String name, boolean force) { } finally { // Cleanup queue after key removed from metastore. - cancelTasksAndDisallowNew(icp.id(), icp.name()); - - icpTasks.remove(icp.id()); + cancelTasksAndDisallowNew(icp.id(), icp.name(), false); } } @@ -384,11 +400,12 @@ public IgniteInternalFuture remove(String name, boolean force) { } /** */ - void cancelTasksAndDisallowNew(UUID icpId, String name) { - Queue> tasks = icpTasks.put(icpId, NO_NEW_TASKS); + void cancelTasksAndDisallowNew(UUID icpId, String name, boolean keepQueueLock) { + Queue> tasks = keepQueueLock + ? icpTasks.put(icpId, NO_NEW_TASKS) + : icpTasks.remove(icpId); if (!F.isEmpty(tasks)) { - // TODO: add cancel support in all tasks. for (ClassPathTask task : tasks) { log.info("Cancelling task [icp=" + name + ", task=" + task.name() + ']'); @@ -400,7 +417,7 @@ void cancelTasksAndDisallowNew(UUID icpId, String name) { task.result().get(); } catch (IgniteCheckedException e) { - log.warning("Stoped task exception", e); + log.warning("Stopped task exception", e); } } } @@ -487,12 +504,14 @@ void startAsync(ClassPathTask t) { } /** */ - void removeFromMetastorage(IgniteClassPath icp) throws IgniteCheckedException { + void removeFromMetastorage(IgniteClassPath icp, BooleanSupplier stopped) throws IgniteCheckedException { String key = metastorageKey(icp.name()); int iter = 0; while (true) { + ensureNotStopped(stopped); + Serializable curData = ctx.distributedMetastorage().read(key); if (curData == null || !isClassPath(curData) || !Objects.equals(((IgniteClassPath)curData).id(), icp.id())) @@ -548,15 +567,17 @@ GridFutureAdapter casToMetastorageAsync(@Nullable IgniteClassPath prev, * Retries modification if {@link #casToMetastorageAsync(IgniteClassPath, IgniteClassPath)} failed. * If {@code change} returns same {@link IgniteClassPath} no updates will be done. * If {@code change} or read from metastorge throws then operation will finish with the corresponding exception. + * @return Future with the new {@link IgniteClassPath} instance. */ - public GridFutureAdapter modifyInMetastorageAsync( + public GridFutureAdapter modifyInMetastorageAsync( UUID icpId, @Nullable IgniteClassPathState state, - Function change + Function change, + BooleanSupplier stopped ) { - GridFutureAdapter res = new GridFutureAdapter<>(); + GridFutureAdapter res = new GridFutureAdapter<>(); - modifyWithRetriesAsync(icpId, state, change, res, 100); + modifyWithRetriesAsync(icpId, state, change, res, stopped, 100); return res; } @@ -566,7 +587,8 @@ private void modifyWithRetriesAsync( UUID icpId, @Nullable IgniteClassPathState state, Function change, - GridFutureAdapter res, + GridFutureAdapter res, + BooleanSupplier stopped, int hardLimit ) { if (hardLimit == 0) { @@ -578,11 +600,13 @@ private void modifyWithRetriesAsync( } try { + ensureNotStopped(stopped); + IgniteClassPath prev = fromMetastorage(icpId, state, ctx); IgniteClassPath icp = change.apply(prev); if (Objects.equals(prev, icp)) { - res.onDone(); + res.onDone(icp); return; } @@ -600,13 +624,13 @@ private void modifyWithRetriesAsync( boolean metastorageWritten = casRes.result() != null && casRes.result(); if (metastorageWritten) { - res.onDone((Void)null); + res.onDone(icp); return; } // Concurrent node modifies first? It's OK, trying to repeat. - modifyWithRetriesAsync(icpId, state, change, res, hardLimit - 1); + modifyWithRetriesAsync(icpId, state, change, res, stopped, hardLimit - 1); }); } @@ -824,10 +848,16 @@ private File[] staleLocalRoots() { }); } + /** */ + static void ensureNotStopped(BooleanSupplier stopped) { + if (stopped.getAsBoolean()) + throw new IgniteException("Stopped"); + } + /** */ abstract static class ClassPathTask { /** */ - private final GridFutureAdapter taskRes = new GridFutureAdapter(); + private final GridFutureAdapter res = new GridFutureAdapter(); /** */ protected final GridKernalContext ctx; @@ -870,9 +900,11 @@ protected ClassPathTask(GridKernalContext ctx, UUID icpId) { } /** */ - void finishTaskWithFutureResult(IgniteInternalFuture action) { - if (action.error() == null) - result().onDone(); + void finishTaskWithFutureResult(IgniteInternalFuture action) { + if (action.error() == null) { + if (updateDescriptor(action.result())) + result().onDone(); + } else result().onDone(action.error()); } @@ -884,12 +916,17 @@ void finishTaskWithFutureResult(IgniteInternalFuture action) { */ final void start() { if (stopped) { - result().onDone(new IgniteException("Stoped before start")); + result().onDone(new IgniteException("Stopped before start")); return; } - start0(); + try { + start0(); + } + catch (Throwable e) { + res.onDone(e); + } } /** @@ -908,7 +945,26 @@ final void start() { * @return Task results. */ GridFutureAdapter result() { - return taskRes; + return res; + } + + /** */ + boolean stopped() { + return stopped; + } + + /** */ + protected boolean updateDescriptor(IgniteClassPath icp) { + try { + writeClassPathDescriptor(ctx.pdsFolderResolver().fileTree(), icp); + + return true; + } + catch (Exception e) { + result().onDone(e); + + return false; + } } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java index 1b2b4bceaf57d..100be9cd58b2e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java @@ -20,13 +20,13 @@ import org.apache.ignite.internal.GridKernalContext; /** - * Removes {@link IgniteClassPath} metastorage record and deletes its local files. + * Removes {@link IgniteClassPath} local files. */ class CleanupTask extends ClassPathProcessor.ClassPathTask { /** */ private final IgniteClassPath icp; - /** If {@code true} then remove from metastore. */ + /** */ private final boolean rmvFromMetastore; /** */ @@ -37,12 +37,12 @@ private CleanupTask(GridKernalContext ctx, IgniteClassPath icp, boolean rmvFromM } /** @return Task to clean up local files. */ - public static CleanupTask localCleanup(GridKernalContext ctx, IgniteClassPath icp) { + public static CleanupTask removeFiles(GridKernalContext ctx, IgniteClassPath icp) { return new CleanupTask(ctx, icp, false); } - /** @return Task to clean up both local files and metastorage record. */ - public static CleanupTask clusterWideCleanup(GridKernalContext ctx, IgniteClassPath icp) { + /** @return Task to remove metastore record. */ + public static CleanupTask removeFromMetastore(GridKernalContext ctx, IgniteClassPath icp) { return new CleanupTask(ctx, icp, true); } @@ -50,31 +50,34 @@ public static CleanupTask clusterWideCleanup(GridKernalContext ctx, IgniteClassP @Override void start0() { if (rmvFromMetastore) { try { - ctx.classPath().removeFromMetastorage(icp); + ctx.classPath().removeFromMetastorage(icp, this::stopped); } catch (IgniteCheckedException e) { result().onDone(e); + + return; } } - - ctx.classPath().removeClassPathLocally(icp, false); + else + ctx.classPath().removeClassPathLocally(icp, false); result().onDone(); } /** {@inheritDoc} */ @Override String name() { - return (rmvFromMetastore ? "local " : "") + "cleanup"; + return "cleanup"; } /** {@inheritDoc} */ @Override void ok() { if (log.isDebugEnabled()) - log.debug("ClassPath cleanup done [icp=" + icp + ", loc=" + rmvFromMetastore + ']'); + log.debug("ClassPath cleanup done [icp=" + icp + ", rmvFromMetastore=" + rmvFromMetastore + ']'); } /** {@inheritDoc} */ @Override void fail(Throwable t) { - log.warning("Fail to cleanup ClassPath [icp=" + icp + ", loc=" + rmvFromMetastore + ']', t); + if (log.isDebugEnabled()) + log.debug("Fail to cleanup ClassPath [icp=" + icp + ", rmvFromMetastore=" + rmvFromMetastore + "]: " + t.getMessage()); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java index d1d32d00f87f6..d57f102afb418 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java @@ -64,13 +64,12 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { UUID rmtNode = F.rand(icp.deployedOnNodes()); if (stopped) { - result().onDone(new IgniteException("Download task stoped")); + result().onDone(new IgniteException("Download task stopped")); return; } - // TODO: pass stop flag to download. - IgniteInternalFuture downloadRes = ctx.classPath().icpFilesHnd.downloadLocally(rmtNode, icp); + IgniteInternalFuture downloadRes = ctx.classPath().icpFilesHnd.downloadLocally(rmtNode, icp, this::stopped); downloadRes.listen(f -> { if (f.error() != null) { @@ -82,17 +81,8 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { if (log.isDebugEnabled()) log.debug("ClassPath files from remote node has been fully received [icp=" + icp.name() + ']'); - try { - ClassPathProcessor.writeClassPathDescriptor(ctx.pdsFolderResolver().fileTree(), icp); - } - catch (Exception e) { - result().onDone(e); - - return; - } - ctx.classPath() - .modifyInMetastorageAsync(icpId, READY, state -> state.addDeployedOnNode(ctx.localNodeId())) + .modifyInMetastorageAsync(icpId, READY, state -> state.addDeployedOnNode(ctx.localNodeId()), this::stopped) .listen(this::finishTaskWithFutureResult); }); } @@ -111,7 +101,7 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { log.warning("Failed to download ClassPath files [icp=" + icp.name() + "]", t); // Cleanup local files. - ctx.classPath().addClassPathTask(icp, CleanupTask.localCleanup(ctx, icp)); + ctx.classPath().addClassPathTask(icp, CleanupTask.removeFiles(ctx, icp)); } catch (Exception e) { log.warning("onDowloadFailed", e); @@ -120,6 +110,6 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { /** {@inheritDoc} */ @Override public String name() { - return "Download files"; + return "DownloadTask"; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java index f3167b998a365..cd2fa8fd6ac5b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java @@ -16,11 +16,11 @@ */ package org.apache.ignite.internal.management.classpath; - import org.apache.ignite.internal.Order; import org.apache.ignite.internal.dto.IgniteDataTransferObject; import org.apache.ignite.internal.management.api.Argument; +/** */ public class ClassPathRemoveCommandArg extends IgniteDataTransferObject { /** */ private static final long serialVersionUID = 0; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMaliciuosRequestsTest.java similarity index 98% rename from modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java rename to modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMaliciuosRequestsTest.java index 8c9064f92a3d1..8e54f8c9f7c47 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMailicuosRequestsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathMaliciuosRequestsTest.java @@ -30,7 +30,7 @@ /** * TODO: add filter for class path descriptor. */ -public class ClassPathMailicuosRequestsTest extends GridCommonAbstractTest { +public class ClassPathMaliciuosRequestsTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override protected void beforeTestsStarted() throws Exception { startGrid(0); diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java index fc8f639f8079d..f6f2e95280e59 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDeploymentSelfTestSuite.java @@ -18,7 +18,7 @@ package org.apache.ignite.testsuites; import org.apache.ignite.internal.classpath.ClassPathCreationFailoverTest; -import org.apache.ignite.internal.classpath.ClassPathMailicuosRequestsTest; +import org.apache.ignite.internal.classpath.ClassPathMaliciuosRequestsTest; import org.apache.ignite.internal.classpath.ClassPathSelfTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiSelfTest; import org.apache.ignite.spi.deployment.local.GridLocalDeploymentSpiStartStopSelfTest; @@ -33,7 +33,7 @@ GridLocalDeploymentSpiSelfTest.class, GridLocalDeploymentSpiStartStopSelfTest.class, ClassPathSelfTest.class, - ClassPathMailicuosRequestsTest.class, + ClassPathMaliciuosRequestsTest.class, ClassPathCreationFailoverTest.class }) public class IgniteSpiDeploymentSelfTestSuite { From 52966b9941201d73b74bd652ccd28d66c1009efe Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Thu, 9 Jul 2026 13:41:12 +0300 Subject: [PATCH 48/54] IGNITE-28207 Remove implementation WIP --- .../apache/ignite/util/GridCommandHandlerClassPathTest.java | 2 +- .../org/apache/ignite/internal/classpath/ChangeNodesTask.java | 2 +- .../apache/ignite/internal/classpath/ClassPathProcessor.java | 2 +- .../org/apache/ignite/internal/classpath/DownloadTask.java | 2 +- .../apache/ignite/internal/client/thin/TcpIgniteClient.java | 1 + .../internal/classpath/ClassPathCreationFailoverTest.java | 4 ++-- .../apache/ignite/internal/classpath/ClassPathSelfTest.java | 2 +- 7 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 49b64819c63dc..17ac9e2a1a40c 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -379,7 +379,7 @@ private IgniteClassPath classPath() throws IgniteCheckedException { /** */ private static LogListener readyLogListener(int succeed) { return LogListener - .matches("IgniteClassPath task done [task=Download files") + .matches("IgniteClassPath task done [task=download") .times(succeed) .build(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java index 5cc6b59243228..337e626561b02 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeNodesTask.java @@ -55,7 +55,7 @@ public static ChangeNodesTask addNode(GridKernalContext ctx, UUID icpId, UUID no /** {@inheritDoc} */ @Override String name() { - return add ? "Add node" : "Remove node"; + return add ? "add node" : "remove node"; } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index 1ae7252de82e5..b97ec603e1e7b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -334,7 +334,7 @@ private void cleanAll(IgniteClassPath icp) { log.warning("Remove from mestastorage fail", e); } finally { - removeClassPathLocally(icp, false); + removeClassPathLocally(icp, true); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java index d57f102afb418..59b0558c8b743 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/DownloadTask.java @@ -110,6 +110,6 @@ protected DownloadTask(GridKernalContext ctx, UUID icpId) { /** {@inheritDoc} */ @Override public String name() { - return "DownloadTask"; + return "download"; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index 2a3bd95412ecc..8d77029f8bed3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -81,6 +81,7 @@ import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridArgumentCheck; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.logger.NullLogger; import org.apache.ignite.marshaller.MarshallerContext; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java index f21025a577738..43b88d788d5ca 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathCreationFailoverTest.java @@ -191,8 +191,8 @@ public void testDownloadNodeFailDuringDeployment() throws Exception { Set cpFiles = ClassPathTestUtils.files(); LogListener createdMsg = newClassPathListener(); - LogListener oneNodeFailMsg = logListener("IgniteClassPath task failure [task=Download files"); - LogListener donloadSucceedMsg = logListener("IgniteClassPath task done [task=Download files"); + LogListener oneNodeFailMsg = logListener("IgniteClassPath task failure [task=download"); + LogListener donloadSucceedMsg = logListener("IgniteClassPath task done [task=download"); lsnrLog.registerAllListeners(createdMsg, oneNodeFailMsg, donloadSucceedMsg); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java index d4f1be0ada821..741acdde367e3 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/classpath/ClassPathSelfTest.java @@ -41,7 +41,7 @@ /** */ public class ClassPathSelfTest extends GridCommonAbstractTest { - // New node moves LOST to READY. + // TODO: New node moves LOST to READY. /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { From 2b481f265e4daae14853508a1f2a6f7e1a5b761c Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 13 Jul 2026 17:19:35 +0300 Subject: [PATCH 49/54] IGNITE-28207 Remove implementation --- .../ignite/internal/classpath/ClassPathChangeListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index 1a7a1fb58d848..2f5d8e0baa86b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -105,7 +105,6 @@ private void onChange(IgniteClassPath newIcp, IgniteClassPath oldIcp) { log.info("IgniteClassPath READY. Starting download to local node."); - // TODO: save new state in descriptor. ctx.classPath().addClassPathTask(newIcp, new DownloadTask(ctx, newIcp.id())); } else From 5ea264617568cb3a5333e6012adcb6bb1ef87613 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 13 Jul 2026 18:05:59 +0300 Subject: [PATCH 50/54] IGNITE-28207 Remove implementation --- .../apache/ignite/util/GridCommandHandlerClassPathTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 17ac9e2a1a40c..38579917d7ba3 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -100,8 +100,6 @@ public class GridCommandHandlerClassPathTest extends GridCommandHandlerAbstractT // TODO add in production code checks of files integriy. Perform file integrity check on startup. // Support pretty print for command. - // TODO: reboot of in-memory cluster erase distributed metastorage state. ??? - // TODO: support deployment on newly joined node. // TODO: add MAX file size check, free disk amount check. /** Concurrent {@code --create} commands with the same name must result in exactly one success. */ @@ -202,6 +200,8 @@ public void testCreate() throws Exception { ClassPathTestUtils.checkDeployedOn(grid(2), cpName()); checkFilesExists(cpName(), -1, cpFiles); + + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "remove", "--name", cpName())); } /** Tests --create command. */ From ecd775eed2b199bf6c846e4de18da3f5fb0e9109 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 14 Jul 2026 13:52:56 +0300 Subject: [PATCH 51/54] IGNITE-28207 Remove implementation --- .../util/GridCommandHandlerClassPathTest.java | 43 +++++++++++-- .../internal/classpath/ChangeStateTask.java | 2 +- .../classpath/ClassPathChangeListener.java | 57 +++++++++++++---- .../classpath/ClassPathProcessor.java | 64 +++++++++++-------- .../internal/classpath/CleanupTask.java | 2 +- .../classpath/ClassPathRemoveCommandArg.java | 2 +- .../classpath/ClassPathRemoveTask.java | 1 - .../internal/client/thin/TcpIgniteClient.java | 3 +- 8 files changed, 125 insertions(+), 49 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java index 38579917d7ba3..51c6d40d9594a 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerClassPathTest.java @@ -173,7 +173,7 @@ public void testConcurrentCreateSameName() throws Exception { /** Tests --create command. */ @Test - public void testCreate() throws Exception { + public void testCreateRemove() throws Exception { injectTestSystemOut(); final TestCommandHandler hnd = newCommandHandler(createTestLogger()); @@ -201,7 +201,23 @@ public void testCreate() throws Exception { checkFilesExists(cpName(), -1, cpFiles); - assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "remove", "--name", cpName())); + if (commandHandler.equals(JMX_CMD_HND)) + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "remove", "--name", cpName())); + else + assertEquals(EXIT_CODE_OK, execute(hnd, "--class-path", "remove", "--force", "--name", cpName())); + + assertTrue(waitForCondition(() -> { + try { + return classPath() == null; + } + catch (IgniteCheckedException e) { + return false; + } + }, 30_000)); + + assertFalse(grid(0).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).exists()); + assertFalse(grid(1).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).exists()); + assertFalse(grid(2).context().pdsFolderResolver().fileTree().classPathRoot(cpName()).exists()); } /** Tests --create command. */ @@ -347,10 +363,7 @@ public void testEmptyFilesArgument() { assertContains( log, - executeCommand( - EXIT_CODE_INVALID_ARGUMENTS, - "--class-path", "create", "--name", "mysuperapp", "--files", "" - ), + executeCommand(EXIT_CODE_INVALID_ARGUMENTS, "--class-path", "create", "--name", "mysuperapp", "--files", ""), cliCommandHandler() ? "File name must not be empty" : "Argument --files required" ); @@ -361,6 +374,24 @@ public void testEmptyFilesArgument() { ); } + /** */ + @Test + public void testRemoveUnknown() { + injectTestSystemOut(); + + assertContains( + log, + executeCommand(EXIT_CODE_UNEXPECTED_ERROR, "--class-path", "remove", "--name", "unknown"), + "ClassPath not found: unknown" + ); + + assertContains( + log, + executeCommand(EXIT_CODE_UNEXPECTED_ERROR, "--class-path", "remove", "--force", "--name", "unknown"), + "ClassPath not found: unknown" + ); + } + /** */ private void checkFilesExists(String cpName, int skip, Set files) throws IOException, IgniteCheckedException { for (int i = 0; i < GRID_CNT; i++) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java index 47b8dea0aa2bb..13137cde31b37 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ChangeStateTask.java @@ -42,7 +42,7 @@ public ChangeStateTask(GridKernalContext ctx, UUID icpId, IgniteClassPathState s /** {@inheritDoc} */ @Override String name() { - return "ChangeClassPathState[newState=" + state + ']'; + return "change state to " + state; } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java index 2f5d8e0baa86b..cb7e503211e9e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathChangeListener.java @@ -17,8 +17,11 @@ package org.apache.ignite.internal.classpath; import java.io.Serializable; +import java.util.concurrent.RejectedExecutionException; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.classpath.ClassPathProcessor.ClassPathTask; import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorage; import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorageListener; @@ -120,7 +123,7 @@ private void onChange(IgniteClassPath newIcp, IgniteClassPath oldIcp) { case REMOVING: // Don't check anything. Download task may be in progress. // Cleanup will just raise log warning if local data not exists. - log.info("IgniteClassPath remove operation started. Local cleanup: " + newIcp); + log.info("IgniteClassPath remove started. Local cleanup: " + newIcp); ctx.classPath().addClassPathTask(newIcp, CleanupTask.removeFiles(ctx, newIcp)); ctx.classPath().addClassPathTask(newIcp, ChangeNodesTask.removeNode(ctx, newIcp.id(), ctx.localNodeId())); @@ -138,20 +141,41 @@ private void onChange(IgniteClassPath newIcp, IgniteClassPath oldIcp) { private void onRemoveFromMetastorage(IgniteClassPath icp) { // Maybe remove with force flag or error while uploading. // Cancelling all in flight and remove right away. - ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name(), false); + IgniteInternalFuture cancelFut = ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name(), false); - if (!ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()).exists()) { - log.info("IgniteClassPath removed: " + icp); + try { + ctx.pools().getSystemExecutorService().submit(() -> { + try { + if (log.isDebugEnabled()) + log.debug("Waiting all tasks stoped: " + icp); - return; - } + cancelFut.get(); + } + catch (IgniteCheckedException ignore) { + // Expected, because cancelled. + } - // Concurrent class path tasks not run. Cleaning up without queue. Mostly harmless (no local data at the moment until force remove). - CleanupTask t = CleanupTask.removeFiles(ctx, icp); + if (log.isDebugEnabled()) + log.debug("All tasks stoped. Removing local files: " + icp); + + if (!ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()).exists()) { + log.info("IgniteClassPath removed: " + icp); + + return; + } - t.result().listen(() -> log.info("IgniteClassPath removed: " + icp)); + // Concurrent class path tasks not run. Cleaning up without queue. + // Mostly harmless (no local data at the moment until force remove). + CleanupTask t = CleanupTask.removeFiles(ctx, icp); - ctx.classPath().startAsync(t); + t.result().listen(() -> log.info("IgniteClassPath removed: " + icp)); + + ctx.classPath().start(t); + }); + } + catch (RejectedExecutionException e) { + log.warning("Can't submit remove files task", e); + } } /** Handle {@link IgniteClassPath} event when no nodes that stores ClassPath files in cluster. */ @@ -168,10 +192,21 @@ private void onNoDeployNodes(IgniteClassPath icp) { break; case REMOVING: + log.info("ClassPath removed from all nodes. Removing from metastore"); + ctx.classPath().cancelTasksAndDisallowNew(icp.id(), icp.name(), true); // Remove from metastorage after all nodes cleanup. - ctx.classPath().startAsync(CleanupTask.removeFromMetastore(ctx, icp)); + CleanupTask t = CleanupTask.removeFromMetastore(ctx, icp); + + t.result().listen(fut -> { + if (fut.error() == null) + log.info("IgniteClassPath removed from metastore: " + icp.name()); + else + log.warning("IgniteClassPath not removed from metastore: " + icp.name(), fut.error()); + }); + + ctx.classPath().startAsync(t); break; case LOST: diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java index b97ec603e1e7b..48aed04f745dc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/ClassPathProcessor.java @@ -50,6 +50,7 @@ import org.apache.ignite.internal.processors.GridProcessorAdapter; import org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree; import org.apache.ignite.internal.processors.metastorage.DistributedMetastorageLifecycleListener; +import org.apache.ignite.internal.util.future.GridCompoundFuture; import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; @@ -359,7 +360,7 @@ public IgniteInternalFuture remove(String name, boolean force) { try { Serializable icp0 = ctx.distributedMetastorage().read(metastorageKey(name)); - if (!isClassPath(icp0)) + if (icp0 == null || !isClassPath(icp0)) throw new IgniteException("ClassPath not found: " + name); IgniteClassPath icp = (IgniteClassPath)icp0; @@ -368,7 +369,7 @@ public IgniteInternalFuture remove(String name, boolean force) { log.warning("Forcefully removing ClassPath: " + icp); try { - removeFromMetastorage(icp, () -> true); + removeFromMetastorage(icp, () -> false); // Cleanup will be performed in {@link ClassPathChangeListener}. return new GridFinishedFuture<>(); @@ -400,7 +401,7 @@ public IgniteInternalFuture remove(String name, boolean force) { } /** */ - void cancelTasksAndDisallowNew(UUID icpId, String name, boolean keepQueueLock) { + IgniteInternalFuture cancelTasksAndDisallowNew(UUID icpId, String name, boolean keepQueueLock) { Queue> tasks = keepQueueLock ? icpTasks.put(icpId, NO_NEW_TASKS) : icpTasks.remove(icpId); @@ -412,15 +413,15 @@ void cancelTasksAndDisallowNew(UUID icpId, String name, boolean keepQueueLock) { task.stopped = true; } - for (ClassPathTask task : tasks) { - try { - task.result().get(); - } - catch (IgniteCheckedException e) { - log.warning("Stopped task exception", e); - } - } + GridCompoundFuture fut = new GridCompoundFuture<>(); + + for (ClassPathTask task : tasks) + fut.add((IgniteInternalFuture)task.result()); + + return fut.markInitialized(); } + + return new GridFinishedFuture<>(); } /** */ @@ -435,7 +436,8 @@ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { icpTasks.compute(icpId, (ignored, tasks) -> { if (tasks == NO_NEW_TASKS) { - log.debug("Tasks dropped. No new task allowed for ClassPath. Remove in progress? [icp=" + icp + ']'); + if (log.isDebugEnabled()) + log.debug("Tasks dropped. No new task allowed for ClassPath. Remove in progress? [icp=" + icp + ']'); return NO_NEW_TASKS; } @@ -458,7 +460,8 @@ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { icpTasks.compute(icpId, (ignored, tasks) -> { if (tasks == NO_NEW_TASKS) { - log.debug("Tasks dropped. No new task allowed for ClassPath. Remove in progress? [icp=" + icp + ']'); + if (log.isDebugEnabled()) + log.debug("Tasks dropped. No new task allowed for ClassPath. Remove in progress? [icp=" + icp + ']'); return NO_NEW_TASKS; } @@ -483,22 +486,25 @@ void addClassPathTask(IgniteClassPath icp, ClassPathTask task) { /** */ void startAsync(ClassPathTask t) { try { - ctx.pools().getSystemExecutorService().submit(() -> { - if (ctx.isStopping()) { - t.result().onDone(new IgniteException("Node stopping")); + ctx.pools().getSystemExecutorService().submit(() -> start(t)); + } + catch (RejectedExecutionException e) { + t.result().onDone(e); + } + } - return; - } + /** */ + void start(ClassPathTask t) { + if (ctx.isStopping()) { + t.result().onDone(new IgniteException("Node stopping")); - try { - t.start(); - } - catch (Throwable e) { - t.result().onDone(e); - } - }); + return; } - catch (RejectedExecutionException e) { + + try { + t.start(); + } + catch (Throwable e) { t.result().onDone(e); } } @@ -955,6 +961,12 @@ boolean stopped() { /** */ protected boolean updateDescriptor(IgniteClassPath icp) { + if (!ctx.pdsFolderResolver().fileTree().classPathRoot(icp.name()).exists()) { + log.warning("ClassPath root not exists: " + icp.name()); + + return true; + } + try { writeClassPathDescriptor(ctx.pdsFolderResolver().fileTree(), icp); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java index 100be9cd58b2e..b843a61b36745 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/classpath/CleanupTask.java @@ -66,7 +66,7 @@ public static CleanupTask removeFromMetastore(GridKernalContext ctx, IgniteClass /** {@inheritDoc} */ @Override String name() { - return "cleanup"; + return "cleanup " + (rmvFromMetastore ? "metastore" : "local files"); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java index cd2fa8fd6ac5b..792c31a72f2dc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveCommandArg.java @@ -32,7 +32,7 @@ public class ClassPathRemoveCommandArg extends IgniteDataTransferObject { /** */ @Order(1) - @Argument(description = "Forcefully remove ClassPath. Don't wait for running tasks to finish. Use with cautious!") + @Argument(description = "Forcefully remove ClassPath. Don't wait for running tasks to finish. Use with cautious!", optional = true) boolean force; /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveTask.java index ead771d997621..13a512a6a8afc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/classpath/ClassPathRemoveTask.java @@ -46,7 +46,6 @@ protected ClassPathRemoveJob(@Nullable ClassPathRemoveCommandArg arg, boolean de /** {@inheritDoc} */ @Override protected Void run(@Nullable ClassPathRemoveCommandArg arg) throws IgniteException { try { - // TODO: distributed process to wait local cleanup? return ignite.context().classPath().remove(arg.name(), arg.force()).get(); } catch (IgniteCheckedException e) { diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index 8d77029f8bed3..000ecd1f24229 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -81,7 +81,6 @@ import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridArgumentCheck; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.logger.NullLogger; import org.apache.ignite.marshaller.MarshallerContext; @@ -642,7 +641,7 @@ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws ClientChannel cliCh = ch.nodeClientChannel(node.id()); String name = file.getFileName().toString(); - byte[] batch = new byte[(int)(U.MB)]; + byte[] batch = new byte[(int)(CommonUtils.MB)]; try (InputStream fis = Files.newInputStream(file)) { long[] offset = new long[]{0}; From c0de57108f03da7aa2939469b41ec63db697dab3 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 14 Jul 2026 14:21:48 +0300 Subject: [PATCH 52/54] Merge (#13368) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thank you for submitting the pull request to the Apache Ignite. In order to streamline the review of the contribution we ask you to ensure the following steps have been taken: ### The Contribution Checklist - [ ] There is a single JIRA ticket related to the pull request. - [ ] The web-link to the pull request is attached to the JIRA ticket. - [ ] The JIRA ticket has the _Patch Available_ state. - [ ] The pull request body describes changes that have been made. The description explains _WHAT_ and _WHY_ was made instead of _HOW_. - [ ] The pull request title is treated as the final commit message. The following pattern must be used: `IGNITE-XXXX Change summary` where `XXXX` - number of JIRA issue. - [ ] A reviewer has been mentioned through the JIRA comments (see [the Maintainers list](https://cwiki.apache.org/confluence/display/IGNITE/How+to+Contribute#HowtoContribute-ReviewProcessandMaintainers)) - [ ] The pull request has been checked by the Teamcity Bot and the `green visa` attached to the JIRA ticket (see tab `PR Check` at [TC.Bot - Instance 1](https://tcbot2.sbt-ignite-dev.ru/prs.html) or [TC.Bot - Instance 2](https://mtcga.gridgain.com/prs.html)) ### Notes - [How to Contribute](https://cwiki.apache.org/confluence/display/IGNITE/How+to+Contribute) - [Coding abbreviation rules](https://cwiki.apache.org/confluence/display/IGNITE/Abbreviation+Rules) - [Coding Guidelines](https://cwiki.apache.org/confluence/display/IGNITE/Coding+Guidelines) - [Apache Ignite Teamcity Bot](https://cwiki.apache.org/confluence/display/IGNITE/Apache+Ignite+Teamcity+Bot) If you need any help, please email dev@ignite.apache.org or ask anу advice on http://asf.slack.com _#ignite_ channel. --------- Co-authored-by: Evgeniy Stanilovskiy Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Vladimir Steshin Co-authored-by: Ilya Shishkov Co-authored-by: Vladislav Pyatkov Co-authored-by: Mikhail Petrov <32207922+petrov-mg@users.noreply.github.com> Co-authored-by: Aleksandr Chesnokov Co-authored-by: Anton Vinogradov Co-authored-by: Claude Opus 4.8 Co-authored-by: Kirill Tkalenko Co-authored-by: Dmitry Werner Co-authored-by: Sergey Chugunov Co-authored-by: oleg-vlsk <153691984+oleg-vlsk@users.noreply.github.com> Co-authored-by: ignitetcbot <43213589+ignitetcbot@users.noreply.github.com> Co-authored-by: Maksim Davydov <70368398+maksaska@users.noreply.github.com> Co-authored-by: Aleksey Plekhanov Co-authored-by: Oleg Co-authored-by: Aleksandr Nikolaev <56360298+nao-it@users.noreply.github.com> Co-authored-by: Nikita Amelchev --- .github/dependabot.yml | 3 +- .github/workflows/check-protected-classes.yml | 75 +- .github/workflows/commit-check.yml | 29 +- .gitignore | 1 + assembly/dependencies-apache-ignite-lgpl.xml | 2 + assembly/dependencies-apache-ignite-slim.xml | 2 + assembly/dependencies-apache-ignite.xml | 2 + checkstyle/checkstyle.xml | 2 +- docs/_data/toc.yaml | 2 + docs/_docs/clustering/clustering.adoc | 3 + .../clustering/discovery-in-the-cloud.adoc | 4 +- docs/_docs/clustering/multi-data-center.adoc | 254 + docs/_docs/code-snippets/java/pom.xml | 37 + .../ignite/snippets/BasicCacheOperations.java | 1 + .../ignite/snippets/DiscoveryInTheCloud.java | 11 +- .../ignite/snippets/IgniteSessionContext.java | 23 +- .../ignite/snippets/JavaThinClient.java | 18 +- .../org/apache/ignite/snippets/Snapshots.java | 6 +- .../org/apache/ignite/snippets/SqlAPI.java | 3 + .../java/org/apache/ignite/snippets/TDE.java | 1 + .../ignite/snippets/WarmUpStrategy.java | 111 +- .../snippets/WorkingWithBinaryObjects.java | 47 +- .../org/apache/ignite/snippets/k8s/K8s.java | 4 +- .../ignite/snippets/services/EchoService.java | 2 +- .../EchoServiceAccessInterceptor.java | 2 +- .../snippets/services/EchoServiceImpl.java | 2 +- .../snippets/services/ServiceExample.java | 3 +- .../configuration-overview.adoc | 5 +- .../configuring-backups.adoc | 30 + .../spring/spring-tx.adoc | 7 + .../memory-configuration/data-regions.adoc | 6 +- .../eviction-policies.adoc | 18 + .../_docs/monitoring-metrics/new-metrics.adoc | 3 + .../monitoring-metrics/system-views.adoc | 1 + docs/_docs/setup.adoc | 2 +- docs/_docs/thin-clients/java-thin-client.adoc | 7 + .../misc/springbean/SpringBeanExample.java | 12 +- .../jmh/notify/JmhWaitStategyBenchmark.java | 2 + .../internal/binary/BinaryMarshaller.java | 9 +- .../ignite/internal/binary/BinaryUtils.java | 203 + .../internal/binary/GridBinaryMarshaller.java | 31 + .../IgniteMarshallerClassFilter.java | 0 .../marshaller/IgniteObjectInputFilter.java | 0 .../ignite/marshaller/MarshallerUtils.java | 31 +- modules/bom/pom.xml | 10 + modules/calcite/pom.xml | 10 +- modules/calcite/src/main/codegen/config.fmpp | 1 + .../calcite/exec/LogicalRelImplementor.java | 50 +- .../calcite/exec/exp/ConverterUtils.java | 14 + .../calcite/exec/exp/IgniteExpressions.java | 8 +- .../query/calcite/exec/exp/RexImpTable.java | 41 +- .../calcite/exec/exp/RexToLixTranslator.java | 7 + .../exp/agg/AccumulatorFactoryProvider.java | 39 + .../calcite/exec/exp/agg/Accumulators.java | 20 +- .../exec/exp/agg/AccumulatorsFactory.java | 171 +- .../exec/exp/agg/AccumulatorsFactoryBase.java | 221 + .../query/calcite/exec/exp/agg/GroupKey.java | 8 +- .../exp/window/BufferingWindowPartition.java | 132 + .../exp/window/RangeWindowPartitionFrame.java | 216 + .../exp/window/RowWindowPartitionFrame.java | 133 + .../exec/exp/window/StreamWindowFunction.java | 31 + .../exp/window/StreamWindowPartition.java | 106 + .../exec/exp/window/WindowFunction.java | 35 + .../exp/window/WindowFunctionFactory.java | 248 + .../exp/window/WindowFunctionWrapper.java | 29 + .../exec/exp/window/WindowFunctions.java | 514 + .../exec/exp/window/WindowPartition.java | 40 + .../exec/exp/window/WindowPartitionBase.java | 67 + .../exp/window/WindowPartitionFactory.java | 83 + .../exec/exp/window/WindowPartitionFrame.java | 62 + .../query/calcite/exec/rel/AbstractNode.java | 4 +- .../query/calcite/exec/rel/HashJoinNode.java | 42 +- .../query/calcite/exec/rel/WindowNode.java | 185 + .../query/calcite/externalize/RelInputEx.java | 7 + .../query/calcite/externalize/RelJson.java | 156 +- .../calcite/externalize/RelJsonReader.java | 6 + .../query/calcite/prepare/Cloner.java | 6 + .../calcite/prepare/IgniteRelShuttle.java | 6 + .../calcite/prepare/IgniteSqlValidator.java | 23 +- .../query/calcite/prepare/PlannerHelper.java | 2 + .../query/calcite/prepare/PlannerPhase.java | 33 +- .../query/calcite/rel/IgniteJoinInfo.java | 81 - .../query/calcite/rel/IgniteMergeJoin.java | 24 +- .../query/calcite/rel/IgniteRelVisitor.java | 6 +- .../query/calcite/rel/IgniteWindow.java | 295 + .../calcite/rule/HashJoinConverterRule.java | 4 +- .../calcite/rule/MergeJoinConverterRule.java | 8 +- .../calcite/rule/WindowConverterRule.java | 146 + .../rule/logical/WindowConstantsRule.java | 297 + .../sql/fun/IgniteOwnSqlOperatorTable.java | 7 + .../sql/fun/IgniteStdSqlOperatorTable.java | 19 + .../calcite/sql/fun/SqlLeadLagFunction.java | 36 + .../sql/generated/IgniteSqlParserImpl.java | 17807 ++++++++-------- .../IgniteSqlParserImplConstants.java | 296 +- .../IgniteSqlParserImplTokenManager.java | 7953 +++---- .../calcite/sql/generated/ParseException.java | 57 +- .../sql/generated/SimpleCharStream.java | 458 +- .../query/calcite/sql/generated/Token.java | 84 +- .../calcite/sql/generated/TokenMgrError.java | 244 +- .../query/calcite/trait/TraitUtils.java | 5 + .../query/calcite/type/IgniteTypeSystem.java | 18 +- .../exec/rel/HashJoinExecutionTest.java | 7 +- .../exec/rel/JoinBuffersExecutionTest.java | 7 +- .../calcite/exec/rel/WindowExecutionTest.java | 739 + .../AggregatesIntegrationTest.java | 8 + .../calcite/integration/FunctionsTest.java | 7 +- .../calcite/integration/IntervalTest.java | 42 +- .../OperatorsExtensionIntegrationTest.java | 96 + .../integration/StdSqlOperatorsTest.java | 14 + .../integration/TableDdlIntegrationTest.java | 2 +- .../integration/WindowIntegrationTest.java | 213 + .../CorrelatedSubqueryPlannerTest.java | 4 +- .../calcite/planner/DataTypesPlannerTest.java | 12 + .../planner/HashIndexSpoolPlannerTest.java | 3 +- .../calcite/planner/WindowPlannerTest.java | 471 + .../ignite/testsuites/ExecutionTestSuite.java | 2 + .../testsuites/IntegrationTestSuite.java | 2 + .../ignite/testsuites/PlannerTestSuite.java | 2 + .../sql/aggregate/group/test_group_by.test | 3 +- .../test_complex_correlated_subquery.test | 4 +- ...ore => test_window_function_subquery.test} | 1 - .../sql/window/test_window_functions.test | 617 + modules/checkstyle/pom.xml | 2 +- .../jetty/rest-jetty-ssl-client-auth.xml | 13 +- .../test/resources/jetty/rest-jetty-ssl.xml | 17 +- .../src/test/resources/jetty/rest-jetty.xml | 14 +- .../test/resources/jetty/router-jetty-ssl.xml | 17 +- .../src/test/resources/jetty/router-jetty.xml | 14 +- .../internal/MessageSerializerGenerator.java | 9 + .../ignite/IgniteCommonsSystemProperties.java | 62 + .../ignite/cache/CacheEntryVersion.java | 18 +- .../cache/query/CacheEntryEventAdapter.java | 0 .../apache/ignite/cache/query/IndexQuery.java | 0 .../cache/query/IndexQueryCriterion.java | 0 .../apache/ignite/cache/query/SqlQuery.java | 6 +- .../ComputeExecutionRejectedException.java | 0 .../apache/ignite/failure/FailureType.java | 0 .../org/apache/ignite/internal/ClassSet.java | 0 ...IgniteFutureCancelledCheckedException.java | 3 +- .../ignite/internal/IgniteProperties.java | 4 +- .../ignite/internal/IgniteVersionUtils.java | 5 + .../internal/NodeStoppingException.java | 0 .../cache/query/InIndexQueryCriterion.java | 0 .../cache/query/RangeIndexQueryCriterion.java | 0 .../affinity/AffinityTopologyVersion.java | 0 .../processors/cache/CacheInvokeResult.java | 10 +- .../cache/version/GridCacheVersion.java | 31 +- ...ClientConnectionNodeRecoveryException.java | 0 .../cache/expiry/PlatformExpiryPolicy.java | 0 .../platform/client/ClientFlag.java | 0 .../platform/client/ClientStatus.java | 0 .../client/IgniteClientException.java | 12 - .../thread/context/OperationContext.java | 2 +- .../ignite/internal/util/CommonUtils.java | 391 + .../ignite/internal/util/GridLongList.java | 2 +- .../internal/util/HostAndPortRange.java | 0 .../util/future/GridCompoundFuture.java | 28 +- .../util/future/GridFinishedFuture.java | 4 +- .../util/future/GridFutureAdapter.java | 8 +- .../util/future/GridFutureChainListener.java | 0 .../internal/util/lang/ClusterNodeFunc.java | 0 .../internal/util/lang/IgniteInClosure2X.java | 0 .../gridfunc/ContainsNodeIdsPredicate.java | 0 .../EqualsClusterNodeIdPredicate.java | 0 .../lang/gridfunc/HasEqualIdPredicate.java | 0 .../lang/gridfunc/HasNotEqualIdPredicate.java | 0 .../ignite/internal/util/typedef/CIX2.java | 0 .../internal/util/worker/GridWorker.java | 11 +- .../util/worker/GridWorkerListener.java | 0 .../internal/util/worker/GridWorkerPool.java | 6 +- .../util/worker/WorkProgressDispatcher.java | 0 .../org/apache/ignite/logger/NullLogger.java | 0 .../platform/PlatformServiceMethod.java | 0 .../org/apache/ignite/spi/tracing/Scope.java | 0 .../apache/ignite/spi/tracing/SpanStatus.java | 0 .../ignite/ssl/AbstractSslContextFactory.java | 0 .../ignite/ssl/DelegatingSSLContextSpi.java | 0 .../apache/ignite/ssl/SSLContextWrapper.java | 0 .../ssl/SSLServerSocketFactoryWrapper.java | 0 .../ignite/ssl/SSLSocketFactoryWrapper.java | 0 .../apache/ignite/ssl/SslContextFactory.java | 0 .../org/apache/ignite/ssl/package-info.java | 0 .../ignite/util/deque/FastSizeDeque.java | 0 .../IgniteCompatibilityAbstractTest.java | 8 +- ...ndHandlerCheckIncrementalSnapshotTest.java | 11 +- .../ignite/util/GridCommandHandlerTest.java | 9 +- .../ignite/util/SystemViewCommandTest.java | 10 +- modules/core/pom.xml | 24 +- .../apache/ignite/IgniteSystemProperties.java | 59 - .../RendezvousAffinityFunction.java | 12 +- .../configuration/CacheConfiguration.java | 4 +- .../ClientConnectorConfiguration.java | 5 +- .../configuration/ConnectorConfiguration.java | 3 +- .../ignite/internal/CoreMessagesProvider.java | 63 +- .../apache/ignite/internal/GridComponent.java | 5 +- .../ignite/internal/GridKernalContext.java | 10 +- .../internal/GridKernalContextImpl.java | 6 + .../ignite/internal/GridPluginComponent.java | 10 +- .../ignite/internal/IgniteComponentType.java | 4 +- .../apache/ignite/internal/IgniteKernal.java | 13 + .../internal/MarshallerContextImpl.java | 28 +- ...tion.java => OperationContextMessage.java} | 33 +- .../cache/query/QueryIndexMessage.java | 6 +- .../ClusterTopologyCheckedException.java | 3 +- .../internal/direct/DirectMessageReader.java | 12 + .../internal/direct/DirectMessageWriter.java | 10 + .../direct/stream/DirectByteBufferStream.java | 320 +- .../direct/stream/IgniteProductVersionEx.java | 10 +- .../jdbc/thin/JdbcThinConnection.java | 2 +- .../tx/FetchNearXidVersionTask.java | 3 +- .../ignite/internal/management/tx/TxTask.java | 7 +- .../managers/communication/GridIoManager.java | 66 +- .../managers/communication/GridIoMessage.java | 15 +- .../GridIoSecurityAwareMessage.java | 68 - .../GridDeploymentCommunication.java | 1 - .../GridDeploymentPerVersionStore.java | 1 - .../discovery/GridDiscoveryManager.java | 13 +- .../encryption/EncryptionDataBagItem.java} | 16 +- .../encryption/GridEncryptionManager.java | 19 +- .../encryption/GroupKeyChangeProcess.java | 4 +- .../eventstorage/EventsDataBagItem.java | 36 + .../eventstorage/GridEventStorageManager.java | 10 +- .../managers/tracing/GridTracingManager.java | 7 + .../AuthentificationDataBagItem.java | 55 + .../IgniteAuthenticationProcessor.java | 39 +- .../UserManagementOperation.java | 6 +- .../processors/cache/CacheMetricsImpl.java | 92 + .../cache/CacheOperationContext.java | 543 +- .../processors/cache/ClusterCachesInfo.java | 5 +- .../cache/GatewayProtectedCacheProxy.java | 14 +- .../processors/cache/GridCacheAdapter.java | 320 +- .../processors/cache/GridCacheProcessor.java | 16 + .../processors/cache/GridCacheProxyImpl.java | 195 +- .../processors/cache/GridCacheReturn.java | 5 +- .../processors/cache/GridCacheUtils.java | 41 +- .../cache/IgniteCacheProxyImpl.java | 4 +- .../processors/cache/IgniteInternalCache.java | 62 +- .../cache/ValidationOnNodeJoinUtils.java | 34 + ...sData.java => CacheBinaryDataBagItem.java} | 12 +- .../CacheObjectBinaryProcessorImpl.java | 25 +- .../GridDistributedCacheAdapter.java | 8 +- .../distributed/dht/GridDhtLockFuture.java | 70 +- .../dht/GridDhtTransactionalCacheAdapter.java | 65 +- .../dht/GridDhtTxFinishFuture.java | 38 +- .../cache/distributed/dht/GridDhtTxLocal.java | 6 +- .../dht/GridDhtTxLocalAdapter.java | 47 +- .../distributed/dht/GridDhtTxRemote.java | 9 +- .../dht/GridDhtTxSalvageMessage.java | 51 + .../dht/atomic/GridDhtAtomicCache.java | 20 +- .../GridNearAtomicAbstractUpdateFuture.java | 2 +- .../dht/colocated/GridDhtColocatedCache.java | 24 +- .../colocated/GridDhtColocatedLockFuture.java | 62 +- .../GridDhtPartitionsExchangeFuture.java | 1 + .../dht/topology/GridDhtLocalPartition.java | 4 +- .../distributed/near/GridNearAtomicCache.java | 1 + .../distributed/near/GridNearLockFuture.java | 82 +- .../distributed/near/GridNearLockRequest.java | 16 +- .../near/GridNearLockResponse.java | 18 + .../GridNearPessimisticTxPrepareFuture.java | 3 +- .../near/GridNearTransactionalCache.java | 6 +- .../near/GridNearTxFinishFuture.java | 9 + .../distributed/near/GridNearTxLocal.java | 65 +- .../IgniteConsistencyViolationException.java | 3 +- .../snapshot/IgniteSnapshotManager.java | 32 +- .../snapshot/SnapshotCheckProcess.java | 4 +- .../snapshot/SnapshotRestoreProcess.java | 12 +- .../snapshot/dump/CreateDumpFutureTask.java | 8 +- .../reader/StandaloneGridKernalContext.java | 9 + .../store/GridCacheStoreManagerAdapter.java | 13 + .../cache/transactions/IgniteTxAdapter.java | 5 +- .../cache/transactions/IgniteTxHandler.java | 14 + .../transactions/IgniteTxLocalAdapter.java | 56 +- .../cache/transactions/IgniteTxManager.java | 81 +- .../IgniteTxRemoteStateAdapter.java | 2 +- .../transactions/IgniteTxRemoteStateImpl.java | 4 +- .../cache/transactions/IgniteTxStateImpl.java | 13 +- .../cache/version/GridCacheVersionEx.java | 6 +- .../processors/cluster/BaselineTopology.java | 38 +- .../processors/cluster/ClusterIdAndTag.java | 13 +- .../processors/cluster/ClusterProcessor.java | 60 +- .../ClusterUpdateNotifierDataBagItem.java | 36 + .../cluster/GridClusterStateProcessor.java | 8 +- .../continuous/GridContinuousProcessor.java | 9 +- .../DataStructuresProcessor.java | 5 +- .../datastructures/GridCacheQueueAdapter.java | 16 +- .../GridMarshallerMappingProcessor.java | 20 +- ...gsData.java => MarshallerDataBagItem.java} | 15 +- .../DistributedMetaStorageImpl.java | 2 +- .../odbc/ClientListenerNioListener.java | 3 +- .../odbc/ClientListenerProcessor.java | 12 +- .../odbc/ClientListenerRequest.java | 4 +- .../odbc/ClientListenerRequestHandler.java | 1 - .../PerformanceStatisticsProcessor.java | 2 +- .../platform/client/ClientRequestHandler.java | 11 +- .../ClientCacheSqlFieldsQueryRequest.java | 4 +- .../plugin/IgnitePluginProcessor.java | 34 +- .../processors/plugin/PluginsDataBagItem.java | 63 + .../processors/query/GridQueryProcessor.java | 79 +- .../processors/query/QueryContext.java | 11 +- .../internal/processors/query/QueryField.java | 6 +- .../internal/processors/query/QueryUtils.java | 42 +- .../query/schema/SchemaOperationManager.java | 31 +- .../schema/message/QueryEntityExMessage.java | 88 + .../schema/message/QueryEntityMessage.java | 158 + .../message/QueryInlineSizesDataBagItem.java | 42 + .../message/QueryProposalsDataBagItem.java | 45 + .../SchemaAbstractDiscoveryMessage.java | 10 +- .../message/SchemaFinishDiscoveryMessage.java | 3 - .../SchemaProposeDiscoveryMessage.java | 3 - .../operation/SchemaAbstractOperation.java | 6 +- .../SchemaAddQueryEntityOperation.java | 65 +- .../SchemaAlterTableAddColumnOperation.java | 3 - .../SchemaAlterTableDropColumnOperation.java | 3 - .../operation/SchemaIndexCreateOperation.java | 3 - .../operation/SchemaIndexDropOperation.java | 3 - .../processors/rest/GridRestProcessor.java | 4 + .../cache/GridCacheCommandHandler.java | 12 +- .../protocols/tcp/GridTcpRestProtocol.java | 17 +- .../rollingupgrade/AbstractProcess.java | 69 + .../IgniteComponentUpgradeState.java | 84 + .../RollingUpgradeClusterData.java | 55 + .../RollingUpgradeProcessor.java | 733 +- .../feature/IgniteComponentFeatureSet.java | 118 + .../IgniteComponentFeatureSetProvider.java | 42 + .../feature/IgniteCoreFeature.java | 73 + .../rollingupgrade/feature/IgniteFeature.java | 49 + .../feature/IgniteFeatureManager.java | 163 + .../feature/IgniteFeatureSet.java | 311 + .../feature/IgniteNodeFeatureSet.java | 111 + .../feature/SupportedFeatureRegistry.java | 96 + .../security/IgniteSecurityProcessor.java | 65 +- .../security/SecurityContextWrapper.java | 61 + .../service/IgniteServiceProcessor.java | 2 +- .../processors/tracing/NoopTracing.java | 29 +- .../sql/optimizer/affinity/PartitionNode.java | 1 - ...DistributedOperationContextAttribute.java} | 33 +- .../context/OperationContextDispatcher.java | 145 + .../IgniteTxOptimisticCheckedException.java | 4 +- .../ignite/internal/util/GridIntList.java | 21 +- .../ignite/internal/util/IgniteUtils.java | 489 +- .../util/distributed/DistributedProcess.java | 29 +- .../ignite/mxbean/ClusterMetricsMXBean.java | 232 +- .../tcp/TcpCommunicationMetricsListener.java | 19 + .../tcp/TcpCommunicationSpi.java | 20 +- .../tcp/internal/GridNioServerWrapper.java | 20 +- .../tcp/internal/TcpHandshakeExecutor.java | 2 +- .../messages/RecoveryLastReceivedMessage.java | 3 +- .../spi/discovery/DiscoveryDataBag.java | 69 +- ...va => SerializableDataBagItemWrapper.java} | 55 +- .../ignite/spi/discovery/tcp/ClientImpl.java | 367 +- .../ignite/spi/discovery/tcp/ServerImpl.java | 98 +- .../spi/discovery/tcp/TcpDiscoveryImpl.java | 6 + .../discovery/tcp/TcpDiscoveryIoSession.java | 5 +- .../spi/discovery/tcp/TcpDiscoverySpi.java | 49 +- .../tcp/internal/DiscoveryDataPacket.java | 316 +- .../messages/InetSocketAddressMessage.java | 1 - .../messages/TcpDiscoveryAbstractMessage.java | 7 + .../resources/META-INF/classnames.properties | 1 - ...roperties => ignite-build-info.properties} | 0 .../MdcAffinityBackupFilterSelfTest.java | 2 + .../internal/GridReleaseTypeSelfTest.java | 525 - .../binary/BinaryMarshallerSelfTest.java | 23 + .../codegen/MessageProcessorTest.java | 6 +- ...ByteBufferStreamImplByteOrderSelfTest.java | 118 +- .../AbstractMessageSerializationTest.java | 13 + .../internal/metric/JmxExporterSpiTest.java | 8 +- .../metric/SystemViewAbstractTest.java | 37 + .../metric/SystemViewBinaryMetaTest.java | 67 + .../internal/metric/SystemViewCacheTest.java | 221 + .../internal/metric/SystemViewClientTest.java | 138 + .../metric/SystemViewComputeTaskTest.java | 349 + .../metric/SystemViewConfigurationTest.java | 82 + .../internal/metric/SystemViewDSTest.java | 704 + .../metric/SystemViewExecutorsTest.java | 125 + .../metric/SystemViewMetastorageTest.java | 148 + .../internal/metric/SystemViewNodesTest.java | 235 + .../metric/SystemViewPageListsTest.java | 156 + .../metric/SystemViewPageTimestampsTest.java | 228 + .../internal/metric/SystemViewPluginTest.java | 76 + .../metric/SystemViewQueriesTest.java | 312 + .../internal/metric/SystemViewSelfTest.java | 2754 --- .../metric/SystemViewServiceTest.java | 108 + .../metric/SystemViewSnapshotsTest.java | 95 + .../metric/SystemViewTransactionsTest.java | 155 + .../CacheGroupsMetricsRebalanceTest.java | 27 +- ...OperationContextTransactionalLockTest.java | 141 + ...heVersionedEntryTransactionalLockTest.java | 514 + .../ConcurrentCheckpointAndUpdateTtlTest.java | 2 +- .../CrossCacheTxRandomOperationsTest.java | 3 +- .../cache/IgniteCachePutAllRestartTest.java | 6 +- .../cache/LockTxEntryOneNodeTest.java | 602 + .../processors/cache/MdcCacheMetricsTest.java | 600 + .../IgniteCacheGetRestartTest.java | 4 +- ...gniteTxCacheWithWriteThroughCheckTest.java | 316 + ...SynchronizationModesMultithreadedTest.java | 16 +- .../IgniteCacheTxRecoveryRollbackTest.java | 6 +- ...heStoreSessionWriteBehindAbstractTest.java | 4 +- .../db/IgnitePdsTransactionsHangTest.java | 3 +- .../db/wal/IgniteWalRebalanceTest.java | 14 +- .../IgniteClusterSnapshotSelfTest.java | 124 +- .../dump/IgniteCacheDumpSeveralDiskTest.java | 125 + .../IncrementalSnapshotJoiningClientTest.java | 3 +- .../IncrementalSnapshotRestoreTest.java | 3 +- ...crementalSnapshotWarnAtomicCachesTest.java | 57 +- .../tree/io/PageIOFreeSizeTest.java | 2 + .../wal/SegmentedRingByteBufferTest.java | 6 +- .../query/IndexingSpiQueryTxSelfTest.java | 32 +- .../ContinuousQueryMarshallerTest.java | 2 + .../TxDeadlockDetectionNoHangsTest.java | 2 +- .../transactions/TxDeadlockDetectionTest.java | 2 +- .../TxPartitionCounterStateAbstractTest.java | 22 +- ...xPartitionCounterStateConsistencyTest.java | 6 +- ...onCounterStateOnePrimaryOneBackupTest.java | 3 +- .../database/CacheFreeListSelfTest.java | 2 +- .../QueryEntityMessageSerializationTest.java | 193 + .../GridCacheCommandHandlerSelfTest.java | 10 - .../AbstractRollingUpgradeTest.java | 664 + .../CoreVersionRollingUpgradeTest.java | 951 + .../PluginVersionRollingUpgradeTest.java | 138 + .../feature/IgniteFeatureSetTest.java | 167 + .../TestIgniteReleaseFeatures_2_18_0.java | 24 + .../TestIgniteReleaseFeatures_2_19_0.java | 24 + .../TestIgniteReleaseFeatures_2_19_1.java | 27 + .../TestIgniteReleaseFeatures_2_19_2.java | 30 + .../TestIgniteReleaseFeatures_2_19_3.java | 33 + .../TestIgniteReleaseFeatures_2_20_0.java | 36 + .../TestIgniteReleaseFeatures_2_20_1.java | 39 + .../TestIgniteReleaseFeatures_2_21_0.java | 33 + .../TestIgniteReleaseFeatures_2_21_1.java | 36 + ...TestPluginComponentFeatureSetProvider.java | 54 + .../feature/TestPluginFeature.java | 42 + .../TestPluginReleaseFeatures_1_0_0.java | 24 + .../TestPluginReleaseFeatures_2_0_0.java | 24 + .../TestPluginReleaseFeatures_3_0_0.java | 24 + .../security/IgniteSecurityProcessorTest.java | 30 +- .../NodeSecurityContextPropagationTest.java | 334 +- .../OperationContextAttributesTest.java | 246 +- .../DistributedProcessClientAwaitTest.java | 2 +- ...DistributedProcessCoordinatorLeftTest.java | 2 +- .../DistributedProcessErrorHandlingTest.java | 6 +- .../internal/util/nio/GridNioSslSelfTest.java | 2 +- .../p2p/GridP2PJobClassLoaderSelfTest.java | 4 +- ...etFutureAttributeWaitListenerSelfTest.java | 4 +- ...onSetJobAttributeWaitListenerSelfTest.java | 4 +- ...ationSpiSkipWaitHandshakeOnClientTest.java | 2 +- .../DiscoverySpiDataExchangeTest.java | 6 + .../tcp/MultiDataCenterSplitTest.java | 11 +- .../tcp/TcpDiscoveryNetworkIssuesTest.java | 12 +- ...cpDiscoveryPendingMessageDeliveryTest.java | 31 +- .../discovery/tcp/TcpDiscoverySelfTest.java | 12 +- .../tcp/TestBlockingTcpDiscoverySpi.java | 122 + .../testframework/junits/IgniteMock.java | 2 +- .../junits/common/GridCommonAbstractTest.java | 8 +- .../testsuites/IgniteBasicTestSuite.java | 9 +- .../IgniteCacheConsistencySelfTestSuite.java | 6 - .../IgniteCacheConsistencySelfTestSuite2.java | 37 + ...gniteCacheDataStructuresSelfTestSuite.java | 88 - ...niteCacheDataStructuresSelfTestSuite2.java | 99 + .../IgniteCacheFailoverTestSuite.java | 24 - .../IgniteCacheFailoverTestSuite2.java | 31 - .../IgniteCacheFailoverTestSuite4.java | 51 + .../IgniteCacheFailoverTestSuite5.java | 59 + .../testsuites/IgniteCacheTestSuite13.java | 34 +- .../testsuites/IgniteCacheTestSuite14.java | 190 + .../testsuites/IgniteCacheTestSuite15.java | 108 + .../testsuites/IgniteCacheTestSuite16.java | 98 + .../testsuites/IgniteCacheTestSuite17.java | 76 + .../testsuites/IgniteCacheTestSuite18.java | 172 + .../testsuites/IgniteCacheTestSuite19.java | 82 + .../testsuites/IgniteCacheTestSuite2.java | 144 +- .../testsuites/IgniteCacheTestSuite4.java | 171 +- .../testsuites/IgniteCacheTestSuite5.java | 63 - .../testsuites/IgniteCacheTestSuite6.java | 58 - .../testsuites/IgniteCacheTestSuite8.java | 35 - .../testsuites/IgniteCacheTestSuite9.java | 26 - .../testsuites/IgniteSnapshotTestSuite.java | 10 - .../testsuites/IgniteSnapshotTestSuite2.java | 4 - .../testsuites/IgniteSnapshotTestSuite4.java | 2 + .../testsuites/IgniteSnapshotTestSuite7.java | 60 + .../testsuites/IgniteSnapshotTestSuite8.java | 54 + .../IgniteSpiDiscoverySelfTestSuite.java | 83 - .../IgniteSpiDiscoverySelfTestSuite2.java | 103 + .../ignite/util/GridIntListSelfTest.java | 12 + .../TestCollectionsMessageSerializer.java | 2 +- .../codegen/TestMapMessageSerializer.java | 2 +- .../codegen/TestMessageSerializer.java | 6 +- modules/core/src/test/webapp/WEB-INF/web.xml | 8 +- modules/ducktests/README.md | 497 +- modules/ducktests/tests/docker/Dockerfile | 166 +- modules/ducktests/tests/docker/ducker-ignite | 16 +- modules/ducktests/tests/tox.ini | 40 +- modules/extdata/uri/pom.xml | 28 +- .../uri/tasks/GarHelloWorldTask.java | 7 +- .../uri/tasks/GridUriDeploymentTestTask1.java | 7 +- .../uri/tasks/GridUriDeploymentTestTask2.java | 6 +- .../uri/tasks/GridUriDeploymentTestTask9.java | 6 +- .../query/h2/dml/DmlBatchSender.java | 3 +- .../processors/query/h2/dml/DmlUtils.java | 4 +- .../query/IndexQueryInlineSizesTest.java | 2 +- ...tadataConcurrentUpdateWithIndexesTest.java | 9 +- .../index/IndexCorruptionRebuildTest.java | 4 +- .../cache/metric/SqlViewExporterSpiTest.java | 10 +- .../WalDisabledDuringIndexRecreateTest.java | 4 +- .../IgniteBinaryCacheQueryTestSuite.java | 134 - .../IgniteBinaryCacheQueryTestSuite2.java | 47 - .../IgniteBinaryCacheQueryTestSuite3.java | 2 - .../IgniteBinaryCacheQueryTestSuite5.java | 73 + .../IgniteBinaryCacheQueryTestSuite6.java | 164 + .../IgniteCacheQuerySelfTestSuite6.java | 2 + modules/jta/pom.xml | 27 +- .../ignite/cache/jta/CacheTmLookup.java | 2 +- .../cache/jta/jndi/CacheJndiTmFactory.java | 2 +- .../cache/jta/jndi/CacheJndiTmLookup.java | 2 +- .../jta/reflect/CacheReflectionTmLookup.java | 2 +- .../websphere/WebSphereLibertyTmFactory.java | 2 +- .../jta/websphere/WebSphereTmFactory.java | 18 +- .../processors/cache/jta/CacheJtaManager.java | 8 +- .../cache/jta/CacheJtaResource.java | 4 +- .../cache/CacheJndiTmFactorySelfTest.java | 16 +- ...cheJtaConfigurationValidationSelfTest.java | 2 +- ...cheJtaFactoryConfigValidationSelfTest.java | 2 +- .../cache/GridJtaLifecycleAwareSelfTest.java | 6 +- .../GridJtaTransactionManagerSelfTest.java | 50 +- .../cache/jta/AbstractCacheJtaSelfTest.java | 32 +- ...ridPartitionedCacheJtaFactorySelfTest.java | 4 +- ...tionedCacheJtaLookupClassNameSelfTest.java | 4 +- modules/nio/pom.xml | 75 + .../UnknownMessageException.java | 0 .../processors/odbc/ClientMessage.java | 6 +- .../internal/processors/tracing/MTC.java | 0 .../internal/processors/tracing/NoopSpan.java | 0 .../processors/tracing/NoopSpanManager.java | 58 + .../internal/processors/tracing/Span.java | 0 .../processors/tracing/SpanManager.java | 7 + .../internal/processors/tracing/SpanTags.java | 0 .../internal/processors/tracing/SpanType.java | 0 .../tracing/messages/SpanTransport.java | 0 .../nio/GridAbstractCommunicationClient.java | 8 +- .../internal/util/nio/GridBufferedParser.java | 0 .../util/nio/GridCommunicationClient.java | 0 .../nio/GridConnectionBytesVerifyFilter.java | 18 +- .../util/nio/GridDelimitedParser.java | 0 .../internal/util/nio/GridDirectParser.java | 12 +- .../util/nio/GridNioAsyncNotifyFilter.java | 4 +- .../util/nio/GridNioBackPressureControl.java | 0 .../internal/util/nio/GridNioCodecFilter.java | 0 .../util/nio/GridNioDelimitedBuffer.java | 0 .../internal/util/nio/GridNioException.java | 0 .../internal/util/nio/GridNioFilter.java | 0 .../util/nio/GridNioFilterAdapter.java | 0 .../internal/util/nio/GridNioFilterChain.java | 0 .../util/nio/GridNioKeyAttachment.java | 0 .../util/nio/GridNioMessageReaderFactory.java | 0 .../util/nio/GridNioMessageTracker.java | 0 .../util/nio/GridNioMessageWriterFactory.java | 0 .../internal/util/nio/GridNioParser.java | 0 .../util/nio/GridNioRecoveryDescriptor.java | 10 +- .../internal/util/nio/GridNioServer.java | 311 +- .../util/nio/GridNioServerBuffer.java | 0 .../util/nio/GridNioServerListener.java | 0 .../nio/GridNioServerListenerAdapter.java | 0 .../internal/util/nio/GridNioSession.java | 0 .../internal/util/nio/GridNioSessionImpl.java | 12 +- .../util/nio/GridNioSessionMetaKey.java | 0 .../util/nio/GridNioTracerFilter.java | 10 +- .../internal/util/nio/GridNioWorker.java | 0 .../util/nio/GridSelectorNioSessionImpl.java | 60 +- .../nio/GridTcpNioCommunicationClient.java | 4 +- .../util/nio/SelectedSelectionKeySet.java | 0 .../util/nio/SessionWriteRequest.java | 0 .../internal/util/nio/package-info.java | 0 .../util/nio/ssl/BlockingSslHandler.java | 8 +- .../util/nio/ssl/GridNioSslFilter.java | 37 +- .../util/nio/ssl/GridNioSslHandler.java | 10 +- .../internal/util/nio/ssl/GridSslMeta.java | 0 .../internal/util/nio/ssl/package-info.java | 0 .../extensions/communication/Message.java | 0 .../communication/MessageArrayType.java | 0 .../MessageCollectionItemType.java | 3 + .../communication/MessageCollectionType.java | 0 .../communication/MessageFactory.java | 0 .../communication/MessageMapType.java | 0 .../communication/MessageReader.java | 4 + .../communication/MessageSerializer.java | 0 .../extensions/communication/MessageType.java | 0 .../communication/MessageWriter.java | 9 + .../Apache.Ignite.AspNet.Tests/App.config | 8 +- .../Binary/BinarySelfTest.cs | 1 + .../Compute/ComputeTaskSessionTest.cs | 3 +- .../ConsoleRedirectTest.cs | 15 +- .../DeploymentTest.cs | 6 +- .../ExecutableTest.cs | 14 +- .../JavaServer/pom.xml | 2 +- .../Process/ListDataReader.cs | 28 + .../Apache.Ignite.Core.Tests/TestUtils.cs | 9 +- .../Apache.Ignite.Core.Tests/app.config | 6 +- .../custom_app.config | 2 +- .../App.config | 6 +- modules/rest-http/pom.xml | 12 +- .../http/jetty/GridJettyRestHandler.java | 22 +- .../http/jetty/GridJettyRestProtocol.java | 50 +- .../http/jetty/IgniteRestExtension.java | 2 +- .../protocols/http/jetty/WelcomeHandler.java | 15 +- .../http/jetty/IgniteRestExtensionTest.java | 4 +- .../GridResourceSpringBeanInjector.java | 6 +- .../GridResourceProcessorSelfTest.java | 5 +- modules/thin-client/impl/README.txt | 8 + modules/thin-client/impl/pom.xml | 81 + .../EventListenerDemultiplexer.java | 0 .../client/thin/BinaryNameMapperMode.java | 0 .../client/thin/ClientAtomicLongImpl.java | 6 +- .../internal/client/thin/ClientBinary.java | 0 .../client/thin/ClientBinaryMarshaller.java | 12 +- .../thin/ClientCacheAffinityContext.java | 4 +- .../thin/ClientCacheAffinityMapping.java | 13 +- .../client/thin/ClientCacheEntry.java | 0 .../thin/ClientCacheEntryListenerHandler.java | 4 +- .../ClientCacheEntryListenersRegistry.java | 0 .../internal/client/thin/ClientChannel.java | 0 .../thin/ClientChannelConfiguration.java | 0 .../client/thin/ClientClusterGroupImpl.java | 6 +- .../client/thin/ClientClusterImpl.java | 0 .../client/thin/ClientClusterNodeImpl.java | 0 .../client/thin/ClientComputeImpl.java | 4 +- .../thin/ClientContinuousQueryCursor.java | 6 +- .../client/thin/ClientDiscoveryContext.java | 6 +- .../client/thin/ClientFieldsQueryCursor.java | 0 .../client/thin/ClientFieldsQueryPager.java | 0 .../client/thin/ClientIgniteSetImpl.java | 0 .../ClientInternalBinaryConfiguration.java | 0 .../client/thin/ClientJCacheAdapter.java | 0 .../ClientJCacheEntryListenerAdapter.java | 0 .../client/thin/ClientNotificationType.java | 0 .../internal/client/thin/ClientOperation.java | 0 .../client/thin/ClientProtocolError.java | 0 .../client/thin/ClientQueryCursor.java | 0 .../client/thin/ClientQueryPager.java | 0 .../thin/ClientRetryPolicyContextImpl.java | 0 .../thin/ClientServiceDescriptorImpl.java | 1 - .../client/thin/ClientServicesImpl.java | 4 +- .../internal/client/thin/ClientSslUtils.java | 0 .../internal/client/thin/ClientUtils.java | 0 .../client/thin/FieldsQueryPager.java | 0 .../client/thin/GenericQueryPager.java | 0 .../client/thin/IgniteClientFutureImpl.java | 0 .../client/thin/NotificationListener.java | 0 .../client/thin/PayloadInputChannel.java | 0 .../client/thin/PayloadOutputChannel.java | 0 .../internal/client/thin/ProtocolContext.java | 0 .../internal/client/thin/ProtocolVersion.java | 0 .../client/thin/ProtocolVersionFeature.java | 0 .../internal/client/thin/QueryPager.java | 0 .../client/thin/ReliableChannelEx.java | 0 .../client/thin/ReliableChannelImpl.java | 10 +- .../internal/client/thin/TcpClientCache.java | 6 +- .../client/thin/TcpClientChannel.java | 18 +- .../client/thin/TcpClientTransactions.java | 0 .../internal/client/thin/TcpIgniteClient.java | 7 +- .../client/thin/io/ClientConnection.java | 0 .../thin/io/ClientConnectionMultiplexer.java | 0 .../thin/io/ClientConnectionStateHandler.java | 0 .../client/thin/io/ClientMessageDecoder.java | 0 .../client/thin/io/ClientMessageHandler.java | 0 .../GridNioClientConnection.java | 0 .../GridNioClientConnectionMultiplexer.java | 2 +- .../gridnioserver/GridNioClientListener.java | 0 .../io/gridnioserver/GridNioClientParser.java | 0 modules/tools/pom.xml | 2 +- .../uri/GridUriDeploymentSpringDocument.java | 6 +- .../uri/GridUriDeploymentSpringParser.java | 10 +- .../http/GridHttpDeploymentSelfTest.java | 5 +- .../src/main/webapp/WEB-INF/web.xml | 10 +- modules/web/ignite-websphere-test/pom.xml | 12 +- .../ignite/webtest/TestJtaTxServlet.java | 8 +- .../src/main/webapp/WEB-INF/web.xml | 10 +- modules/web/pom.xml | 12 +- .../cache/websession/WebSessionFilter.java | 9 +- .../websession/WebSessionSelfTest.java | 11 +- .../websession/WebSessionServerStart.java | 4 +- modules/web/src/test/webapp2/WEB-INF/web.xml | 8 +- .../zk/internal/DiscoveryMessageParser.java | 5 +- .../zk/internal/ZkBulkJoinContext.java | 8 +- .../zk/internal/ZkDiscoDataBagWrapper.java | 77 + .../zk/internal/ZkMessageFactory.java | 1 + .../zk/internal/ZookeeperDiscoveryImpl.java | 16 +- parent/pom.xml | 28 +- pom.xml | 4 +- 687 files changed, 38168 insertions(+), 22225 deletions(-) create mode 100644 docs/_docs/clustering/multi-data-center.adoc rename modules/{core => binary/api}/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java (100%) rename modules/{core => binary/api}/src/main/java/org/apache/ignite/marshaller/IgniteObjectInputFilter.java (100%) rename modules/{core => binary/api}/src/main/java/org/apache/ignite/marshaller/MarshallerUtils.java (86%) create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorFactoryProvider.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactoryBase.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/BufferingWindowPartition.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/RangeWindowPartitionFrame.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/RowWindowPartitionFrame.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/StreamWindowFunction.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/StreamWindowPartition.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunction.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctionFactory.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctionWrapper.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctions.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartition.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionBase.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionFactory.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionFrame.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/WindowNode.java delete mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteJoinInfo.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteWindow.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/WindowConverterRule.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/logical/WindowConstantsRule.java create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/SqlLeadLagFunction.java create mode 100644 modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/WindowExecutionTest.java create mode 100644 modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/WindowIntegrationTest.java create mode 100644 modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/WindowPlannerTest.java rename modules/calcite/src/test/sql/subquery/scalar/{test_window_function_subquery.test_ignore => test_window_function_subquery.test} (95%) create mode 100644 modules/calcite/src/test/sql/window/test_window_functions.test rename modules/{core => commons}/src/main/java/org/apache/ignite/cache/CacheEntryVersion.java (74%) rename modules/{core => commons}/src/main/java/org/apache/ignite/cache/query/CacheEntryEventAdapter.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/cache/query/IndexQuery.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/cache/query/IndexQueryCriterion.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/cache/query/SqlQuery.java (97%) rename modules/{core => commons}/src/main/java/org/apache/ignite/compute/ComputeExecutionRejectedException.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/failure/FailureType.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/ClassSet.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/NodeStoppingException.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/cache/query/InIndexQueryCriterion.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/cache/query/RangeIndexQueryCriterion.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/processors/affinity/AffinityTopologyVersion.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeResult.java (88%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java (92%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/processors/odbc/ClientConnectionNodeRecoveryException.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/processors/platform/cache/expiry/PlatformExpiryPolicy.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientFlag.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/processors/platform/client/IgniteClientException.java (80%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/GridLongList.java (99%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/HostAndPortRange.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java (92%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/future/GridFinishedFuture.java (98%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/future/GridFutureAdapter.java (98%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/future/GridFutureChainListener.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/lang/ClusterNodeFunc.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/lang/IgniteInClosure2X.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ContainsNodeIdsPredicate.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/EqualsClusterNodeIdPredicate.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasEqualIdPredicate.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasNotEqualIdPredicate.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/typedef/CIX2.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/worker/GridWorker.java (96%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerListener.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerPool.java (95%) rename modules/{core => commons}/src/main/java/org/apache/ignite/internal/util/worker/WorkProgressDispatcher.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/logger/NullLogger.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/platform/PlatformServiceMethod.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/spi/tracing/Scope.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/ssl/AbstractSslContextFactory.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/ssl/DelegatingSSLContextSpi.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/ssl/SSLContextWrapper.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/ssl/SSLServerSocketFactoryWrapper.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/ssl/SSLSocketFactoryWrapper.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/ssl/SslContextFactory.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/ssl/package-info.java (100%) rename modules/{core => commons}/src/main/java/org/apache/ignite/util/deque/FastSizeDeque.java (100%) rename modules/core/src/main/java/org/apache/ignite/internal/{GridDirectCollection.java => OperationContextMessage.java} (60%) delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoSecurityAwareMessage.java rename modules/core/src/main/java/org/apache/ignite/internal/{processors/query/InlineSizesData.java => managers/encryption/EncryptionDataBagItem.java} (75%) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/EventsDataBagItem.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/AuthentificationDataBagItem.java rename modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/{BinaryMetadataVersionsData.java => CacheBinaryDataBagItem.java} (77%) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxSalvageMessage.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterUpdateNotifierDataBagItem.java rename modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/{MarshallerMappingsData.java => MarshallerDataBagItem.java} (78%) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/PluginsDataBagItem.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityExMessage.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessage.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryInlineSizesDataBagItem.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryProposalsDataBagItem.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractProcess.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/IgniteComponentUpgradeState.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeClusterData.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteComponentFeatureSet.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteComponentFeatureSetProvider.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteCoreFeature.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeature.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureSet.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteNodeFeatureSet.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/SupportedFeatureRegistry.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextWrapper.java rename modules/core/src/main/java/org/apache/ignite/internal/{GridDirectMap.java => thread/context/DistributedOperationContextAttribute.java} (57%) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java rename modules/core/src/main/java/org/apache/ignite/spi/discovery/{ObjectData.java => SerializableDataBagItemWrapper.java} (64%) rename modules/core/src/main/resources/{ignite.properties => ignite-build-info.properties} (100%) delete mode 100644 modules/core/src/test/java/org/apache/ignite/internal/GridReleaseTypeSelfTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewAbstractTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewBinaryMetaTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewCacheTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClientTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewComputeTaskTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewConfigurationTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewDSTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewExecutorsTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewMetastorageTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewNodesTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPageListsTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPageTimestampsTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPluginTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewQueriesTest.java delete mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewServiceTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSnapshotsTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewTransactionsTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOperationContextTransactionalLockTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheVersionedEntryTransactionalLockTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/cache/LockTxEntryOneNodeTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/cache/MdcCacheMetricsTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxCacheWithWriteThroughCheckTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/dump/IgniteCacheDumpSeveralDiskTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessageSerializationTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/CoreVersionRollingUpgradeTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/PluginVersionRollingUpgradeTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureSetTest.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_18_0.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_0.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_1.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_2.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_3.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_20_0.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_20_1.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_21_0.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_21_1.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginComponentFeatureSetProvider.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginFeature.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_1_0_0.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_2_0_0.java create mode 100644 modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_3_0_0.java create mode 100644 modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestBlockingTcpDiscoverySpi.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheConsistencySelfTestSuite2.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite2.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite4.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite5.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite14.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite15.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite16.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite17.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite18.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite19.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite7.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite8.java create mode 100644 modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite2.java create mode 100644 modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite5.java create mode 100644 modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite6.java create mode 100644 modules/nio/pom.xml rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/processors/odbc/ClientMessage.java (97%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java (100%) create mode 100644 modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpanManager.java rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java (89%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridAbstractCommunicationClient.java (91%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridBufferedParser.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridCommunicationClient.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridConnectionBytesVerifyFilter.java (86%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridDelimitedParser.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridDirectParser.java (89%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioAsyncNotifyFilter.java (96%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioBackPressureControl.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioCodecFilter.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioDelimitedBuffer.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioException.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilter.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterAdapter.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterChain.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioKeyAttachment.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageReaderFactory.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageTracker.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageWriterFactory.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioParser.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioRecoveryDescriptor.java (96%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java (93%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerBuffer.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListener.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListenerAdapter.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioSession.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionImpl.java (96%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionMetaKey.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java (93%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridNioWorker.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java (88%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/GridTcpNioCommunicationClient.java (97%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/SelectedSelectionKeySet.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/SessionWriteRequest.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/package-info.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/ssl/BlockingSslHandler.java (98%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java (91%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslHandler.java (98%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridSslMeta.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/internal/util/nio/ssl/package-info.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageArrayType.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionItemType.java (97%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionType.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageMapType.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java (97%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageType.java (100%) rename modules/{core => nio}/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java (97%) create mode 100644 modules/thin-client/impl/README.txt create mode 100644 modules/thin-client/impl/pom.xml rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/monitoring/EventListenerDemultiplexer.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/BinaryNameMapperMode.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java (94%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientBinary.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java (92%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java (99%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java (96%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntry.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenerHandler.java (98%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenersRegistry.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterGroupImpl.java (99%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterImpl.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterNodeImpl.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientComputeImpl.java (99%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientContinuousQueryCursor.java (93%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientDiscoveryContext.java (97%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryCursor.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryPager.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientIgniteSetImpl.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientInternalBinaryConfiguration.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheAdapter.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheEntryListenerAdapter.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientNotificationType.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientProtocolError.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryPager.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientRetryPolicyContextImpl.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientServiceDescriptorImpl.java (98%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientServicesImpl.java (98%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientSslUtils.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/FieldsQueryPager.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/IgniteClientFutureImpl.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/NotificationListener.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/PayloadOutputChannel.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ProtocolContext.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersion.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersionFeature.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java (99%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java (99%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java (98%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java (99%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnection.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionMultiplexer.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionStateHandler.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageDecoder.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageHandler.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnection.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java (99%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientListener.java (100%) rename modules/{core => thin-client/impl}/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientParser.java (100%) create mode 100644 modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDiscoDataBagWrapper.java diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 10cd1d8dc888f..ef01c4debdecc 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -21,4 +21,5 @@ updates: - dependency-name: "junit:junit" - - dependency-name: "com.h2database:h2" \ No newline at end of file + - dependency-name: "com.h2database:h2" + - dependency-name: "com.puppycrawl.tools:checkstyle" \ No newline at end of file diff --git a/.github/workflows/check-protected-classes.yml b/.github/workflows/check-protected-classes.yml index 4abab25b790b8..59ebe38eadfdd 100644 --- a/.github/workflows/check-protected-classes.yml +++ b/.github/workflows/check-protected-classes.yml @@ -28,6 +28,7 @@ jobs: permissions: issues: write pull-requests: write + checks: write steps: - uses: actions/checkout@v6 with: @@ -39,26 +40,35 @@ jobs: run: | BASE_SHA=${{ github.event.pull_request.base.sha }} HEAD_SHA=${{ github.event.pull_request.head.sha }} - - HITS="" - - # New and deleted files: check diff content for @Order annotation. - for file in $(git diff --name-only --no-renames --diff-filter=AD "$BASE_SHA"..."$HEAD_SHA" -- '*.java'); do - if git diff "$BASE_SHA"..."$HEAD_SHA" -- "$file" | grep -q 'org.apache.ignite.internal.Order'; then - HITS="${HITS}${file}\n" - fi - done - - # Modified files: check base version content for @Order annotation. - for file in $(git diff --name-only --no-renames --diff-filter=M "$BASE_SHA"..."$HEAD_SHA" -- '*.java'); do - if git show "${BASE_SHA}:${file}" 2>/dev/null | grep -q 'org.apache.ignite.internal.Order'; then - HITS="${HITS}${file}\n" - fi - done - - if [ -n "$HITS" ]; then + ANNOTATION='org.apache.ignite.internal.Order' + HITS_FILE=/tmp/protected-hits.txt + + # Added/deleted/modified .java files in the PR as "\t" lines. + changed_java_files() { + git diff --name-status --no-renames --diff-filter=ADM "$BASE_SHA"..."$HEAD_SHA" -- '*.java' + } + + # A protected class carries the @Order annotation; an added file is + # defined by the new revision, a deleted/modified one by the base. + is_protected_class() { + local status=$1 file=$2 ref=$BASE_SHA + [ "$status" = A ] && ref=$HEAD_SHA + git show "$ref:$file" 2>/dev/null | grep -q "$ANNOTATION" + } + + # Read "\t" lines, emit the paths that are protected. + filter_protected() { + while IFS=$'\t' read -r status file; do + if is_protected_class "$status" "$file"; then + echo "$file" + fi + done + } + + changed_java_files | filter_protected > "$HITS_FILE" + + if [ -s "$HITS_FILE" ]; then echo "affected=true" >> "$GITHUB_OUTPUT" - printf '%b' "$HITS" > /tmp/protected-hits.txt fi - name: Comment on PR @@ -114,7 +124,28 @@ jobs: labels: ['compatibility'], }); - - name: Fail on affected check + - name: Warning check on affected if: steps.check.outputs.affected == 'true' - run: | - exit 1 + uses: actions/github-script@v8 + with: + script: | + const fs = require('fs'); + const hits = fs.readFileSync('/tmp/protected-hits.txt', 'utf8').trim(); + await github.rest.checks.create({ + owner: context.repo.owner, + repo: context.repo.repo, + name: 'Rolling upgrade compatibility', + head_sha: context.payload.pull_request.head.sha, + status: 'completed', + conclusion: 'neutral', + output: { + title: 'Possible compatibility issues', + summary: [ + 'This PR modifies protected classes (with **Order** annotation).', + 'Changes to these classes can break rolling upgrade compatibility.', + '', + '**Affected files:**', + hits.split('\n').map(f => '- `' + f.trim() + '`').join('\n'), + ].join('\n'), + }, + }); diff --git a/.github/workflows/commit-check.yml b/.github/workflows/commit-check.yml index 7f91087932874..3dc4cbbae05de 100644 --- a/.github/workflows/commit-check.yml +++ b/.github/workflows/commit-check.yml @@ -14,8 +14,12 @@ # limitations under the License. name: Code Style, Abandoned Tests, Javadocs + +# pull_request_target (not pull_request) so the checks also run when the PR conflicts with the base +# branch. These jobs build and run untrusted PR code: keep the token read-only and add no secrets +# here, otherwise a fork PR could read them. on: - pull_request: + pull_request_target: push: branches: - master @@ -25,6 +29,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true +permissions: + contents: read + jobs: check-java: runs-on: ubuntu-latest @@ -43,6 +50,7 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} + cache: 'maven' - name: Install prerequisites run: | @@ -96,11 +104,26 @@ jobs: - name: Run codestyle and licenses checks run: | - ./mvnw test-compile -Pall-java,licenses,lgpl,checkstyle,examples,scala,check-licenses -B -V + set -o pipefail + rc=0 + ./mvnw test-compile -Pall-java,licenses,lgpl,checkstyle,examples,check-licenses -B -V -T 1C 2>&1 | tee mvn-codestyle.log || rc=$? + if [ "$rc" -ne 0 ] && grep -q "COMPILATION ERROR" mvn-codestyle.log; then + echo "::error title=Compilation failed::Java compilation failed - this is a compile error, not a checkstyle violation. The flood of 'cannot find symbol' for generated *Walker/*Serializer/*Factory classes is a cascade: javac drops annotation-processor output when compilation fails. Fix the real error(s) listed in the build log group below first." + echo "::group::Likely root-cause compile errors (generated-class cascade filtered out)" + awk ' + /^\[ERROR\].*cannot find symbol/ { loc=$0; getline s; gsub(/^[[:space:]]*(\[ERROR\][[:space:]]*)?/, "", s); + if (s !~ /(Walker|Serializer|Factory)([^A-Za-z]|$)/) print loc " -> " s; next } + /^\[ERROR\].*\.java:\[[0-9]+,[0-9]+\]/ { + if ($0 !~ /codegen\.idto|internal\.systemview/) print $0 } + ' mvn-codestyle.log | sed -E 's#^.*/modules/#modules/#; s/^\[ERROR\] //' | sort -u | head -n 40 + echo "::endgroup::" + fi + exit "$rc" - name: Run abandoned tests checks. + # Reuse classes from the previous step; the differing profiles otherwise trigger a full reactor recompile. run : | - ./mvnw test -Pcheck-test-suites,all-java,scala -B -V + ./mvnw test -Pcheck-test-suites,all-java -B -V -Dmaven.compiler.useIncrementalCompilation=false - name: Check javadocs. run : | diff --git a/.gitignore b/.gitignore index 06151abef9940..64ad541bb0f8d 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,4 @@ modules/ducktests/tests/build/** modules/ducktests/tests/dist/** /.gigaide/gigaide.properties *.bkp +/.git \ No newline at end of file diff --git a/assembly/dependencies-apache-ignite-lgpl.xml b/assembly/dependencies-apache-ignite-lgpl.xml index ac3d35c972a66..b6df36f14c7b6 100644 --- a/assembly/dependencies-apache-ignite-lgpl.xml +++ b/assembly/dependencies-apache-ignite-lgpl.xml @@ -119,6 +119,8 @@ ${project.groupId}:ignite-binary-api ${project.groupId}:ignite-binary-impl ${project.groupId}:ignite-thin-client-api + ${project.groupId}:ignite-thin-client-impl + ${project.groupId}:ignite-nio ${project.groupId}:ignite-clients ${project.groupId}:ignite-spring ${project.groupId}:ignite-tools diff --git a/assembly/dependencies-apache-ignite-slim.xml b/assembly/dependencies-apache-ignite-slim.xml index f113444139b1a..7f71529afe68a 100644 --- a/assembly/dependencies-apache-ignite-slim.xml +++ b/assembly/dependencies-apache-ignite-slim.xml @@ -119,6 +119,8 @@ ${project.groupId}:ignite-binary-api ${project.groupId}:ignite-binary-impl ${project.groupId}:ignite-thin-client-api + ${project.groupId}:ignite-thin-client-impl + ${project.groupId}:ignite-nio ${project.groupId}:ignite-clients ${project.groupId}:ignite-spring ${project.groupId}:ignite-tools diff --git a/assembly/dependencies-apache-ignite.xml b/assembly/dependencies-apache-ignite.xml index 5952320cba9b2..972c88a0cd57f 100644 --- a/assembly/dependencies-apache-ignite.xml +++ b/assembly/dependencies-apache-ignite.xml @@ -120,6 +120,8 @@ ${project.groupId}:ignite-binary-api ${project.groupId}:ignite-binary-impl ${project.groupId}:ignite-thin-client-api + ${project.groupId}:ignite-thin-client-impl + ${project.groupId}:ignite-nio ${project.groupId}:ignite-clients ${project.groupId}:ignite-spring ${project.groupId}:ignite-tools diff --git a/checkstyle/checkstyle.xml b/checkstyle/checkstyle.xml index d1423237dadf6..7bb56603bc603 100644 --- a/checkstyle/checkstyle.xml +++ b/checkstyle/checkstyle.xml @@ -64,7 +64,7 @@ - + diff --git a/docs/_data/toc.yaml b/docs/_data/toc.yaml index 881c5523e154e..e8a6eefc570b6 100644 --- a/docs/_data/toc.yaml +++ b/docs/_data/toc.yaml @@ -77,6 +77,8 @@ url: clustering/discovery-in-the-cloud - title: Network Configuration url: clustering/network-configuration + - title: Multi Data Center Deployment + url: clustering/multi-data-center - title: Connecting Client Nodes url: clustering/connect-client-nodes - title: Baseline Topology diff --git a/docs/_docs/clustering/clustering.adoc b/docs/_docs/clustering/clustering.adoc index 8496a3c7799ac..08259bbcdfa7a 100644 --- a/docs/_docs/clustering/clustering.adoc +++ b/docs/_docs/clustering/clustering.adoc @@ -24,6 +24,9 @@ Client nodes join the topology as regular nodes but they do not store data. Clie To form a cluster, each node must be able to connect to all other nodes. To ensure that, a proper <> must be configured. +Ignite can also run a single cluster across multiple data centers. +See link:clustering/multi-data-center[Multi Data Center Deployment] for configuration details. + NOTE: In addition to client nodes, you can use Thin Clients to define and manipulate data in the cluster. Learn more about the thin clients in the link:thin-clients/getting-started-with-thin-clients[Thin Clients] section. diff --git a/docs/_docs/clustering/discovery-in-the-cloud.adoc b/docs/_docs/clustering/discovery-in-the-cloud.adoc index 9f52c9197750d..8d43a8eeb0c8b 100644 --- a/docs/_docs/clustering/discovery-in-the-cloud.adoc +++ b/docs/_docs/clustering/discovery-in-the-cloud.adoc @@ -273,10 +273,10 @@ tab:C++[unsupported] == Azure Blob Storage Ignite supports automatic node discovery by utilizing Azure Blob Storage. -This mechanism is implemented in `TcpDiscoveryAzureBlobStorageIpFinder`. +This mechanism is implemented in `TcpDiscoveryAzureBlobStoreIpFinder`. On start-up, each node registers its IP address in the storage and discovers other nodes by reading the storage. -IMPORTANT: To use `TcpDiscoveryAzureBlobStorageIpFinder` you must download and link:setup#enabling-modules[enable the 'ignite-azure-ext' extension]. +IMPORTANT: To use `TcpDiscoveryAzureBlobStoreIpFinder` you must download and link:setup#enabling-modules[enable the 'ignite-azure-ext' extension]. Here is an example of how to configure Azure Blob Storage based IP finder: diff --git a/docs/_docs/clustering/multi-data-center.adoc b/docs/_docs/clustering/multi-data-center.adoc new file mode 100644 index 0000000000000..e37dca248573d --- /dev/null +++ b/docs/_docs/clustering/multi-data-center.adoc @@ -0,0 +1,254 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. += Multi Data Center Deployment + +== Overview + +Ignite can run a single cluster across multiple data centers. +In this mode, every server node is assigned a data center ID. +Ignite uses this ID to group nodes by data center, reduce cross-data-center traffic when possible, +choose local data copies for reads, and validate cache topology during data center failures. + +[NOTE] +==== +Multi data center support is an experimental feature. +APIs and behavior can change in later releases. +==== + +The feature is based on the following components: + +* `IGNITE_DATA_CENTER_ID` - system property or user attribute that assigns a node to a data center. +* `ClusterNode#dataCenterId()` - node API that exposes the configured data center ID. +* `MdcTopologyValidator` - cache topology validator that can block updates when not enough data centers are visible. +* `MdcAffinityBackupFilter` - affinity backup filter that spreads partition copies evenly across data centers. +* Thin client data center awareness - routing that prefers nodes from the client's data center. + +== Configuring Data Center ID + +Set the same data center ID on all server nodes located in the same data center. +Nodes from different data centers must use different IDs. + +You can set the ID with the `IGNITE_DATA_CENTER_ID` system property: + +[source,shell] +---- +bin/ignite.sh -J-DIGNITE_DATA_CENTER_ID=DC1 +---- + +You can also set the same value as a user attribute in `IgniteConfiguration`: + +[source,java] +---- +IgniteConfiguration cfg = new IgniteConfiguration(); + +cfg.setUserAttributes(Collections.singletonMap( + IgniteSystemProperties.IGNITE_DATA_CENTER_ID, "DC1")); +---- + +Server nodes in the same cluster must be configured consistently: + +* If one server node has a data center ID, all server nodes must have a data center ID. +* Server nodes without a data center ID cannot join a cluster where server nodes have data center IDs. +* Server nodes with a data center ID cannot join a cluster where server nodes do not have data center IDs. +* Client nodes can join with or without a data center ID. + +== Discovery + +`TcpDiscoverySpi` uses data center IDs to keep nodes from the same data center close to each other in +the discovery ring. +When a data center becomes unavailable, discovery can check remote data centers in parallel and close the ring +through the local data center if the remote data center does not respond. + +Client nodes also use the data center ID during discovery. +If a client has a data center ID, it tries to connect through a server node from the same data center. +If no server node from the same data center is available, the client connects through any available server node. + +== Cache Topology Validation + +Use `MdcTopologyValidator` to protect caches from updates when the visible topology does not contain enough data centers. +The validator ignores client nodes and checks only server nodes. + +The validator supports two modes: + +* Majority-based validation - for an odd number of data centers, specify the full set of data centers. +Updates are allowed only when the visible topology contains a majority of the configured data centers. +* Main data center validation - for an even number of data centers, specify the main data center. +Updates are allowed while the main data center is visible. + +[tabs] +-- +tab:XML[] +[source,xml] +---- + + + + + + + DC1 + DC2 + DC3 + + + + + +---- + +tab:Java[] +[source,java] +---- +MdcTopologyValidator validator = new MdcTopologyValidator(); + +validator.setDatacenters(Set.of("DC1", "DC2", "DC3")); + +CacheConfiguration cacheCfg = + new CacheConfiguration("accounts") + .setTopologyValidator(validator); +---- +-- + +For an even number of data centers, configure a main data center: + +[tabs] +-- +tab:XML[] +[source,xml] +---- + + + + + + + + +---- + +tab:Java[] +[source,java] +---- +MdcTopologyValidator validator = new MdcTopologyValidator(); + +validator.setMainDatacenter("DC1"); + +CacheConfiguration cacheCfg = + new CacheConfiguration("accounts") + .setTopologyValidator(validator); +---- +-- + +The validator configuration is checked when the cache is created. +The following configurations are invalid: + +* Neither `datacenters` nor `mainDatacenter` is specified. +* `datacenters` is specified as an empty set. +* `mainDatacenter` is specified together with an odd number of data centers. + +== Placing Backup Copies Across Data Centers + +Use `MdcAffinityBackupFilter` with `RendezvousAffinityFunction` to distribute partition copies across data centers. +The filter ensures that each partition has the same number of copies in each data center. + +For example, a cache with `backups=3` has four partition copies: one primary and three backups. +In a two-data-center cluster, `MdcAffinityBackupFilter(2, 3)` places two copies in each data center. + +[tabs] +-- +tab:XML[] +[source,xml] +---- + + + + + + + + + + + + + + +---- + +tab:Java[] +[source,java] +---- +CacheConfiguration cacheCfg = + new CacheConfiguration("accounts") + .setBackups(3) + .setAffinity(new RendezvousAffinityFunction() + .setAffinityBackupFilter(new MdcAffinityBackupFilter(2, 3))); +---- +-- + +`MdcAffinityBackupFilter` has the following requirements: + +* The number of data centers must be at least 2. +* `(backups + 1)` must be evenly divisible by the number of data centers. +* All server nodes must have a data center ID. + +If these requirements are not met, the filter either rejects the configuration or cannot place copies predictably. + +For other backup placement strategies, see link:configuring-caches/configuring-backups#affinity-backup-filters[Affinity Backup Filters]. + +== Reading from Local Data Center + +When `CacheConfiguration#readFromBackup` is `true`, Ignite can read from a backup copy instead of the primary copy. +In a multi data center topology, this allows Ignite to use a backup located in the same data center as the +requester when such a backup is available. + +The Java thin client also uses the data center ID for partition awareness. +Set the client's data center ID with the `IGNITE_DATA_CENTER_ID` system property or in +`ClientConfiguration#setUserAttributes(...)`. +If both are configured, the system property takes precedence. +For partition-aware read operations, the client sends requests to a node from its own data center when the cache has +`readFromBackup=true`, its write synchronization mode is not `PRIMARY_SYNC`, and the local data center has a +partition copy. +Writes are still routed to the primary node. + +[source,java] +---- +ClientConfiguration cfg = new ClientConfiguration() + .setAddresses("dc1-node1:10800", "dc1-node2:10800", "dc2-node1:10800") + .setUserAttributes(Collections.singletonMap( + IgniteSystemProperties.IGNITE_DATA_CENTER_ID, "DC1")); +---- + +The same value can be set with the JVM system property: + +[source,shell] +---- +java -DIGNITE_DATA_CENTER_ID=DC1 ... +---- + +If no nodes are available in the client's data center, the client uses other available nodes. + +== Rebalancing + +During rebalancing, Ignite prefers nodes from the same data center when such suppliers are available. +If the required partition data cannot be obtained from the same data center, Ignite can rebalance from a +remote data center. +This behavior applies to both full and historical rebalance. + +== Monitoring + +The data center ID is exposed in the `NODES` system view as part of node information. +For client nodes, the `io.discovery.ClientRouterNodeId` metric exposes the ID of the server node used as +the discovery router. diff --git a/docs/_docs/code-snippets/java/pom.xml b/docs/_docs/code-snippets/java/pom.xml index 990895f58a84b..3ddb1e6261008 100644 --- a/docs/_docs/code-snippets/java/pom.xml +++ b/docs/_docs/code-snippets/java/pom.xml @@ -25,6 +25,7 @@ UTF-8 2.19.0-SNAPSHOT + 1.0.0 @@ -67,12 +68,48 @@ ignite-zookeeper ${ignite.version} + + ${project.groupId} + ignite-aws-ext + ${ignite.extensions.version} + + + ${project.groupId} + ignite-azure-ext + ${ignite.extensions.version} + + + ${project.groupId} + + ignite-cloud + 2.13.0 + + + ${project.groupId} + ignite-gce-ext + ${ignite.extensions.version} + + + ${project.groupId} + ignite-kubernetes + ${ignite.version} + + + ${project.groupId} + ignite-zookeeper-ip-finder-ext + ${ignite.extensions.version} + ${project.groupId} ignite-opencensus ${ignite.version} + + io.opencensus + opencensus-exporter-trace-zipkin + 0.31.1 + ${project.groupId} diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/BasicCacheOperations.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/BasicCacheOperations.java index 3d445fe453826..60c4023e0d5c2 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/BasicCacheOperations.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/BasicCacheOperations.java @@ -21,6 +21,7 @@ import org.apache.ignite.IgniteCompute; import org.apache.ignite.Ignition; import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.ReadRepairStrategy; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.lang.IgniteFuture; import org.junit.jupiter.api.Test; diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/DiscoveryInTheCloud.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/DiscoveryInTheCloud.java index 607eb5aa2d158..66556c2efe85e 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/DiscoveryInTheCloud.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/DiscoveryInTheCloud.java @@ -25,6 +25,7 @@ import org.apache.ignite.Ignition; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.ipfinder.azure.TcpDiscoveryAzureBlobStoreIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.elb.TcpDiscoveryElbIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.gce.TcpDiscoveryGoogleStorageIpFinder; @@ -153,13 +154,13 @@ public static void azureBlobStorageExample() { //tag::azureBlobStorage[] TcpDiscoverySpi spi = new TcpDiscoverySpi(); - TcpDiscoveryAzureBlobStorageIpFinder ipFinder = new TcpDiscoveryGoogleStorageIpFinder(); + TcpDiscoveryAzureBlobStoreIpFinder ipFinder = new TcpDiscoveryAzureBlobStoreIpFinder(); - finder.setAccountName("yourAccountName"); - finder.setAccountKey("yourAccountKey"); - finder.setAccountEndpoint("yourEndpoint"); + ipFinder.setAccountName("yourAccountName"); + ipFinder.setAccountKey("yourAccountKey"); + ipFinder.setAccountEndpoint("yourEndpoint"); - finder.setContainerName("yourContainerName"); + ipFinder.setContainerName("yourContainerName"); spi.setIpFinder(ipFinder); diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/IgniteSessionContext.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/IgniteSessionContext.java index a295169cb002b..e9cecdd8c28ea 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/IgniteSessionContext.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/IgniteSessionContext.java @@ -16,16 +16,17 @@ */ package org.apache.ignite.snippets; -import javax.cache.Cache; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Map; +import javax.cache.Cache; +import org.apache.ignite.Ignite; +import org.apache.ignite.Ignition; +import org.apache.ignite.cache.CacheInterceptor; import org.apache.ignite.cache.query.annotations.QuerySqlFunction; import org.apache.ignite.configuration.IgniteConfiguration; -import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.cache.CacheInterceptor; import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.resources.SessionContextProviderResource; import org.apache.ignite.session.SessionContextProvider; @@ -75,12 +76,22 @@ public class SessionContextCacheInterceptor implements CacheInterceptor entry) { + // No-op. + } + /** */ @Override public @Nullable IgniteBiTuple onBeforeRemove(Cache.Entry entry) { String ret = sesCtxPrv.getSessionContext().getAttribute("onBeforeRemove"); return new IgniteBiTuple<>(ret != null, entry.getValue()); } + + /** */ + @Override public void onAfterRemove(Cache.Entry entry) { + // No-op. + } } //end::cache-interceptor[] @@ -89,9 +100,9 @@ public void igniteSessContext() { //tag::ignite-context[] try (Ignite ign = Ignition.start(ignCfg)) { - Map appAttrs = F.asMap("SESSION_ID", "1234"); + Map appAttrs = Map.of("SESSION_ID", "1234"); - Ignite app = Ignite.withApplicationAttributes(appAttrs); + Ignite app = ign.withApplicationAttributes(appAttrs); //Your code here... } @@ -113,4 +124,4 @@ public void jdbcSessContext() { throw new RuntimeException(e); } } -} \ No newline at end of file +} diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/JavaThinClient.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/JavaThinClient.java index 50bb9cd3f939a..f8ec3b224b113 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/JavaThinClient.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/JavaThinClient.java @@ -25,6 +25,8 @@ import javax.cache.event.CacheEntryEvent; import javax.cache.event.CacheEntryListenerException; import javax.cache.event.CacheEntryUpdatedListener; +import javax.cache.processor.EntryProcessor; +import javax.cache.processor.MutableEntry; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteBinary; import org.apache.ignite.Ignition; @@ -32,6 +34,8 @@ import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.CacheWriteSynchronizationMode; +import org.apache.ignite.cache.affinity.AffinityFunction; +import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.cache.query.ContinuousQuery; import org.apache.ignite.cache.query.FieldsQueryCursor; import org.apache.ignite.cache.query.Query; @@ -47,6 +51,8 @@ import org.apache.ignite.client.ClientConnectionException; import org.apache.ignite.client.ClientDisconnectListener; import org.apache.ignite.client.ClientException; +import org.apache.ignite.client.ClientPartitionAwarenessMapper; +import org.apache.ignite.client.ClientPartitionAwarenessMapperFactory; import org.apache.ignite.client.ClientTransaction; import org.apache.ignite.client.ClientTransactions; import org.apache.ignite.client.IgniteClient; @@ -359,9 +365,11 @@ void partitionAwareness() throws Exception { try (IgniteClient client = Ignition.startClient(cfg)) { ClientCache cache = client.cache("myCache"); // Put, get or remove data from the cache... - cache.put(0, "Hello, world!"); - // The partition number can be specified with IndexQuery#setPartition(Integer) as well. - ScanQuery scanQuery = new ScanQuery().setPartition(part); + + // Route the scan query to a node that owns the specified partition. + ScanQuery scanQuery = new ScanQuery().setPartition(0); + + cache.query(scanQuery); } catch (ClientException e) { System.err.println(e.getMessage()); } @@ -380,10 +388,10 @@ void partitionAwarenessWithCustomMapper() throws Exception { return aff::partition; } - }) + }); try (IgniteClient client = Ignition.startClient(cfg)) { - ClientCache cache = client.cache(PART_CUSTOM_AFFINITY_CACHE_NAME); + ClientCache cache = client.cache("partitioned_custom_affinity_cache"); // Put, get or remove data from the cache, partition awarenes will be enabled. } catch (ClientException e) { diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/Snapshots.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/Snapshots.java index 0aa2fb44414b2..fe0c026ed501e 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/Snapshots.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/Snapshots.java @@ -16,7 +16,10 @@ */ package org.apache.ignite.snippets; +import java.io.File; +import java.util.Collections; import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; import org.apache.ignite.Ignition; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; @@ -28,7 +31,8 @@ void configuration() { //tag::config[] IgniteConfiguration cfg = new IgniteConfiguration(); - File exSnpDir = U.resolveWorkDirectory(U.defaultWorkDirectory(), "ex_snapshots", true); + // Any directory the Ignite process can write to (example value). + File exSnpDir = new File("work", "ex_snapshots"); cfg.setSnapshotPath(exSnpDir.getAbsolutePath()); //end::config[] diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java index eff7d0376767a..60308e4b392c9 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java @@ -17,8 +17,10 @@ package org.apache.ignite.snippets; import java.io.Serializable; +import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; @@ -26,6 +28,7 @@ import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.cache.query.annotations.QuerySqlField; import org.apache.ignite.cache.query.annotations.QuerySqlFunction; +import org.apache.ignite.cache.query.annotations.QuerySqlTableFunction; import org.apache.ignite.configuration.CacheConfiguration; import org.junit.jupiter.api.Test; diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/TDE.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/TDE.java index d0da94689e128..9391e326e833a 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/TDE.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/TDE.java @@ -16,6 +16,7 @@ */ package org.apache.ignite.snippets; +import java.util.Collections; import org.apache.ignite.Ignite; import org.apache.ignite.Ignition; import org.apache.ignite.configuration.CacheConfiguration; diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/WarmUpStrategy.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/WarmUpStrategy.java index 667b2d4cf55b9..4d5c80f9be282 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/WarmUpStrategy.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/WarmUpStrategy.java @@ -14,70 +14,91 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -//tag::warm-all-regions[] -IgniteConfiguration cfg = new IgniteConfiguration(); +package org.apache.ignite.snippets; -DataStorageConfiguration storageCfg = new DataStorageConfiguration(); +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.LoadAllWarmUpConfiguration; +import org.apache.ignite.configuration.NoOpWarmUpConfiguration; -//Changing the default warm-up strategy for all data regions -storageCfg.setDefaultWarmUpConfiguration(new LoadAllWarmUpConfiguration()); +public class WarmUpStrategy { + public void warmAllRegions() { + //tag::warm-all-regions[] + IgniteConfiguration cfg = new IgniteConfiguration(); -cfg.setDataStorageConfiguration(storageCfg); -//end::warm-all-regions[] -//tag::warm-specific-region[] -IgniteConfiguration cfg = new IgniteConfiguration(); + DataStorageConfiguration storageCfg = new DataStorageConfiguration(); -DataStorageConfiguration storageCfg = new DataStorageConfiguration(); + //Changing the default warm-up strategy for all data regions + storageCfg.setDefaultWarmUpConfiguration(new LoadAllWarmUpConfiguration()); -//Setting another warm-up strategy for a custom data region -DataRegionConfiguration myNewDataRegion = new DataRegionConfiguration(); + cfg.setDataStorageConfiguration(storageCfg); + //end::warm-all-regions[] + } -myNewDataRegion.setName("NewDataRegion"); + public void warmSpecificRegion() { + //tag::warm-specific-region[] + IgniteConfiguration cfg = new IgniteConfiguration(); -//You can tweak the initial size as well as other settings -myNewDataRegion.setInitialSize(100 * 1024 * 1024); + DataStorageConfiguration storageCfg = new DataStorageConfiguration(); -//Performing data loading from disk in DRAM on restarts. -myNewDataRegion.setWarmUpConfiguration(new LoadAllWarmUpConfiguration()); + //Setting another warm-up strategy for a custom data region + DataRegionConfiguration myNewDataRegion = new DataRegionConfiguration(); -//Enabling Ignite persistence. Ignite reads data from disk when queried for tables/caches from this region. -myNewDataRegion.setPersistenceEnabled(true); + myNewDataRegion.setName("NewDataRegion"); -//Applying the configuration. -storageCfg.setDataRegionConfigurations(myNewDataRegion); + //You can tweak the initial size as well as other settings + myNewDataRegion.setInitialSize(100 * 1024 * 1024); -cfg.setDataStorageConfiguration(storageCfg); -//end::warm-specific-region[] -//tag::disable-all-regions[] -IgniteConfiguration cfg = new IgniteConfiguration(); + //Performing data loading from disk in DRAM on restarts. + myNewDataRegion.setWarmUpConfiguration(new LoadAllWarmUpConfiguration()); -DataStorageConfiguration storageCfg = new DataStorageConfiguration(); + //Enabling Ignite persistence. Ignite reads data from disk when queried for tables/caches from this region. + myNewDataRegion.setPersistenceEnabled(true); -storageCfg.setDefaultWarmUpConfiguration(new NoOpWarmUpConfiguration()); + //Applying the configuration. + storageCfg.setDataRegionConfigurations(myNewDataRegion); -cfg.setDataStorageConfiguration(storageCfg); -//end::disable-all-regions[] -//tag::disable-specific-region[] -IgniteConfiguration cfg = new IgniteConfiguration(); + cfg.setDataStorageConfiguration(storageCfg); + //end::warm-specific-region[] + } -DataStorageConfiguration storageCfg = new DataStorageConfiguration(); + public void disableAllRegions() { + //tag::disable-all-regions[] + IgniteConfiguration cfg = new IgniteConfiguration(); -//Setting another warm-up strategy for a custom data region -DataRegionConfiguration myNewDataRegion = new DataRegionConfiguration(); + DataStorageConfiguration storageCfg = new DataStorageConfiguration(); -myNewDataRegion.setName("NewDataRegion"); + storageCfg.setDefaultWarmUpConfiguration(new NoOpWarmUpConfiguration()); -//You can tweak the initial size as well as other settings -myNewDataRegion.setInitialSize(100 * 1024 * 1024); + cfg.setDataStorageConfiguration(storageCfg); + //end::disable-all-regions[] + } -//Skip data loading from disk in DRAM on restarts. -myNewDataRegion.setWarmUpConfiguration(new NoOpWarmUpConfiguration()); + public void disableSpecificRegion() { + //tag::disable-specific-region[] + IgniteConfiguration cfg = new IgniteConfiguration(); -//Enabling Ignite persistence. Ignite reads data from disk when queried for tables/caches from this region. -myNewDataRegion.setPersistenceEnabled(true); + DataStorageConfiguration storageCfg = new DataStorageConfiguration(); -//Applying the configuration. -storageCfg.setDataRegionConfigurations(myNewDataRegion); + //Setting another warm-up strategy for a custom data region + DataRegionConfiguration myNewDataRegion = new DataRegionConfiguration(); -cfg.setDataStorageConfiguration(storageCfg); -//end::disable-specific-region[] \ No newline at end of file + myNewDataRegion.setName("NewDataRegion"); + + //You can tweak the initial size as well as other settings + myNewDataRegion.setInitialSize(100 * 1024 * 1024); + + //Skip data loading from disk in DRAM on restarts. + myNewDataRegion.setWarmUpConfiguration(new NoOpWarmUpConfiguration()); + + //Enabling Ignite persistence. Ignite reads data from disk when queried for tables/caches from this region. + myNewDataRegion.setPersistenceEnabled(true); + + //Applying the configuration. + storageCfg.setDataRegionConfigurations(myNewDataRegion); + + cfg.setDataStorageConfiguration(storageCfg); + //end::disable-specific-region[] + } +} diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/WorkingWithBinaryObjects.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/WorkingWithBinaryObjects.java index 0c7fc69d3d1c9..63a4f91449570 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/WorkingWithBinaryObjects.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/WorkingWithBinaryObjects.java @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import javax.cache.Cache; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteBinary; import org.apache.ignite.IgniteCache; @@ -34,8 +35,12 @@ import org.apache.ignite.binary.BinaryTypeConfiguration; import org.apache.ignite.binary.BinaryWriter; import org.apache.ignite.cache.CacheEntryProcessor; +import org.apache.ignite.cache.CacheInterceptor; import org.apache.ignite.configuration.BinaryConfiguration; +import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.lang.IgniteBiTuple; +import org.jetbrains.annotations.Nullable; public class WorkingWithBinaryObjects { @@ -145,38 +150,56 @@ public static void configuringBinaryObjects() { //tag::keepBinaryWithCacheInterceptor[] public static void cacheWithInterceptorExample() { try (Ignite ignite = Ignition.start()) { - CacheConfiguration specConfig = new CacheConfiguration("personSpecCache"); - ccfg.setInterceptor(new CustomInterceptor(false)); - IgniteCache cache = ignite.createCache(ccfg); + CacheConfiguration specConfig = new CacheConfiguration<>("personSpecCache"); + specConfig.setInterceptor(new CustomInterceptor<>(false)); + IgniteCache cache = ignite.createCache(specConfig); cache.put(1, new Person(1, "FirstPerson")); - CacheConfiguration boConfig = new CacheConfiguration("boSpecCache"); - ccfg.setInterceptor(new CustomInterceptor(true)); - IgniteCache cache = ignite.createCache(ccfg); - cache = cache.withKeepBinary(); - cache.put(1, new Person(1, "FirstPerson")); + CacheConfiguration boConfig = new CacheConfiguration<>("boSpecCache"); + boConfig.setInterceptor(new CustomInterceptor<>(true)); + IgniteCache binaryCache = ignite.createCache(boConfig).withKeepBinary(); + binaryCache.put(1, ignite.binary().toBinary(new Person(1, "FirstPerson"))); } } - private static class CustomInterceptor implements CacheInterceptor { + private static class CustomInterceptor implements CacheInterceptor { boolean keepBinary; CustomInterceptor(boolean keepBinary) { this.keepBinary = keepBinary; } - @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) { + /** */ + @Nullable @Override public V onGet(K key, @Nullable V val) { + return val; + } + + /** */ + @Nullable @Override public V onBeforePut(Cache.Entry entry, V newVal) { assert keepBinary == newVal instanceof BinaryObject; // do smth. + return newVal; } - @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) { - Object val = entry.getValue(); + /** */ + @Override public void onAfterPut(Cache.Entry entry) { + // No-op. + } + + /** */ + @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) { + V val = entry.getValue(); if (val != null) { assert keepBinary == entry.getValue() instanceof BinaryObject; } // do smth. + return new IgniteBiTuple<>(false, val); + } + + /** */ + @Override public void onAfterRemove(Cache.Entry entry) { + // No-op. } } //end::keepBinaryWithCacheInterceptor[] diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/k8s/K8s.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/k8s/K8s.java index 856ac0ec0486e..121ff30265705 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/k8s/K8s.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/k8s/K8s.java @@ -19,7 +19,9 @@ import org.apache.ignite.Ignition; import org.apache.ignite.client.ClientCache; import org.apache.ignite.client.IgniteClient; +import org.apache.ignite.client.ThinClientKubernetesAddressFinder; import org.apache.ignite.configuration.ClientConfiguration; +import org.apache.ignite.kubernetes.configuration.KubernetesConnectionConfiguration; public class K8s { @@ -47,7 +49,7 @@ public static void connectThinClientWithConfiguration() throws Exception { ClientConfiguration ccfg = new ClientConfiguration(); ccfg.setAddressesFinder(new ThinClientKubernetesAddressFinder(kcfg)); - IgniteClient client = Ignition.startClient(cfg); + IgniteClient client = Ignition.startClient(ccfg); ClientCache cache = client.getOrCreateCache("test_cache"); diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoService.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoService.java index 70a7227dc8b36..114680651ad81 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoService.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoService.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.ignite.examples; +package org.apache.ignite.snippets.services; import org.apache.ignite.services.Service; diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoServiceAccessInterceptor.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoServiceAccessInterceptor.java index 9137c52214db7..1bbff74228461 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoServiceAccessInterceptor.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoServiceAccessInterceptor.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.ignite.examples; +package org.apache.ignite.snippets.services; import java.util.concurrent.Callable; import org.apache.ignite.services.ServiceCallContext; diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoServiceImpl.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoServiceImpl.java index cfa934800e41d..a39cd9cc6f736 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoServiceImpl.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/EchoServiceImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.ignite.examples; +package org.apache.ignite.snippets.services; import org.apache.ignite.resources.ServiceContextResource; import org.apache.ignite.services.ServiceCallContext; diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/ServiceExample.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/ServiceExample.java index cd9218bcf789a..c51b116e07e9e 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/ServiceExample.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/services/ServiceExample.java @@ -23,7 +23,8 @@ import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.services.ServiceConfiguration; -import org.junit.Test; +import org.apache.ignite.services.ServiceCallContext; +import org.junit.jupiter.api.Test; public class ServiceExample { diff --git a/docs/_docs/configuring-caches/configuration-overview.adoc b/docs/_docs/configuring-caches/configuration-overview.adoc index 00541fd95a473..52521a5266b35 100644 --- a/docs/_docs/configuring-caches/configuration-overview.adoc +++ b/docs/_docs/configuring-caches/configuration-overview.adoc @@ -79,7 +79,10 @@ a| This parameter controls the way the rebalancing process is performed. Possibl | `IGNORE` |`readFromBackup` -| [[readfrombackup]] Read requested cache entry from the backup partition if it is available on the local node instead of making a request to the primary partition (which can be located on the remote nodes). +| [[readfrombackup]] Read requested cache entry from the backup partition if it is available on the local node +instead of making a request to the primary partition (which can be located on the remote nodes). +In link:clustering/multi-data-center[multi data center deployments], this setting allows Ignite to read from a backup +located in the same data center when such a backup is available. | `true` |`queryPrallelism` | The number of threads in a single node to process a SQL query executed on the cache. Refer to the link:SQL/sql-tuning#query-parallelism[Query Parallelism] section in the Performance guide for more information. diff --git a/docs/_docs/configuring-caches/configuring-backups.adoc b/docs/_docs/configuring-caches/configuring-backups.adoc index 30535eba25596..3d359fe2309d3 100644 --- a/docs/_docs/configuring-caches/configuring-backups.adoc +++ b/docs/_docs/configuring-caches/configuring-backups.adoc @@ -89,4 +89,34 @@ The write synchronization mode can be set to the following values: //NOTE: Regardless of write synchronization mode, cache data will always remain fully consistent across all participating nodes when using transactions. +== Affinity Backup Filters +`RendezvousAffinityFunction` can use an affinity backup filter to control where backup copies are placed. +Backup filters are useful when cache copies must follow hardware, availability zone, rack, cell, or data center boundaries. + +Ignite provides the following built-in filters: + +[cols="1,3",opts="header"] +|=== +| Filter | Description +| `ClusterNodeAttributeAffinityBackupFilter` +| Places backup copies on nodes that have different values of the configured node attributes. +Use it to spread partition copies across availability zones, racks, or other failure domains. + +| `ClusterNodeAttributeColocatedBackupFilter` +| Places backup copies on nodes that have the same value of the configured node attribute as the primary node. +Use it to keep all copies of a partition inside the same cell or another co-location group. +For example, if nodes are grouped by a `CELL` attribute, the primary and backups for one partition are placed +on nodes from the same cell, while other partitions can be assigned to other cells. + +| `MdcAffinityBackupFilter` +| Places partition copies evenly across data centers. +Use it in link:clustering/multi-data-center[multi data center deployments]. +|=== + +[NOTE] +==== +`ClusterNodeAttributeColocatedBackupFilter` intentionally co-locates partition copies in the same attribute group. +It is useful for cell-based layouts where the goal is to limit the failure impact to a cell. +It should not be used when the goal is to spread copies across data centers or availability zones. +==== diff --git a/docs/_docs/extensions-and-integrations/spring/spring-tx.adoc b/docs/_docs/extensions-and-integrations/spring/spring-tx.adoc index 442b03d834fbb..d6e6d0edbfc2f 100644 --- a/docs/_docs/extensions-and-integrations/spring/spring-tx.adoc +++ b/docs/_docs/extensions-and-integrations/spring/spring-tx.adoc @@ -155,6 +155,13 @@ of the Apache Ignite and Spring. | 1.0.0 | All versions since 2.11.0 | All versions since 4.3.0 |=== +[NOTE] +==== +Starting with Apache Ignite 2.19, Spring integration is based on Spring Framework 6 and Jakarta EE APIs. +If your application uses `ignite-jta` transaction manager lookup classes, compile custom lookup code against +`jakarta.transaction.TransactionManager` instead of the legacy `javax.transaction.TransactionManager`. +==== + == Apache Ignite Node Transaction Manager Configuration This chapter shows how to set up `SpringTransactionManager` that relies on Apache Ignite node to connect to the cluster and to manage transactions. The configuration consists of two steps - diff --git a/docs/_docs/memory-configuration/data-regions.adoc b/docs/_docs/memory-configuration/data-regions.adoc index 9f958c77278ec..27f089dad0bf1 100644 --- a/docs/_docs/memory-configuration/data-regions.adoc +++ b/docs/_docs/memory-configuration/data-regions.adoc @@ -88,7 +88,7 @@ Ignite does not require you to warm memory up from disk on restarts. As soon as Presently, the Ignite warm-up strategy implies loading data into all or specific data regions of Ignite, starting with indexes, until it runs out of free space. It can be configured both for all regions (by default) or for each region separately. -To warm up all data regions, pass the configuration parameter `LoadAllWarmUpStrategy` to the `DataStorageConfiguration#setDefaultWarmUpConfiguration` as follows: +To warm up all data regions, pass the configuration parameter `LoadAllWarmUpConfiguration` to the `DataStorageConfiguration#setDefaultWarmUpConfiguration` as follows: :xmlFile: code-snippets/xml/warm-up-strategy.xml :javaFile: {javaCodeDir}/WarmUpStrategy.java @@ -111,7 +111,7 @@ tab:C++[unsupported] -- -To warm up a specific data region, pass the configuration parameter `LoadAllWarmUpStrategy` to the `DataStorageConfiguration#setWarmUpConfiguration` as follows: +To warm up a specific data region, pass the configuration parameter `LoadAllWarmUpConfiguration` to the `DataRegionConfiguration#setWarmUpConfiguration` as follows: [tabs] @@ -153,7 +153,7 @@ tab:C++[unsupported] -- -To stop the warm-up for a specific data region, pass the configuration parameter `NoOpWarmUpStrategy` to the `DataStorageConfiguration#setWarmUpConfiguration` as follows: +To stop the warm-up for a specific data region, pass the configuration parameter `NoOpWarmUpConfiguration` to the `DataRegionConfiguration#setWarmUpConfiguration` as follows: [tabs] -- diff --git a/docs/_docs/memory-configuration/eviction-policies.adoc b/docs/_docs/memory-configuration/eviction-policies.adoc index 9aee23c8b9233..781b05598cbac 100644 --- a/docs/_docs/memory-configuration/eviction-policies.adoc +++ b/docs/_docs/memory-configuration/eviction-policies.adoc @@ -48,6 +48,24 @@ If you don't use data regions, you have to explicitly add default data region pa By default, eviction starts when the overall RAM consumption by a region gets to 90%. Use the `DataRegionConfiguration.setEvictionThreshold(...)` parameter if you need to initiate eviction earlier or later. +=== Monitoring Page Eviction + +When page eviction starts due to a data region being under memory pressure, Ignite sets the `EvictionsStarted` metric to `true` for that data region. +This metric is relevant for in-memory data regions, where page eviction can remove data from memory. +It is available in the `io.dataregion.{data_region_name}` registry. +After `EvictionsStarted` becomes `true`, it remains `true` until the node is restarted. +Use it together with `EvictionRate` to monitor whether eviction has started and how actively pages are being evicted. + +Ignite also logs a warning when page-based eviction starts: + +[source,text] +---- +Page-based evictions started. Consider increasing 'maxSize' on Data Region configuration: +---- + +The warning is logged once per data region. +For monitoring, prefer the `EvictionsStarted` metric because monitoring tools can use it directly without relying on log parsing. + Ignite supports two page selection algorithms: * Random-LRU diff --git a/docs/_docs/monitoring-metrics/new-metrics.adoc b/docs/_docs/monitoring-metrics/new-metrics.adoc index 0850d9ae33116..30c78bd62f5b5 100644 --- a/docs/_docs/monitoring-metrics/new-metrics.adoc +++ b/docs/_docs/monitoring-metrics/new-metrics.adoc @@ -85,6 +85,8 @@ Register name: `cache.{cache_name}.{near}` |GetTimeTotal | long | The total time of cache gets for which this node is the initiator, in nanoseconds. |HeapEntriesCount|long|Onheap entries count. |IndexRebuildKeysProcessed|long | The number of keys with rebuilt indexes. +|IsCacheAffinityConfigurationMdcSafe|boolean | True if cache affinity guarantees having a copy of each partition in each data center. +|IsCachePartitionDistributionSafe|boolean | True if current cache partition distribution maintains the guarantee of one partition copy in each data center. |IsIndexRebuildInProgress|boolean | True if index build or rebuild is in progress. |OffHeapBackupEntriesCount|long|Offheap backup entries count. |OffHeapEntriesCount|long|Offheap entries count. @@ -368,6 +370,7 @@ Register name: `io.discovery` [cols="2,1,3",opts="header"] |=== |Name| Type| Description +|ClientRouterNodeId| String| Client router node ID (metric is exported only from client nodes). |CoordinatorSince| long| Timestamp since which the local node became the coordinator (metric is exported only from server nodes). |Coordinator| UUID| Coordinator ID (metric is exported only from server nodes). |CurrentTopologyVersion| long| Current topology version. diff --git a/docs/_docs/monitoring-metrics/system-views.adoc b/docs/_docs/monitoring-metrics/system-views.adoc index d7426347a0f6b..b6c684e513b03 100644 --- a/docs/_docs/monitoring-metrics/system-views.adoc +++ b/docs/_docs/monitoring-metrics/system-views.adoc @@ -314,6 +314,7 @@ The NODES view contains information about the cluster nodes. |IS_CLIENT |BOOLEAN |Indicates whether the node is a client. |NODE_ID |UUID |Node ID. |NODE_ORDER |INT |Node order within the topology. +|DATA_CENTER_ID |VARCHAR |Node data center ID. |VERSION |VARCHAR |Node version. |=== diff --git a/docs/_docs/setup.adoc b/docs/_docs/setup.adoc index e3178beb77816..8cdb8bcc9e012 100644 --- a/docs/_docs/setup.adoc +++ b/docs/_docs/setup.adoc @@ -208,7 +208,7 @@ The following modules are available: |ignite-jcl |Support for the Jakarta Common Logging (JCL) framework. -|ignite-jta |Integration of Ignite transactions with JTA. +|ignite-jta |Integration of Ignite transactions with JTA. Starting with Apache Ignite 2.19, custom JTA integration code must use Jakarta Transaction API classes, such as `jakarta.transaction.TransactionManager`. |ignite-kafka | Ignite Kafka Streamer provides capability to stream data from Kafka to Ignite caches. diff --git a/docs/_docs/thin-clients/java-thin-client.adoc b/docs/_docs/thin-clients/java-thin-client.adoc index 33387aaaf6b5d..20783b5535aec 100644 --- a/docs/_docs/thin-clients/java-thin-client.adoc +++ b/docs/_docs/thin-clients/java-thin-client.adoc @@ -119,6 +119,13 @@ The following code sample illustrates how to use the partition awareness feature include::{sourceCodeFile}[tag=partition-awareness,indent=0] ---- +In link:clustering/multi-data-center[multi data center deployments], the Java thin client can prefer server nodes +located in the same data center as the client. +Set the `IGNITE_DATA_CENTER_ID` system property or set the same key in `ClientConfiguration#setUserAttributes(...)` +to enable data-center-aware routing. The system property takes precedence over the client user attribute. +For partition-aware reads from local backup nodes, the cache must have `readFromBackup=true` and a write +synchronization mode other than `PRIMARY_SYNC`. + The code sample below shows how to use a custom cache key to partition mapping function to enable affinity awareness on a thin client side if the cache already exists in a cluster or/and was created with custom AffinityFunction or AffinityKeyMapper. diff --git a/examples/src/main/java/org/apache/ignite/examples/misc/springbean/SpringBeanExample.java b/examples/src/main/java/org/apache/ignite/examples/misc/springbean/SpringBeanExample.java index 66b22fa8681a9..d514db2512c0b 100644 --- a/examples/src/main/java/org/apache/ignite/examples/misc/springbean/SpringBeanExample.java +++ b/examples/src/main/java/org/apache/ignite/examples/misc/springbean/SpringBeanExample.java @@ -53,11 +53,9 @@ public static void main(String[] args) throws Exception { System.out.println(); System.out.println(">>> Spring bean example started."); - // Initialize Spring factory. - ClassPathXmlApplicationContext ctx = - new ClassPathXmlApplicationContext("org/apache/ignite/examples/misc/springbean/spring-bean.xml"); - - try { + // Initialize Spring factory (closed automatically, which stops the local cluster node). + try (ClassPathXmlApplicationContext ctx = + new ClassPathXmlApplicationContext("org/apache/ignite/examples/misc/springbean/spring-bean.xml")) { // Get ignite from Spring (note that local cluster node is already started). Ignite ignite = (Ignite)ctx.getBean("mySpringBean"); @@ -81,9 +79,5 @@ public static void main(String[] args) throws Exception { System.out.println(">>> Check all nodes for output (this node is also part of the cluster)."); System.out.println(">>>"); } - finally { - // Stop local cluster node. - ctx.destroy(); - } } } diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/notify/JmhWaitStategyBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/notify/JmhWaitStategyBenchmark.java index 1c6a641b8e337..af8f2a60e300e 100644 --- a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/notify/JmhWaitStategyBenchmark.java +++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/notify/JmhWaitStategyBenchmark.java @@ -106,6 +106,7 @@ private static Factory getExpiryPolicyFactoryWithDecreasingRate(fi /** Decreasing expiry policy. */ private static final ExpiryPolicy DECREASING_EXPIRY_POLICY = new ExpiryPolicy() { + /** */ AtomicLong duration = new AtomicLong(1_000_000_000); @Override public Duration getExpiryForCreation() { @@ -123,6 +124,7 @@ private static Factory getExpiryPolicyFactoryWithDecreasingRate(fi /** Increasing expiry policy. */ private static final ExpiryPolicy INCREASING_EXPIRY_POLICY = new ExpiryPolicy() { + /** */ AtomicLong duration = new AtomicLong(1_000_000); @Override public Duration getExpiryForCreation() { diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java index db0a86e86fa5a..7411659d663eb 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryMarshaller.java @@ -83,14 +83,7 @@ public void setBinaryContext(BinaryContext ctx) { /** {@inheritDoc} */ @Override protected void marshal0(@Nullable Object obj, OutputStream out) throws IgniteCheckedException { - byte[] arr = marshal(obj); - - try { - out.write(arr); - } - catch (Exception e) { - throw new BinaryObjectException("Failed to marshal the object: " + obj, e); - } + impl.marshal(obj, out, false); } /** {@inheritDoc} */ diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index cbb9394cb2b57..fcbd74fe0c550 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -27,6 +27,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Array; +import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -62,15 +63,23 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCommonsSystemProperties; import org.apache.ignite.IgniteException; +import org.apache.ignite.IgniteLogger; import org.apache.ignite.binary.BinaryCollectionFactory; +import org.apache.ignite.binary.BinaryIdMapper; import org.apache.ignite.binary.BinaryInvalidTypeException; import org.apache.ignite.binary.BinaryMapFactory; +import org.apache.ignite.binary.BinaryNameMapper; import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.binary.BinarySerializer; import org.apache.ignite.binary.BinaryType; +import org.apache.ignite.binary.BinaryTypeConfiguration; import org.apache.ignite.binary.Binarylizable; +import org.apache.ignite.cache.affinity.AffinityKeyMapped; +import org.apache.ignite.configuration.BinaryConfiguration; import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.MutableSingletonList; import org.apache.ignite.internal.util.typedef.F; @@ -78,6 +87,7 @@ import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.lang.IgniteUuid; +import org.apache.ignite.logger.NullLogger; import org.apache.ignite.marshaller.Marshallers; import org.apache.ignite.platform.PlatformType; import org.jetbrains.annotations.Nullable; @@ -167,6 +177,10 @@ TreeSet.class, new BinaryTreeSetWriteReplacer() public static boolean FIELDS_SORTED_ORDER = IgniteCommonsSystemProperties.getBoolean(IgniteCommonsSystemProperties.IGNITE_BINARY_SORT_OBJECT_FIELDS); + /** For tests. */ + @SuppressWarnings("PublicField") + public static boolean useTestBinaryCtx; + /** Field type names. */ private static final String[] FIELD_TYPE_NAMES; @@ -3091,4 +3105,193 @@ public EnumType(int typeId, @Nullable String clsName) { this.clsName = clsName; } } + + /** + * @param cls Class to get affinity field for. + * @return Affinity field name or {@code null} if field name was not found. + */ + public static String affinityFieldName(Class cls) { + for (; cls != Object.class && cls != null; cls = cls.getSuperclass()) { + for (Field f : cls.getDeclaredFields()) { + if (f.getAnnotation(AffinityKeyMapped.class) != null) + return f.getName(); + } + } + + return null; + } + + /** + * Creates a binary context with default (empty) configuration for the given marshaller. + * + * @param marsh Binary marshaller (may be {@code null}). + * @return Binary context instance. + */ + public static BinaryContext binaryContext(BinaryMarshaller marsh) { + return binaryContext( + cachingMetadataHandler(), + marsh, + null, + null, + new BinaryConfiguration(), + Collections.emptyMap(), + BinaryUtils::affinityFieldName, + NullLogger.INSTANCE + ); + } + + /** + * Creates a binary context from explicit values. + * + * @param metaHnd Binary metadata handler. + * @param marsh Binary marshaller. + * @param igniteInstanceName Ignite instance name. + * @param classLoader Class loader. + * @param binCfg Binary configuration. + * @param affFlds Affinity fields by type name. + * @param affFldNameProvider Affinity field name provider. + * @param log Logger. + * @return Binary context instance. + */ + public static BinaryContext binaryContext( + BinaryMetadataHandler metaHnd, + BinaryMarshaller marsh, + @Nullable String igniteInstanceName, + @Nullable ClassLoader classLoader, + BinaryConfiguration binCfg, + Map affFlds, + Function, String> affFldNameProvider, + IgniteLogger log + ) { + return useTestBinaryCtx + ? new TestBinaryContext( + metaHnd, + marsh, + igniteInstanceName, + classLoader, + binCfg.getSerializer(), + binCfg.getIdMapper(), + binCfg.getNameMapper(), + binCfg.getTypeConfigurations(), + affFlds, + binCfg.isCompactFooter(), + affFldNameProvider, + log + ) + : new BinaryContext( + metaHnd, + marsh, + igniteInstanceName, + classLoader, + binCfg.getSerializer(), + binCfg.getIdMapper(), + binCfg.getNameMapper(), + binCfg.getTypeConfigurations(), + affFlds, + binCfg.isCompactFooter(), + affFldNameProvider, + log + ); + } + + /** */ + @SuppressWarnings("PublicInnerClass") + public static class TestBinaryContext extends BinaryContext { + /** */ + private List listeners; + + /** */ + public TestBinaryContext( + BinaryMetadataHandler metaHnd, + @Nullable BinaryMarshaller marsh, + @Nullable String igniteInstanceName, + @Nullable ClassLoader clsLdr, + @Nullable BinarySerializer dfltSerializer, + @Nullable BinaryIdMapper idMapper, + @Nullable BinaryNameMapper nameMapper, + @Nullable Collection typeCfgs, + Map affFlds, + boolean compactFooter, + Function, String> affFldNameProvider, + IgniteLogger log + ) { + super( + metaHnd, + marsh, + igniteInstanceName, + clsLdr, + dfltSerializer, + idMapper, + nameMapper, + typeCfgs, + affFlds, + compactFooter, + affFldNameProvider, + log + ); + } + + + /** {@inheritDoc} */ + @Nullable @Override public BinaryType metadata(int typeId) throws BinaryObjectException { + BinaryType metadata = super.metadata(typeId); + + if (listeners != null) { + for (TestBinaryContextListener listener : listeners) + listener.onAfterMetadataRequest(typeId, metadata); + } + + return metadata; + } + + /** {@inheritDoc} */ + @Override public void updateMetadata(int typeId, BinaryMetadata meta, boolean failIfUnregistered) throws BinaryObjectException { + if (listeners != null) { + for (TestBinaryContextListener listener : listeners) + listener.onBeforeMetadataUpdate(typeId, meta); + } + + super.updateMetadata(typeId, meta, failIfUnregistered); + } + + /** */ + public interface TestBinaryContextListener { + /** + * @param typeId Type id. + * @param type Type. + */ + void onAfterMetadataRequest(int typeId, BinaryType type); + + /** + * @param typeId Type id. + * @param metadata Metadata. + */ + void onBeforeMetadataUpdate(int typeId, BinaryMetadata metadata); + } + + /** @param lsnr Listener. */ + public void addListener(TestBinaryContextListener lsnr) { + if (listeners == null) + listeners = new ArrayList<>(); + + if (!listeners.contains(lsnr)) + listeners.add(lsnr); + } + + /** */ + public void clearAllListener() { + if (listeners != null) + listeners.clear(); + } + } + + /** + * Represents the given cache version as an {@link IgniteUuid}. + * + * @param ver Cache version. + * @return Version represented as {@code IgniteUuid}. + */ + public static IgniteUuid asIgniteUuid(GridCacheVersion ver) { + return new IgniteUuid(new UUID(ver.topologyVersion(), ver.nodeOrderAndDrIdRaw()), ver.order()); + } } diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index 651781e140322..75e5252f13065 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal.binary; +import java.io.IOException; +import java.io.OutputStream; import java.lang.reflect.Array; import java.util.Collection; import java.util.Map; @@ -257,6 +259,35 @@ public byte[] marshal(@Nullable Object obj, boolean failIfUnregistered) throws B } } + /** + * Marshals the object directly into the given stream, without allocating a trimmed copy of the whole result. + * + * @param obj Object to marshal. + * @param out Output stream. + * @param failIfUnregistered Throw exception if class isn't registered. + * @throws BinaryObjectException In case of error. + */ + public void marshal(@Nullable Object obj, OutputStream out, boolean failIfUnregistered) throws BinaryObjectException { + try { + if (obj == null) { + out.write(NULL); + + return; + } + + try (BinaryWriterEx writer = BinaryUtils.writer(ctx, failIfUnregistered, UNREGISTERED_TYPE_ID)) { + writer.marshal(obj); + + BinaryOutputStream s = writer.out(); + + out.write(s.array(), 0, s.position()); + } + } + catch (IOException e) { + throw new BinaryObjectException("Failed to marshal the object: " + obj, e); + } + } + /** * @param bytes Bytes array. * @return Binary object. diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java rename to modules/binary/api/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/IgniteObjectInputFilter.java b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/IgniteObjectInputFilter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/marshaller/IgniteObjectInputFilter.java rename to modules/binary/api/src/main/java/org/apache/ignite/marshaller/IgniteObjectInputFilter.java diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerUtils.java similarity index 86% rename from modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerUtils.java rename to modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerUtils.java index 4d474aa826a46..9248181aa0711 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/MarshallerUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/marshaller/MarshallerUtils.java @@ -26,19 +26,16 @@ import java.io.InputStreamReader; import java.io.ObjectInputFilter; import java.net.URL; -import java.util.Collection; import java.util.Enumeration; import java.util.Objects; import java.util.function.Consumer; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteCommonsSystemProperties; import org.apache.ignite.IgniteException; -import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.internal.ClassSet; -import org.apache.ignite.plugin.PluginProvider; -import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHALLER_BLACKLIST; +import static org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION; +import static org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_MARSHALLER_BLACKLIST; /** * Utility marshaller methods. @@ -81,7 +78,7 @@ public static IgniteMarshallerClassFilter classNameFilter(ClassLoader clsLdr) th * @throws IgniteCheckedException if autoconfiguration failed. */ public static void autoconfigureObjectInputFilter(IgniteMarshallerClassFilter clsFilter) throws IgniteCheckedException { - if (!IgniteSystemProperties.getBoolean(IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION, true)) + if (!IgniteCommonsSystemProperties.getBoolean(IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION, true)) return; synchronized (MUX) { @@ -116,7 +113,7 @@ else if (objFilter instanceof IgniteObjectInputFilter) { private static ClassSet classWhiteList(ClassLoader clsLdr) throws IgniteCheckedException { ClassSet clsSet = null; - String fileName = IgniteSystemProperties.getString(IgniteSystemProperties.IGNITE_MARSHALLER_WHITELIST); + String fileName = IgniteCommonsSystemProperties.getString(IgniteCommonsSystemProperties.IGNITE_MARSHALLER_WHITELIST); if (fileName != null) { clsSet = new ClassSet(); @@ -139,7 +136,7 @@ private static ClassSet classBlackList(ClassLoader clsLdr) throws IgniteCheckedE addClassNames(DEFAULT_BLACKLIST_CLS_NAMES_FILE, clsSet, clsLdr); - String blackListFileName = IgniteSystemProperties.getString(IGNITE_MARSHALLER_BLACKLIST); + String blackListFileName = IgniteCommonsSystemProperties.getString(IGNITE_MARSHALLER_BLACKLIST); if (blackListFileName != null) addClassNames(blackListFileName, clsSet, clsLdr); @@ -197,11 +194,9 @@ private static void addClassNames( * Find all system class names (for JDK or Ignite classes) and process them with a given consumer. * * @param ldr Class loader. - * @param plugins Plugins. * @param proc Class processor (class name consumer). */ - public static void processSystemClasses(ClassLoader ldr, @Nullable Collection plugins, - Consumer proc) throws IOException { + public static void processSystemClasses(ClassLoader ldr, Consumer proc) throws IOException { Enumeration urls = ldr.getResources(CLS_NAMES_FILE); boolean foundClsNames = false; @@ -223,16 +218,6 @@ public static void processSystemClasses(ClassLoader ldr, @Nullable Collection proc) throws IOException { + public static void processResource(URL url, Consumer proc) throws IOException { try (BufferedReader rdr = new BufferedReader(new InputStreamReader(url.openStream()))) { String line; diff --git a/modules/bom/pom.xml b/modules/bom/pom.xml index e14c89f779b55..b365dac618718 100644 --- a/modules/bom/pom.xml +++ b/modules/bom/pom.xml @@ -186,6 +186,16 @@ ignite-thin-client-api ${revision} + + ${project.groupId} + ignite-thin-client-impl + ${revision} + + + ${project.groupId} + ignite-nio + ${revision} + ${project.groupId} ignite-codegen diff --git a/modules/calcite/pom.xml b/modules/calcite/pom.xml index 945451239f846..27c49c5b41557 100644 --- a/modules/calcite/pom.xml +++ b/modules/calcite/pom.xml @@ -35,8 +35,8 @@ - 1.26.0 - 1.40.0 + 1.28.0 + 1.42.0 1.0.1 2.8.2 3.1.12 @@ -69,6 +69,12 @@ org.apache.calcite calcite-core ${calcite.version} + + + org.apache.commons + commons-dbcp2 + + diff --git a/modules/calcite/src/main/codegen/config.fmpp b/modules/calcite/src/main/codegen/config.fmpp index 4a5d1c40b3a25..9e32885c54077 100644 --- a/modules/calcite/src/main/codegen/config.fmpp +++ b/modules/calcite/src/main/codegen/config.fmpp @@ -387,6 +387,7 @@ data: { "UESCAPE" "UNIQUE" "UNKNOWN" + "UNSIGNED" "UPPER" "UPSERT" "UUID" diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java index 3ff4bc544504c..1e93eecaf7c29 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java @@ -27,13 +27,16 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; +import com.google.common.collect.ImmutableList; import org.apache.calcite.rel.RelCollation; import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.core.Intersect; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.core.Minus; import org.apache.calcite.rel.core.Spool; +import org.apache.calcite.rel.core.Window; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rex.RexLiteral; @@ -48,6 +51,8 @@ import org.apache.ignite.internal.processors.query.calcite.exec.exp.RangeIterable; import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.AccumulatorWrapper; import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.AggregateType; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.window.WindowPartition; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.window.WindowPartitionFactory; import org.apache.ignite.internal.processors.query.calcite.exec.rel.AbstractSetOpNode; import org.apache.ignite.internal.processors.query.calcite.exec.rel.CollectNode; import org.apache.ignite.internal.processors.query.calcite.exec.rel.CorrelatedNestedLoopJoinNode; @@ -73,6 +78,7 @@ import org.apache.ignite.internal.processors.query.calcite.exec.rel.TableSpoolNode; import org.apache.ignite.internal.processors.query.calcite.exec.rel.UncollectNode; import org.apache.ignite.internal.processors.query.calcite.exec.rel.UnionAllNode; +import org.apache.ignite.internal.processors.query.calcite.exec.rel.WindowNode; import org.apache.ignite.internal.processors.query.calcite.metadata.AffinityService; import org.apache.ignite.internal.processors.query.calcite.metadata.ColocationGroup; import org.apache.ignite.internal.processors.query.calcite.prepare.bounds.SearchBounds; @@ -85,7 +91,6 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteIndexBound; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteIndexCount; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteIndexScan; -import org.apache.ignite.internal.processors.query.calcite.rel.IgniteJoinInfo; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteLimit; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteMergeJoin; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteNestedLoopJoin; @@ -104,6 +109,7 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUncollect; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUnionAll; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteValues; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteWindow; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedHashAggregate; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedSortAggregate; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteMapHashAggregate; @@ -282,8 +288,6 @@ public LogicalRelImplementor( RelDataType rightType = rel.getRight().getRowType(); JoinRelType joinType = rel.getJoinType(); - IgniteJoinInfo joinInfo = IgniteJoinInfo.of(rel); - RexNode nonEquiConditionExpression = RexUtil.composeConjunction(Commons.emptyCluster().getRexBuilder(), rel.analyzeCondition().nonEquiConditions, true); @@ -295,7 +299,7 @@ public LogicalRelImplementor( nonEquiCondition = expressionFactory.biPredicate(rel.getCondition(), rowType); } - Node node = HashJoinNode.create(ctx, outType, leftType, rightType, joinType, joinInfo, + Node node = HashJoinNode.create(ctx, outType, leftType, rightType, joinType, rel.analyzeCondition(), nonEquiCondition); node.register(Arrays.asList(visit(rel.getLeft()), visit(rel.getRight()))); @@ -339,14 +343,14 @@ public LogicalRelImplementor( List leftCollations = rel.leftCollation().getFieldCollations(); List rightCollations = rel.rightCollation().getFieldCollations(); - ImmutableBitSet allowNulls = rel.allowNulls(); - ImmutableBitSet.Builder collsAllowNullsBuilder = ImmutableBitSet.builder(); + ImmutableList nullExclusions = rel.analyzeCondition().nullExclusionFlags; + ImmutableBitSet.Builder nullCompAsEqual = ImmutableBitSet.builder(); int lastCollField = -1; for (int c = 0; c < Math.min(leftCollations.size(), rightCollations.size()); ++c) { RelFieldCollation leftColl = leftCollations.get(c); RelFieldCollation rightColl = rightCollations.get(c); - collsAllowNullsBuilder.set(c); + nullCompAsEqual.set(c); for (int p = 0; p < pairsCnt; ++p) { IntPair pair = joinPairs.get(p); @@ -354,8 +358,8 @@ public LogicalRelImplementor( if (pair.source == leftColl.getFieldIndex() && pair.target == rightColl.getFieldIndex()) { lastCollField = c; - if (!allowNulls.get(p)) { - collsAllowNullsBuilder.clear(c); + if (nullExclusions.get(p)) { + nullCompAsEqual.clear(c); break; } @@ -366,7 +370,7 @@ public LogicalRelImplementor( Comparator comp = expressionFactory.comparator( leftCollations.subList(0, lastCollField + 1), rightCollations.subList(0, lastCollField + 1), - collsAllowNullsBuilder.build() + nullCompAsEqual.build() ); Node node = MergeJoinNode.create(ctx, outType, leftType, rightType, joinType, comp, hasExchange(rel)); @@ -945,6 +949,32 @@ else if (rel instanceof Intersect) return node; } + /** {@inheritDoc} */ + @Override public Node visit(IgniteWindow rel) { + RelDataType outType = rel.getRowType(); + RelDataType inputType = rel.getInput().getRowType(); + Window.Group grp = rel.getGroup(); + + List grpKeys = grp.keys.toList(); + RelCollation collation = rel.collation(); + + assert collation.getFieldCollations().size() >= grpKeys.size(); + Comparator partCmp = expressionFactory.comparator(TraitUtils.createCollation(grpKeys)); + + List calls = grp.getAggregateCalls(rel); + Supplier> partFactory = new WindowPartitionFactory<>(ctx, grp, calls, inputType); + + RowFactory rowFactory = ctx.rowHandler().factory(ctx.getTypeFactory(), outType); + + WindowNode node = new WindowNode<>(ctx, outType, partCmp, partFactory, rowFactory); + + Node input = visit(rel.getInput()); + + node.register(input); + + return node; + } + /** {@inheritDoc} */ @Override public Node visit(IgniteUncollect rel) { UncollectNode node = new UncollectNode<>( diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/ConverterUtils.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/ConverterUtils.java index 2a8783d29f440..fbbdc18be3627 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/ConverterUtils.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/ConverterUtils.java @@ -419,6 +419,20 @@ else if (fromType == BigDecimal.class) { } else if (toType == UUID.class && fromType == String.class) return Expressions.call(UUID.class, "fromString", operand); + else if (fromType == Object.class && Number.class.isAssignableFrom((Class)toType)) { + Primitive primitiveFromToType = Primitive.ofBox(toType); + if (primitiveFromToType != null) { + Expression res = Expressions.convert_(operand, Number.class); + + res = Expressions.condition( + Expressions.equal(res, RexImpTable.NULL_EXPR), + RexImpTable.NULL_EXPR, + Expressions.unbox(res, primitiveFromToType)); + + res = Expressions.box(res); + return res; + } + } return Expressions.convert_(operand, toType); } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/IgniteExpressions.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/IgniteExpressions.java index 895c179ae388d..95549f570fa6d 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/IgniteExpressions.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/IgniteExpressions.java @@ -32,13 +32,13 @@ public class IgniteExpressions { /** Make binary expression with arithmetic operations override. */ public static Expression makeBinary(ExpressionType binaryType, Expression left, Expression right) { switch (binaryType) { - case Add: + case Add, AddChecked: return addExact(left, right); - case Subtract: + case Subtract, SubtractChecked: return subtractExact(left, right); - case Multiply: + case Multiply, MultiplyChecked: return multiplyExact(left, right); - case Divide: + case Divide, DivideChecked: return divideExact(left, right); default: return Expressions.makeBinary(binaryType, left, right); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/RexImpTable.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/RexImpTable.java index 0772d7287d424..e3e3ce5be27cd 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/RexImpTable.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/RexImpTable.java @@ -78,16 +78,21 @@ import static java.util.Objects.requireNonNull; import static org.apache.calcite.adapter.enumerable.EnumUtils.generateCollatorExpression; import static org.apache.calcite.linq4j.tree.ExpressionType.Add; +import static org.apache.calcite.linq4j.tree.ExpressionType.AddChecked; import static org.apache.calcite.linq4j.tree.ExpressionType.Divide; +import static org.apache.calcite.linq4j.tree.ExpressionType.DivideChecked; import static org.apache.calcite.linq4j.tree.ExpressionType.Equal; import static org.apache.calcite.linq4j.tree.ExpressionType.GreaterThan; import static org.apache.calcite.linq4j.tree.ExpressionType.GreaterThanOrEqual; import static org.apache.calcite.linq4j.tree.ExpressionType.LessThan; import static org.apache.calcite.linq4j.tree.ExpressionType.LessThanOrEqual; import static org.apache.calcite.linq4j.tree.ExpressionType.Multiply; +import static org.apache.calcite.linq4j.tree.ExpressionType.MultiplyChecked; import static org.apache.calcite.linq4j.tree.ExpressionType.Negate; +import static org.apache.calcite.linq4j.tree.ExpressionType.NegateChecked; import static org.apache.calcite.linq4j.tree.ExpressionType.NotEqual; import static org.apache.calcite.linq4j.tree.ExpressionType.Subtract; +import static org.apache.calcite.linq4j.tree.ExpressionType.SubtractChecked; import static org.apache.calcite.linq4j.tree.ExpressionType.UnaryPlus; import static org.apache.calcite.sql.fun.SqlLibraryOperators.ACOSH; import static org.apache.calcite.sql.fun.SqlLibraryOperators.ASINH; @@ -162,6 +167,7 @@ import static org.apache.calcite.sql.fun.SqlStdOperatorTable.CEIL; import static org.apache.calcite.sql.fun.SqlStdOperatorTable.CHAR_LENGTH; import static org.apache.calcite.sql.fun.SqlStdOperatorTable.CHECKED_DIVIDE; +import static org.apache.calcite.sql.fun.SqlStdOperatorTable.CHECKED_DIVIDE_INTEGER; import static org.apache.calcite.sql.fun.SqlStdOperatorTable.CHECKED_MINUS; import static org.apache.calcite.sql.fun.SqlStdOperatorTable.CHECKED_MULTIPLY; import static org.apache.calcite.sql.fun.SqlStdOperatorTable.CHECKED_PLUS; @@ -344,6 +350,13 @@ public class RexImpTable { defineUnary(UNARY_MINUS, Negate, NullPolicy.STRICT, BuiltInMethod.BIG_DECIMAL_NEGATE.getMethodName()); defineUnary(UNARY_PLUS, UnaryPlus, NullPolicy.STRICT, null); + // checked arithmetic + defineBinary(CHECKED_PLUS, AddChecked, NullPolicy.STRICT, "checkedPlus"); + defineBinary(CHECKED_MINUS, SubtractChecked, NullPolicy.STRICT, "checkedMinus"); + defineBinary(CHECKED_MULTIPLY, MultiplyChecked, NullPolicy.STRICT, "checkedMultiply"); + defineBinary(CHECKED_DIVIDE, DivideChecked, NullPolicy.STRICT, "checkedDivide"); + defineBinary(CHECKED_DIVIDE_INTEGER, DivideChecked, NullPolicy.STRICT, "checkedDivide"); + defineUnary(CHECKED_UNARY_MINUS, NegateChecked, NullPolicy.STRICT, "checkedUnaryMinus"); defineMethod(MOD, "mod", NullPolicy.STRICT); defineMethod(EXP, "exp", NullPolicy.STRICT); @@ -1227,7 +1240,7 @@ private static class BinaryImplementor extends AbstractRexCallImplementor { @Override Expression implementSafe( final RexToLixTranslator translator, final RexCall call, - final List argValueList) { + List argValueList) { // neither nullable: // return x OP y // x nullable @@ -1243,7 +1256,7 @@ private static class BinaryImplementor extends AbstractRexCallImplementor { // If one or both operands have ANY type, use the late-binding backup // method. if (anyAnyOperands(call)) - return callBackupMethodAnyType(translator, call, argValueList); + return callBackupMethodAnyType(argValueList); final Type type0 = argValueList.get(0).getType(); final Type type1 = argValueList.get(1).getType(); @@ -1272,10 +1285,6 @@ private static class BinaryImplementor extends AbstractRexCallImplementor { argValueList); } - // For checked arithmetic call the method. - if (CHECKED_OPERATORS.contains(op)) - return Expressions.call(SqlFunctions.class, backupMethodName, argValueList); - return IgniteExpressions.makeBinary(expressionType, argValueList.get(0), argValueList.get(1)); } @@ -1290,8 +1299,7 @@ private boolean anyAnyOperands(RexCall call) { } /** */ - private Expression callBackupMethodAnyType(RexToLixTranslator translator, - RexCall call, List expressions) { + private Expression callBackupMethodAnyType(List expressions) { final String backupMethodNameForAnyType = backupMethodName + METHOD_POSTFIX_FOR_ANY_TYPE; @@ -1343,6 +1351,8 @@ private static class UnaryImplementor extends AbstractRexCallImplementor { if (expressionType == ExpressionType.Negate && argVal.type == BigDecimal.class && null != backupMethodName) e = Expressions.call(argVal, backupMethodName); + else if (expressionType == NegateChecked && null != backupMethodName) + e = Expressions.call(SqlFunctions.class, backupMethodName, argValueList); else e = IgniteExpressions.makeUnary(expressionType, argVal); @@ -1565,9 +1575,12 @@ private static class CastImplementor extends AbstractRexCallImplementor { assert call.getOperands().size() == 1; final RelDataType srcType = call.getOperands().get(0).getType(); - // Short-circuit if no cast is required RexNode arg = call.getOperands().get(0); - if (call.getType().equals(srcType)) { + + // Short-circuit if no cast is required + if (call.getType().equals(srcType) + // However, do not elide casts to decimal types, they perform bounds checking + && srcType.getSqlTypeName() != SqlTypeName.DECIMAL) { // No cast required, omit cast return argValueList.get(0); } @@ -1588,10 +1601,10 @@ private static class CastImplementor extends AbstractRexCallImplementor { private RelDataType nullifyType(JavaTypeFactory typeFactory, final RelDataType type, final boolean nullable) { if (type instanceof RelDataTypeFactoryImpl.JavaType) { - final Primitive primitive = Primitive.ofBox( - ((RelDataTypeFactoryImpl.JavaType)type).getJavaClass()); - if (primitive != null) - return typeFactory.createJavaType(primitive.primitiveClass); + Class javaCls = ((RelDataTypeFactoryImpl.JavaType)type).getJavaClass(); + final Class primitive = Primitive.unbox(javaCls); + if (primitive != javaCls) + return typeFactory.createJavaType(primitive); } return typeFactory.createTypeWithNullability(type, nullable); } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/RexToLixTranslator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/RexToLixTranslator.java index 336edf395aa7c..f11b432d1f010 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/RexToLixTranslator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/RexToLixTranslator.java @@ -52,6 +52,7 @@ import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexLocalRef; import org.apache.calcite.rex.RexNode; +import org.apache.calcite.rex.RexNodeAndFieldIndex; import org.apache.calcite.rex.RexOver; import org.apache.calcite.rex.RexPatternFieldRef; import org.apache.calcite.rex.RexProgram; @@ -1343,6 +1344,12 @@ private Result toInnerStorageType(final Result result, final Type storageType) { return new Result(isNullVariable, valVariable); } + /** */ + @Override public Result visitNodeAndFieldIndex( + RexNodeAndFieldIndex nodeAndFieldIndex) { + throw new RuntimeException("cannot translate expression " + nodeAndFieldIndex); + } + /** */ Expression checkNull(Expression expr) { if (Primitive.flavor(expr.getType()) == Primitive.Flavor.PRIMITIVE) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorFactoryProvider.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorFactoryProvider.java new file mode 100644 index 0000000000000..c1bce8b31947f --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorFactoryProvider.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.agg; + +import java.util.function.Supplier; +import org.apache.calcite.plan.Context; +import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.tools.Frameworks; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.plugin.PluginProvider; +import org.jetbrains.annotations.Nullable; + +/** + * Factory that selects and creates an accumulator supplier for an aggregate call. Allows overriding standard aggregate + * functions. + * + *

It can be set via {@link PluginProvider} when creating a configuration using + * {@link PluginProvider#createComponent} via {@link Frameworks.ConfigBuilder#context(Context)}.

+ */ +@FunctionalInterface +public interface AccumulatorFactoryProvider { + /** @return Accumulator supplier, {@code null} if no accumulator is required for this aggregate call. */ + @Nullable Supplier> factory(AggregateCall call, ExecutionContext ctx); +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/Accumulators.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/Accumulators.java index 9c15e4a7a2375..085d212be25d2 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/Accumulators.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/Accumulators.java @@ -71,6 +71,15 @@ private static Supplier> accumulatorFunctionFactory( ) { RowHandler hnd = ctx.rowHandler(); + AccumulatorFactoryProvider prov = ctx.unwrap(AccumulatorFactoryProvider.class); + + if (prov != null) { + Supplier> fac = prov.factory(call, ctx); + + if (fac != null) + return fac; + } + switch (call.getAggregation().getName()) { case "COUNT": return () -> new LongCount<>(call, hnd); @@ -280,7 +289,7 @@ private static Supplier> maxFactory(AggregateCall call, R } /** */ - private abstract static class AbstractAccumulator implements Accumulator { + public abstract static class AbstractAccumulator implements Accumulator { /** */ private final RowHandler hnd; @@ -288,13 +297,13 @@ private abstract static class AbstractAccumulator implements Accumulator hnd) { + protected AbstractAccumulator(AggregateCall aggCall, RowHandler hnd) { this.aggCall = aggCall; this.hnd = hnd; } /** */ - T get(int idx, Row row) { + protected T get(int idx, Row row) { assert idx < arguments().size() : "idx=" + idx + "; arguments=" + arguments(); return (T)hnd.get(arguments().get(idx), row); @@ -311,7 +320,7 @@ protected List arguments() { } /** */ - int columnCount(Row row) { + protected int columnCount(Row row) { return hnd.columnCount(row); } } @@ -1344,8 +1353,9 @@ public ListAggAccumulator(AggregateCall aggCall, RowHandler hnd) { if (builder == null) builder = new StringBuilder(); - if (builder.length() != 0) + if (!builder.isEmpty()) builder.append(extractSeparator(row)); + builder.append(val); } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactory.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactory.java index 222dd9c3a18c9..1bc15d6a4965a 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactory.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactory.java @@ -17,129 +17,18 @@ package org.apache.ignite.internal.processors.query.calcite.exec.exp.agg; -import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.concurrent.ExecutionException; import java.util.function.Function; import java.util.function.Supplier; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.collect.ImmutableList; -import com.google.common.primitives.Primitives; -import org.apache.calcite.DataContext; -import org.apache.calcite.adapter.enumerable.EnumUtils; -import org.apache.calcite.adapter.enumerable.JavaRowFormat; -import org.apache.calcite.adapter.enumerable.PhysTypeImpl; -import org.apache.calcite.adapter.enumerable.RexToLixTranslator; -import org.apache.calcite.linq4j.tree.BlockBuilder; -import org.apache.calcite.linq4j.tree.Expression; -import org.apache.calcite.linq4j.tree.Expressions; -import org.apache.calcite.linq4j.tree.MethodDeclaration; -import org.apache.calcite.linq4j.tree.ParameterExpression; import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.type.RelDataType; -import org.apache.calcite.rex.RexBuilder; -import org.apache.calcite.rex.RexNode; -import org.apache.calcite.rex.RexProgram; -import org.apache.calcite.rex.RexProgramBuilder; -import org.apache.calcite.sql.type.SqlTypeUtil; -import org.apache.calcite.sql.validate.SqlConformanceEnum; -import org.apache.calcite.util.Pair; -import org.apache.ignite.IgniteException; import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; -import org.apache.ignite.internal.processors.query.calcite.exec.exp.IgniteRexBuilder; -import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; import org.apache.ignite.internal.processors.query.calcite.util.Commons; -import org.apache.ignite.internal.util.typedef.F; import org.jetbrains.annotations.NotNull; -import static org.apache.ignite.internal.processors.query.calcite.util.TypeUtils.createRowType; - /** */ -public class AccumulatorsFactory implements Supplier>> { - /** */ - private static final LoadingCache, Function> CACHE = - CacheBuilder.newBuilder().build(CacheLoader.from(AccumulatorsFactory::cast0)); - - /** */ - public static interface CastFunction extends Function { - /** {@inheritDoc} */ - @Override Object apply(Object o); - } - - /** */ - static Function cast(RelDataType from, RelDataType to) { - assert !from.isStruct(); - assert !to.isStruct(); - - return cast(Pair.of(from, to)); - } - - /** */ - static Function cast(Pair types) { - try { - return CACHE.get(types); - } - catch (ExecutionException e) { - throw new IgniteException(e); - } - } - - /** */ - private static Function cast0(Pair types) { - IgniteTypeFactory typeFactory = Commons.typeFactory(); - - RelDataType from = types.left; - RelDataType to = types.right; - - Class fromType = Primitives.wrap((Class)typeFactory.getJavaClass(from)); - Class toType = Primitives.wrap((Class)typeFactory.getJavaClass(to)); - - if (toType.isAssignableFrom(fromType)) - return Function.identity(); - - if (Void.class == toType) - return o -> null; - - return compileCast(typeFactory, from, to); - } - - /** */ - private static Function compileCast(IgniteTypeFactory typeFactory, RelDataType from, - RelDataType to) { - RelDataType rowType = createRowType(typeFactory, from); - ParameterExpression in_ = Expressions.parameter(Object.class, "in"); - - RexToLixTranslator.InputGetter getter = - new RexToLixTranslator.InputGetterImpl( - ImmutableList.of( - Pair.of(EnumUtils.convert(in_, Object.class, typeFactory.getJavaClass(from)), - PhysTypeImpl.of(typeFactory, rowType, - JavaRowFormat.SCALAR, false)))); - - RexBuilder builder = new IgniteRexBuilder(typeFactory); - RexProgramBuilder programBuilder = new RexProgramBuilder(rowType, builder); - RexNode cast = builder.makeCast(to, builder.makeInputRef(from, 0)); - programBuilder.addProject(cast, null); - RexProgram program = programBuilder.getProgram(); - BlockBuilder list = new BlockBuilder(); - List projects = RexToLixTranslator.translateProjects(program, typeFactory, SqlConformanceEnum.DEFAULT, - list, null, DataContext.ROOT, getter, null); - list.add(projects.get(0)); - - MethodDeclaration decl = Expressions.methodDecl( - Modifier.PUBLIC, Object.class, "apply", ImmutableList.of(in_), list.toBlock()); - - return Commons.compile(CastFunction.class, Expressions.toString(F.asList(decl), "\n", false)); - } - - /** */ - private final ExecutionContext ctx; - +public class AccumulatorsFactory extends AccumulatorsFactoryBase implements Supplier>> { /** */ private final AggregateType type; @@ -156,7 +45,7 @@ public AccumulatorsFactory( List aggCalls, RelDataType inputRowType ) { - this.ctx = ctx; + super(ctx); this.type = type; this.inputRowType = inputRowType; @@ -199,7 +88,7 @@ private WrapperPrototype(AggregateCall call) { if (accFactory != null) return accFactory.get(); - // init factory and adapters + // Init factory and adapters. accFactory = Accumulators.accumulatorFactory(call, ctx); Accumulator accumulator = accFactory.get(); @@ -211,59 +100,13 @@ private WrapperPrototype(AggregateCall call) { /** */ @NotNull private Function createInAdapter(Accumulator accumulator) { - if (type == AggregateType.REDUCE || F.isEmpty(call.getArgList())) + if (type == AggregateType.REDUCE) return Function.identity(); - List inTypes = SqlTypeUtil.projectTypes(inputRowType, call.getArgList()); List outTypes = accumulator.argumentTypes(ctx.getTypeFactory()); - - if (call.getArgList().size() > outTypes.size()) { - throw new AssertionError("Unexpected number of arguments: " + - "expected=" + outTypes.size() + ", actual=" + inTypes.size()); - } - - if (call.ignoreNulls()) - inTypes = Commons.transform(inTypes, this::nonNull); - - List> casts = - Commons.transform(Pair.zip(inTypes, outTypes), AccumulatorsFactory::cast); - - final boolean ignoreNulls = call.ignoreNulls(); - - final int[] argMapping = new int[Collections.max(call.getArgList()) + 1]; - Arrays.fill(argMapping, -1); - - for (int i = 0; i < call.getArgList().size(); ++i) - argMapping[call.getArgList().get(i)] = i; - boolean createRow = StoringAccumulator.class.isAssignableFrom(accumulator.getClass()); - return new Function() { - final RowHandler hnd = ctx.rowHandler(); - - final RowHandler.RowFactory rowFac = hnd.factory(ctx.getTypeFactory(), inputRowType); - - final Row reuseRow = createRow ? null : rowFac.create(); - - @Override public Row apply(Row in) { - Row out = createRow ? rowFac.create() : reuseRow; - - for (int i = 0; i < hnd.columnCount(in); ++i) { - Object val = hnd.get(i, in); - - if (ignoreNulls && val == null) - return null; - - int idx = i < argMapping.length ? argMapping[i] : -1; - if (idx != -1) - val = casts.get(idx).apply(val); - - hnd.set(i, out, val); - } - - return out; - } - }; + return AccumulatorsFactory.this.createInAdapter(call, inputRowType, outTypes, createRow); } /** */ @@ -272,9 +115,7 @@ private WrapperPrototype(AggregateCall call) { return Function.identity(); RelDataType inType = accumulator.returnType(ctx.getTypeFactory()); - RelDataType outType = call.getType(); - - return cast(inType, outType); + return AccumulatorsFactory.this.createOutAdapter(call, inType); } /** */ diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactoryBase.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactoryBase.java new file mode 100644 index 0000000000000..7436a6d9a0021 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactoryBase.java @@ -0,0 +1,221 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.agg; + +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.function.Function; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.primitives.Primitives; +import org.apache.calcite.DataContext; +import org.apache.calcite.adapter.enumerable.EnumUtils; +import org.apache.calcite.adapter.enumerable.JavaRowFormat; +import org.apache.calcite.adapter.enumerable.PhysTypeImpl; +import org.apache.calcite.adapter.enumerable.RexToLixTranslator; +import org.apache.calcite.linq4j.tree.BlockBuilder; +import org.apache.calcite.linq4j.tree.Expression; +import org.apache.calcite.linq4j.tree.Expressions; +import org.apache.calcite.linq4j.tree.MethodDeclaration; +import org.apache.calcite.linq4j.tree.ParameterExpression; +import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.rex.RexProgram; +import org.apache.calcite.rex.RexProgramBuilder; +import org.apache.calcite.sql.type.SqlTypeUtil; +import org.apache.calcite.sql.validate.SqlConformanceEnum; +import org.apache.calcite.util.Pair; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.IgniteRexBuilder; +import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; +import org.apache.ignite.internal.processors.query.calcite.util.Commons; +import org.apache.ignite.internal.util.typedef.F; +import org.jetbrains.annotations.NotNull; + +import static org.apache.ignite.internal.processors.query.calcite.util.TypeUtils.createRowType; + +/** + * Base class for accumulators / windows function factory. + * Provides common logic for agruments cast. + * todo: rename/move to another package? + */ +public abstract class AccumulatorsFactoryBase { + /** */ + private static final LoadingCache, Function> CACHE = + CacheBuilder.newBuilder().build(CacheLoader.from(AccumulatorsFactoryBase::cast0)); + + /** */ + public interface CastFunction extends Function { + /** {@inheritDoc} */ + @Override Object apply(Object o); + } + + /** */ + static Function cast(RelDataType from, RelDataType to) { + assert !from.isStruct(); + assert !to.isStruct(); + + return cast(Pair.of(from, to)); + } + + /** */ + static Function cast(Pair types) { + try { + return CACHE.get(types); + } + catch (ExecutionException e) { + throw new IgniteException(e); + } + } + + /** */ + private static Function cast0(Pair types) { + IgniteTypeFactory typeFactory = Commons.typeFactory(); + + RelDataType from = types.left; + RelDataType to = types.right; + + Class fromType = Primitives.wrap((Class)typeFactory.getJavaClass(from)); + Class toType = Primitives.wrap((Class)typeFactory.getJavaClass(to)); + + if (toType.isAssignableFrom(fromType)) + return Function.identity(); + + if (Void.class == toType) + return o -> null; + + return compileCast(typeFactory, from, to); + } + + /** */ + private static Function compileCast(IgniteTypeFactory typeFactory, RelDataType from, + RelDataType to) { + RelDataType rowType = createRowType(typeFactory, from); + ParameterExpression in_ = Expressions.parameter(Object.class, "in"); + + RexToLixTranslator.InputGetter getter = + new RexToLixTranslator.InputGetterImpl( + ImmutableMap.of( + EnumUtils.convert(in_, Object.class, typeFactory.getJavaClass(from)), + PhysTypeImpl.of(typeFactory, rowType, + JavaRowFormat.SCALAR, false))); + + RexBuilder builder = new IgniteRexBuilder(typeFactory); + RexProgramBuilder programBuilder = new RexProgramBuilder(rowType, builder); + RexNode cast = builder.makeCast(to, builder.makeInputRef(from, 0)); + programBuilder.addProject(cast, null); + RexProgram program = programBuilder.getProgram(); + BlockBuilder list = new BlockBuilder(); + List projects = RexToLixTranslator.translateProjects(program, typeFactory, SqlConformanceEnum.DEFAULT, + list, null, null, DataContext.ROOT, getter, null); + list.add(projects.get(0)); + + MethodDeclaration decl = Expressions.methodDecl( + Modifier.PUBLIC, Object.class, "apply", ImmutableList.of(in_), list.toBlock()); + + return Commons.compile(CastFunction.class, Expressions.toString(F.asList(decl), "\n", false)); + } + + /** */ + protected final ExecutionContext ctx; + + /** */ + protected AccumulatorsFactoryBase(ExecutionContext ctx) { + this.ctx = ctx; + } + + /** */ + @NotNull protected Function createInAdapter( + AggregateCall call, + RelDataType inputRowType, + List argTypes, + boolean createRow + ) { + if (F.isEmpty(call.getArgList())) + return Function.identity(); + + List inTypes = SqlTypeUtil.projectTypes(inputRowType, call.getArgList()); + + if (call.getArgList().size() > argTypes.size()) { + throw new AssertionError("Unexpected number of arguments: " + + "expected=" + argTypes.size() + ", actual=" + inTypes.size()); + } + + if (call.ignoreNulls()) + inTypes = Commons.transform(inTypes, this::nonNull); + + List> casts = + Commons.transform(Pair.zip(inTypes, argTypes), AccumulatorsFactory::cast); + + final boolean ignoreNulls = call.ignoreNulls(); + + final int[] argMapping = new int[Collections.max(call.getArgList()) + 1]; + Arrays.fill(argMapping, -1); + + for (int i = 0; i < call.getArgList().size(); ++i) + argMapping[call.getArgList().get(i)] = i; + + return new Function() { + final RowHandler hnd = ctx.rowHandler(); + + final RowHandler.RowFactory rowFac = hnd.factory(ctx.getTypeFactory(), inputRowType); + + final Row reuseRow = createRow ? null : rowFac.create(); + + @Override public Row apply(Row in) { + Row out = createRow ? rowFac.create() : reuseRow; + + for (int i = 0; i < hnd.columnCount(in); ++i) { + Object val = hnd.get(i, in); + + if (ignoreNulls && val == null) + return null; + + int idx = i < argMapping.length ? argMapping[i] : -1; + if (idx != -1) + val = casts.get(idx).apply(val); + + hnd.set(i, out, val); + } + + return out; + } + }; + } + + /** */ + @NotNull protected Function createOutAdapter(AggregateCall call, RelDataType inType) { + RelDataType outType = call.getType(); + return cast(inType, outType); + } + + /** */ + private RelDataType nonNull(RelDataType type) { + return ctx.getTypeFactory().createTypeWithNullability(type, false); + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/GroupKey.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/GroupKey.java index f9e7a42dc6aab..c0ef2f9cfff73 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/GroupKey.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/GroupKey.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.processors.query.calcite.exec.exp.agg; import java.util.Objects; -import org.apache.calcite.util.ImmutableBitSet; +import com.google.common.collect.ImmutableList; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.binary.BinaryRawReader; import org.apache.ignite.binary.BinaryRawWriter; @@ -120,7 +120,7 @@ public RowHandler rowHandler() { */ public static @Nullable GroupKey of(Row r, RowHandler hnd, boolean allowNulls) { if (!allowNulls) - return of(r, hnd, ImmutableBitSet.of()); + return of(r, hnd, ImmutableList.of()); return new GroupKey<>(r, hnd); } @@ -129,9 +129,9 @@ public RowHandler rowHandler() { * @return Group key for provided row. Can be {@code null} if key fields of row contain NULL values and nulls are * not allowed for these columns. */ - public static @Nullable GroupKey of(Row r, RowHandler hnd, ImmutableBitSet allowNulls) { + public static @Nullable GroupKey of(Row r, RowHandler hnd, ImmutableList nullExclusions) { for (int i = 0; i < hnd.columnCount(r); i++) { - if (hnd.get(i, r) == null && !allowNulls.get(i)) + if (hnd.get(i, r) == null && (i >= nullExclusions.size() || nullExclusions.get(i))) return null; } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/BufferingWindowPartition.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/BufferingWindowPartition.java new file mode 100644 index 0000000000000..98aafe087ead8 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/BufferingWindowPartition.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Consumer; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.apache.ignite.internal.processors.query.calcite.exec.tracker.RowTracker; + +/** Buffering implementation of the ROWS / RANGE window partition. */ +final class BufferingWindowPartition extends WindowPartitionBase { + /** Rows in partition. */ + private final List buf; + + /** Frame within partition. */ + private final WindowPartitionFrame frame; + + /** */ + private RowTracker memoryTracker; + + /** */ + BufferingWindowPartition( + Comparator peerCmp, + WindowFunctionFactory funcFactory, + RowHandler.RowFactory rowFactory, + ExecutionContext ctx, + Window.Group grp, + RelDataType inputRowType + ) { + super(peerCmp, funcFactory, rowFactory); + buf = new ArrayList<>(); + frame = createFrame(ctx, grp, peerCmp, inputRowType, buf); + } + + /** {@inheritDoc} */ + @Override public void add(Row row) { + buf.add(row); + onRowAdded(row); + } + + /** {@inheritDoc} */ + @Override public void evalTo(RowHandler.RowFactory factory, Consumer output) { + if (buf.isEmpty()) + return; + + List> accumulators = createWrappers(); + Object[] accResults = new Object[accumulators.size()]; + + int size = buf.size(); + Row prevRow = null; + int peerIdx = -1; + for (int rowIdx = 0; rowIdx < size; rowIdx++) { + Row currRow = buf.get(rowIdx); + if (isNewPeer(currRow, prevRow)) + peerIdx++; + + int accIdx = 0; + for (WindowFunctionWrapper acc : accumulators) { + Object accResult = acc.callBuffering(currRow, rowIdx, peerIdx, frame); + accResults[accIdx++] = accResult; + } + + Row resultRow = createResultRow(factory, currRow, accResults); + output.accept(resultRow); + + prevRow = currRow; + } + } + + /** {@inheritDoc} */ + @Override public void reset() { + buf.forEach(this::onRowRemoved); + buf.clear(); + frame.reset(); + } + + /** {@inheritDoc} */ + @Override public boolean isStreaming() { + return false; + } + + /** {@inheritDoc} */ + @Override public void attachMemoryTracker(RowTracker memoryTracker) { + this.memoryTracker = memoryTracker; + } + + /** Creates frame for partition. */ + private static WindowPartitionFrame createFrame( + ExecutionContext ctx, + Window.Group grp, + Comparator peerCmp, + RelDataType inputRowType, + List buf + ) { + if (grp.isRows) + return new RowWindowPartitionFrame<>(buf, ctx, grp, inputRowType); + else + return new RangeWindowPartitionFrame<>(buf, ctx, peerCmp, grp, inputRowType); + } + + /** Adds row to memory tracker. */ + private void onRowAdded(Row row) { + if (memoryTracker != null) + memoryTracker.onRowAdded(row); + } + + /** Removes row from memory tracker. */ + private void onRowRemoved(Row row) { + if (memoryTracker != null) + memoryTracker.onRowRemoved(row); + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/RangeWindowPartitionFrame.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/RangeWindowPartitionFrame.java new file mode 100644 index 0000000000000..48bd52ef503a4 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/RangeWindowPartitionFrame.java @@ -0,0 +1,216 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Function; +import com.google.common.collect.ImmutableList; +import org.apache.calcite.rel.RelCollation; +import org.apache.calcite.rel.RelFieldCollation; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeField; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexLiteral; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.rex.RexWindowBound; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.apache.calcite.sql.type.SqlTypeFamily; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.IgniteRexBuilder; +import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; +import org.apache.ignite.internal.processors.query.calcite.util.Commons; + +/** {@link WindowPartitionFrame} for RANGE clause. */ +final class RangeWindowPartitionFrame extends WindowPartitionFrame { + /** Comparator for determining a peer's index within a partition. */ + private final Comparator peerCmp; + + /** Returns the row that marks the start of the frame. */ + private final Function lowerBound; + + /** */ + private final boolean cacheableLowerBound; + + /** Returns the row that marks the end of the frame. */ + private final Function upperBound; + + /** */ + private final boolean cacheableUpperBound; + + /** Cached peer idx for which the frame start row has been computed. */ + private int cachedStartPeerIdx = -1; + + /** Cached start row idx of frame. */ + private int cachedStartIdx; + + /** Cached peer idx for which the frame end row has been computed. */ + private int cachedEndPeerIdx = -1; + + /** Cached end row idx of frame. */ + private int cachedEndIdx; + + /** Index of last processed row in frame start. */ + private int cachedStartRowIdx = -1; + + /** Index of last processed row in frame end. */ + private int cachedEndRowIdx = -1; + + /** */ + RangeWindowPartitionFrame( + List buf, + ExecutionContext ctx, + Comparator peerCmp, + Window.Group grp, + RelDataType inputRowType + ) { + super(buf); + this.peerCmp = peerCmp; + lowerBound = rangeBoundToProject(ctx, grp.lowerBound, grp.collation(), inputRowType); + cacheableLowerBound = isCacheableBound(grp.lowerBound); + upperBound = rangeBoundToProject(ctx, grp.upperBound, grp.collation(), inputRowType); + cacheableUpperBound = isCacheableBound(grp.upperBound); + } + + /** {@inheritDoc} */ + @Override int getFrameStart(int rowIdx, int peerIdx) { + if (cachedStartRowIdx == rowIdx || (cacheableLowerBound && cachedStartPeerIdx == peerIdx)) + return cachedStartIdx; + + cachedStartPeerIdx = peerIdx; + cachedStartRowIdx = rowIdx; + + Row row = get(rowIdx); + Row lowerBoundRow = lowerBound.apply(row); + if (lowerBoundRow == null) + cachedStartIdx = 0; + else + cachedStartIdx = bsearchBound(lowerBoundRow, buf, true); + + return cachedStartIdx; + } + + /** {@inheritDoc} */ + @Override int getFrameEnd(int rowIdx, int peerIdx) { + if (cachedEndRowIdx == rowIdx || (cacheableUpperBound && cachedEndPeerIdx == peerIdx)) + return cachedEndIdx; + + cachedEndPeerIdx = peerIdx; + cachedEndRowIdx = rowIdx; + + Row row = get(rowIdx); + Row upperBoundRow = upperBound.apply(row); + if (upperBoundRow == null) + cachedEndIdx = size() - 1; + else + cachedEndIdx = bsearchBound(upperBoundRow, buf, false); + + return cachedEndIdx; + } + + /** {@inheritDoc} */ + @Override public void reset() { + // Reseting index cache. + cachedStartPeerIdx = -1; + cachedEndPeerIdx = -1; + cachedStartRowIdx = -1; + cachedEndRowIdx = -1; + } + + /** Binary search bound. */ + private int bsearchBound(Row row, List buf, boolean lower) { + int start = 0; + int end = buf.size() - 1; + + while (start <= end) { + int mid = (start + end) / 2; + + Row midRow = buf.get(mid); + int cmp = compareRowPeer(midRow, row); + + if (cmp > 0 || (lower && cmp == 0)) + end = mid - 1; + else + start = mid + 1; + } + + return lower ? start : end; + } + + /** */ + private int compareRowPeer(Row row1, Row row2) { + // in case peerCmp is not set - all rows has one peer + return peerCmp == null ? 0 : peerCmp.compare(row1, row2); + } + + /** Create projection for range frame bound. */ + private static Function rangeBoundToProject( + ExecutionContext ctx, + RexWindowBound bound, + RelCollation collation, + RelDataType rowType + ) { + if (bound.isCurrentRow()) + return Function.identity(); + else if (bound.isUnbounded()) + return row -> null; + else { + assert bound.getOffset() != null : "Unexpected null offset in bounded window"; + assert bound.isPreceding() || bound.isFollowing() : "Unexpected preceding/following in bounded window"; + assert collation.getFieldCollations().size() == 1 : "Unexpected number of field collations in bounded window"; + + RelFieldCollation field = collation.getFieldCollations().get(0); + int fieldIdx = field.getFieldIndex(); + List fields = rowType.getFieldList(); + + IgniteTypeFactory typeFactory = Commons.typeFactory(); + RexBuilder builder = new IgniteRexBuilder(typeFactory); + + List project = new ArrayList<>(rowType.getFieldCount()); + for (int i = 0; i < rowType.getFieldCount(); i++) + project.add(builder.makeInputRef(fields.get(i).getType(), i)); + + RexNode offset = bound.getOffset(); + if ((bound.isPreceding() && !field.direction.isDescending()) + || (bound.isFollowing() && field.direction.isDescending())) + // Should invert offset. + offset = builder.makeCall(SqlStdOperatorTable.UNARY_MINUS, ImmutableList.of(offset)); + + SqlOperator operator = SqlStdOperatorTable.PLUS; + RelDataType fieldType = fields.get(fieldIdx).getType(); + if (SqlTypeFamily.DATETIME.contains(fieldType) + && SqlTypeFamily.DATETIME_INTERVAL.contains(offset.getType())) + operator = SqlStdOperatorTable.DATETIME_PLUS; + + RexNode call = builder.makeCall(operator, ImmutableList.of(project.get(fieldIdx), offset)); + call = builder.makeCast(fieldType, call); + + project.set(fieldIdx, call); + + return ctx.expressionFactory().project(project, rowType); + } + } + + /** Verifies that {@link RexWindowBound} supports caching of frame start or end indexes. */ + private static boolean isCacheableBound(RexWindowBound bound) { + return bound.isCurrentRow() || bound.isUnbounded() || bound.getOffset() instanceof RexLiteral; + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/RowWindowPartitionFrame.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/RowWindowPartitionFrame.java new file mode 100644 index 0000000000000..84712e3fc09b0 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/RowWindowPartitionFrame.java @@ -0,0 +1,133 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.List; +import java.util.function.Function; +import com.google.common.collect.ImmutableList; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.rex.RexWindowBound; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.IgniteRexBuilder; +import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; +import org.apache.ignite.internal.processors.query.calcite.util.Commons; + +import static org.apache.calcite.sql.type.SqlTypeName.INTEGER; + +/** {@link WindowPartitionFrame} for ROWS clause. */ +final class RowWindowPartitionFrame extends WindowPartitionFrame { + /** Returns the offset that marks the start of the frame. */ + private final Function lowerBoundOffset; + + /** Returns the offset that marks the end of the frame. */ + private final Function upperBoundOffset; + + /** Cached row idx for which the frame start offset has been computed. */ + private int cachedStartRowIdx = -1; + + /** Cached frame start offset. */ + private Integer cachedStartOffset; + + /** Cached row idx for which the frame end offset has been computed. */ + private int cachedEndRowIdx = -1; + + /** Cached frame end offset. */ + private Integer cachedEndOffset; + + /** */ + RowWindowPartitionFrame( + List buf, + ExecutionContext ctx, + Window.Group grp, + RelDataType inputRowType + ) { + super(buf); + lowerBoundOffset = rowsBoundToOffset(ctx, grp.lowerBound, inputRowType); + upperBoundOffset = rowsBoundToOffset(ctx, grp.upperBound, inputRowType); + } + + /** {@inheritDoc} */ + @Override int getFrameStart(int rowIdx, int peerIdx) { + if (cachedStartRowIdx != rowIdx) { + Row row = get(rowIdx); + cachedStartRowIdx = rowIdx; + cachedStartOffset = lowerBoundOffset.apply(row); + } + + if (cachedStartOffset == null) + return 0; + else { + int idx = applyOffset(rowIdx, cachedStartOffset, size() - 1); + return Math.max(idx, 0); + } + } + + /** {@inheritDoc} */ + @Override int getFrameEnd(int rowIdx, int peerIdx) { + if (cachedEndRowIdx != rowIdx) { + Row row = get(rowIdx); + cachedEndRowIdx = rowIdx; + cachedEndOffset = upperBoundOffset.apply(row); + } + + if (cachedEndOffset == null) + return size() - 1; + else + return applyOffset(rowIdx, cachedEndOffset, size() - 1); + } + + /** {@inheritDoc} */ + @Override protected void reset() { + // Reseting index cache. + cachedStartRowIdx = -1; + cachedEndRowIdx = -1; + } + + /** */ + private static int applyOffset(int rowIdx, int offset, int cap) { + int idx = Math.addExact(rowIdx, offset); + return Math.max(Math.min(idx, cap), -1); + } + + /** Create projection for range frame bound. */ + private static Function rowsBoundToOffset( + ExecutionContext ctx, + RexWindowBound bound, + RelDataType rowType + ) { + if (bound.isCurrentRow()) + return ignored -> 0; + else if (bound.isUnbounded()) + return ignored -> null; + else { + assert bound.getOffset() != null : "Unexpected null offset in bounded window"; + + IgniteTypeFactory typeFactory = Commons.typeFactory(); + RexBuilder builder = new IgniteRexBuilder(typeFactory); + RexNode result = builder.makeCast(typeFactory.createSqlType(INTEGER), bound.getOffset()); + if (bound.isPreceding()) + result = builder.makeCall(SqlStdOperatorTable.UNARY_MINUS, ImmutableList.of(result)); + Function project = ctx.expressionFactory().project(List.of(result), rowType); + return project.andThen(row -> (Integer)ctx.rowHandler().get(0, row)); + } + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/StreamWindowFunction.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/StreamWindowFunction.java new file mode 100644 index 0000000000000..6a87dae3927cf --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/StreamWindowFunction.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import org.jetbrains.annotations.Nullable; + +/** Interface for a window function supporting streaming. */ +interface StreamWindowFunction extends WindowFunction { + /** Performs the window function computation for a given row in streaming mode. */ + @Nullable Object call(Row row, int rowIdx, int peerIdx); + + /** {@inheritDoc} */ + @Override default Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + return call(row, rowIdx, peerIdx); + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/StreamWindowPartition.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/StreamWindowPartition.java new file mode 100644 index 0000000000000..6459c8ecff9aa --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/StreamWindowPartition.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.Comparator; +import java.util.List; +import java.util.function.Consumer; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.apache.ignite.internal.processors.query.calcite.exec.tracker.RowTracker; + +/** Non-buffering implementation of the ROWS / RANGE window partition. */ +final class StreamWindowPartition extends WindowPartitionBase { + /** */ + private Row prevRow; + + /** */ + private Row currRow; + + /** */ + private int rowIdx = -1; + + /** */ + private int peerIdx = -1; + + /** */ + private List> accumulators; + + /** */ + private Object[] accResults; + + /** */ + StreamWindowPartition( + Comparator peerCmp, + WindowFunctionFactory funcFactory, + RowHandler.RowFactory rowFactory + ) { + super(peerCmp, funcFactory, rowFactory); + } + + /** {@inheritDoc} */ + @Override public void add(Row row) { + assert currRow == null : "StreamingWindowPartition can only hold one row"; + currRow = row; + } + + /** {@inheritDoc} */ + @Override public void evalTo(RowHandler.RowFactory factory, Consumer output) { + if (currRow == null) + return; + + if (accumulators == null) { + accumulators = createWrappers(); + accResults = new Object[accumulators.size()]; + } + + rowIdx++; + if (isNewPeer(currRow, prevRow)) + peerIdx++; + + int accIdx = 0; + for (WindowFunctionWrapper acc : accumulators) { + Object accResult = acc.callStreaming(currRow, rowIdx, peerIdx); + accResults[accIdx++] = accResult; + } + + Row resultRow = createResultRow(factory, currRow, accResults); + output.accept(resultRow); + + prevRow = currRow; + currRow = null; + } + + /** {@inheritDoc} */ + @Override public void reset() { + currRow = null; + prevRow = null; + rowIdx = -1; + peerIdx = -1; + accumulators = null; + } + + /** {@inheritDoc} */ + @Override public boolean isStreaming() { + return true; + } + + /** {@inheritDoc} */ + @Override public void attachMemoryTracker(RowTracker memoryTracker) { + // Streaming partition does not use memory tracker. + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunction.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunction.java new file mode 100644 index 0000000000000..dedcc24ee63dc --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunction.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.List; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; +import org.jetbrains.annotations.Nullable; + +/** Interface for window function. */ +interface WindowFunction { + /** Performs window function computation for the specified row inside the buffered frame. */ + @Nullable Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame); + + /** */ + List argumentTypes(IgniteTypeFactory typeFactory); + + /** */ + RelDataType returnType(IgniteTypeFactory typeFactory); +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctionFactory.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctionFactory.java new file mode 100644 index 0000000000000..493e8d75c8802 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctionFactory.java @@ -0,0 +1,248 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; +import com.google.common.collect.ImmutableList; +import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.AccumulatorWrapper; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.AccumulatorsFactoryBase; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.AggregateType; +import org.apache.ignite.internal.processors.query.calcite.util.Commons; +import org.jetbrains.annotations.NotNull; + +/** A factory class responsible for instantiating window functions. */ +final class WindowFunctionFactory extends AccumulatorsFactoryBase { + /** */ + private final List> prototypes; + + /** */ + private final RelDataType inputRowType; + + /** */ + WindowFunctionFactory( + ExecutionContext ctx, + Window.Group grp, + List aggCalls, + RelDataType inputRowType + ) { + super(ctx); + this.inputRowType = inputRowType; + + ImmutableList.Builder> prototypes = ImmutableList.builder(); + for (AggregateCall aggCall : aggCalls) { + if (WindowFunctions.isWindowFunction(aggCall)) + prototypes.add(new WindowFunctionWrapperPrototype(aggCall)); + else + prototypes.add(new WindowFunctionAccumulatorAdapterPrototype(aggCall)); + } + + this.prototypes = prototypes.build(); + } + + /** */ + List> createWrappers() { + return Commons.transform(prototypes, Supplier::get); + } + + /** */ + private interface WindowFunctionPrototype extends Supplier> { + } + + /** */ + private final class WindowFunctionWrapperPrototype implements WindowFunctionPrototype { + /** */ + private Supplier> funcFactory; + + /** */ + private final AggregateCall call; + + /** */ + private Function inAdapter; + + /** */ + private Function outAdapter; + + /** */ + private WindowFunctionWrapperPrototype(AggregateCall call) { + this.call = call; + } + + /** {@inheritDoc} */ + @Override public WindowFunctionWrapper get() { + WindowFunction windowFunction = windowFunction(); + return new FunctionWrapper(windowFunction, inAdapter, outAdapter); + } + + /** */ + @NotNull private WindowFunction windowFunction() { + if (funcFactory != null) + return funcFactory.get(); + + // Init factory and adapters. + funcFactory = WindowFunctions.windowFunctionFactory(call, ctx); + WindowFunction windowFunction = funcFactory.get(); + + inAdapter = createInAdapter(windowFunction); + outAdapter = createOutAdapter(windowFunction); + + return windowFunction; + } + + /** */ + @NotNull private Function createInAdapter(WindowFunction windowFunction) { + List outTypes = windowFunction.argumentTypes(ctx.getTypeFactory()); + return WindowFunctionFactory.this.createInAdapter(call, inputRowType, outTypes, false); + } + + /** */ + @NotNull private Function createOutAdapter(WindowFunction windowFunction) { + RelDataType inType = windowFunction.returnType(ctx.getTypeFactory()); + return WindowFunctionFactory.this.createOutAdapter(call, inType); + } + } + + /** */ + private final class FunctionWrapper implements WindowFunctionWrapper { + /** */ + private final WindowFunction windowFunction; + + /** */ + private final Function inAdapter; + + /** */ + private final Function outAdapter; + + /** */ + FunctionWrapper( + WindowFunction windowFunction, + Function inAdapter, + Function outAdapter + ) { + this.windowFunction = windowFunction; + this.inAdapter = inAdapter; + this.outAdapter = outAdapter; + } + + /** {@inheritDoc} */ + @Override public Object callStreaming(Row row, int rowIdx, int peerIdx) { + assert windowFunction instanceof StreamWindowFunction; + + Row accRow = inAdapter.apply(row); + assert accRow != null; + + Object result = ((StreamWindowFunction)windowFunction).call(accRow, rowIdx, peerIdx); + return outAdapter.apply(result); + } + + /** {@inheritDoc} */ + @Override public Object callBuffering(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + Row accRow = inAdapter.apply(row); + assert accRow != null; + + Object result = windowFunction.call(accRow, rowIdx, peerIdx, frame); + return outAdapter.apply(result); + } + } + + /** */ + private final class WindowFunctionAccumulatorAdapterPrototype implements WindowFunctionPrototype { + + /** */ + private final Supplier> factory; + + /** */ + private WindowFunctionAccumulatorAdapterPrototype(AggregateCall call) { + Supplier>> accFactory = + ctx.expressionFactory().accumulatorsFactory(AggregateType.SINGLE, List.of(call), inputRowType); + factory = () -> accFactory.get().get(0); + } + + /** {@inheritDoc} */ + @Override public WindowFunctionWrapper get() { + return new WindowAccumulatorWrapper<>(factory); + } + } + + /** */ + private static final class WindowAccumulatorWrapper implements WindowFunctionWrapper { + /** */ + private final Supplier> factory; + + /** */ + private AccumulatorWrapper accHolder; + + /** */ + private int frameStart = -1; + + /** */ + private int frameEnd = -1; + + /** */ + private WindowAccumulatorWrapper(Supplier> factory) { + this.factory = factory; + } + + /** {@inheritDoc} */ + @Override public Object callStreaming(Row row, int rowIdx, int peerIdx) { + AccumulatorWrapper acc = accumulator(); + acc.add(row); + return acc.end(); + } + + /** {@inheritDoc} */ + @Override public Object callBuffering(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + int start = frame.getFrameStart(rowIdx, peerIdx); + int end = frame.getFrameEnd(rowIdx, peerIdx); + AccumulatorWrapper acc = accumulator(); + + if (frameStart != start || frameEnd > end) { + // Recalculate accumulator if start idx changed. + frameStart = start; + accHolder = null; + acc = accumulator(); + for (int i = frameStart; i <= end; i++) { + Row valRow = frame.get(i); + acc.add(valRow); + } + } + else if (frameEnd != end && end >= 0) { + // Append rows to accumulator. + for (int i = frameEnd + 1; i <= end; i++) { + Row valRow = frame.get(i); + acc.add(valRow); + } + } + frameEnd = end; + return acc.end(); + } + + /** */ + private AccumulatorWrapper accumulator() { + if (accHolder != null) + return accHolder; + accHolder = factory.get(); + return accHolder; + } + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctionWrapper.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctionWrapper.java new file mode 100644 index 0000000000000..138ef14ae6ce8 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctionWrapper.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import org.jetbrains.annotations.Nullable; + +/** */ +interface WindowFunctionWrapper { + /** Performs the window function computation for a given row in streaming mode. */ + @Nullable Object callStreaming(Row row, int rowIdx, int peerIdx); + + /** Performs window function computation for the specified row inside the buffered frame. */ + @Nullable Object callBuffering(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame); +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctions.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctions.java new file mode 100644 index 0000000000000..9984a98c308c9 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowFunctions.java @@ -0,0 +1,514 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; +import com.google.common.collect.ImmutableList; +import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.sql.SqlOperator; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.apache.ignite.internal.processors.query.calcite.sql.fun.IgniteOwnSqlOperatorTable; +import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; +import org.apache.ignite.internal.util.typedef.F; + +import static org.apache.calcite.sql.type.SqlTypeName.ANY; +import static org.apache.calcite.sql.type.SqlTypeName.BIGINT; +import static org.apache.calcite.sql.type.SqlTypeName.DOUBLE; +import static org.apache.calcite.sql.type.SqlTypeName.INTEGER; + +/** */ +public final class WindowFunctions { + /** Check window group can be processed with streaming partition. */ + public static boolean streamable(Window.Group grp) { + // Can execute window streaming in case: + // - group aggs does not contain operators can access whole partition. + if (grp.aggCalls.stream().anyMatch(it -> BUFFERING_FUNCTIONS.contains(it.op))) + return false; + + // - group aggs contains only ROW_NUMBER, RANK, DENSE_RANK operators + if (grp.aggCalls.stream().allMatch(it -> STREAMING_FUNCTIONS.contains(it.op))) + return true; + + // group frame in 'ROWS BETWEEN UNBOUNDED PRESCENDING AND CURRENT ROW' + //noinspection RedundantIfStatement + if (grp.isRows && grp.lowerBound.isUnbounded() && grp.upperBound.isCurrentRow()) + return true; + + return false; + } + + /** Window functions, which definitly supports sreaming execution. */ + private static final Set STREAMING_FUNCTIONS = Set.of( + SqlStdOperatorTable.ROW_NUMBER, + SqlStdOperatorTable.RANK, + SqlStdOperatorTable.DENSE_RANK + ); + + /** Window functions, which definitly requires buffering. */ + private static final Set BUFFERING_FUNCTIONS = Set.of( + SqlStdOperatorTable.PERCENT_RANK, + SqlStdOperatorTable.CUME_DIST, + SqlStdOperatorTable.FIRST_VALUE, + SqlStdOperatorTable.LAST_VALUE, + IgniteOwnSqlOperatorTable.LAG, + IgniteOwnSqlOperatorTable.LEAD, + SqlStdOperatorTable.NTILE, + SqlStdOperatorTable.NTH_VALUE + ); + + /** Determines if the specified SqlOperator is a window function call. */ + static boolean isWindowFunction(AggregateCall call) { + return STREAMING_FUNCTIONS.contains(call.getAggregation()) + || BUFFERING_FUNCTIONS.contains(call.getAggregation()); + } + + /** */ + static Supplier> windowFunctionFactory( + AggregateCall call, + ExecutionContext ctx + ) { + RowHandler hnd = ctx.rowHandler(); + switch (call.getAggregation().getName()) { + case "ROW_NUMBER": + return () -> new RowNumber<>(hnd, call); + case "RANK": + return () -> new Rank<>(hnd, call); + case "DENSE_RANK": + return () -> new DenseRank<>(hnd, call); + case "PERCENT_RANK": + return () -> new PercentRank<>(hnd, call); + case "CUME_DIST": + return () -> new CumeDist<>(hnd, call); + case "LAG": + return () -> new Lag<>(hnd, call); + case "LEAD": + return () -> new Lead<>(hnd, call); + case "FIRST_VALUE": + return () -> new FirstValue<>(hnd, call); + case "LAST_VALUE": + return () -> new LastValue<>(hnd, call); + case "NTILE": + return () -> new NTile<>(hnd, call); + case "NTH_VALUE": + return () -> new NthValue<>(hnd, call); + default: + throw new AssertionError(call.getAggregation().getName()); + } + } + + /** */ + private abstract static class AbstractWindowFunction { + /** */ + private final RowHandler hnd; + + /** */ + private final AggregateCall aggCall; + + /** */ + private AbstractWindowFunction(RowHandler hnd, AggregateCall aggCall) { + this.hnd = hnd; + this.aggCall = aggCall; + } + + /** */ + T get(int idx, Row row) { + assert idx < arguments().size() : "idx=" + idx + "; arguments=" + arguments(); + + return (T)hnd.get(arguments().get(idx), row); + } + + /** */ + protected AggregateCall aggregateCall() { + return aggCall; + } + + /** */ + protected List arguments() { + return aggCall.getArgList(); + } + + /** */ + int columnCount(Row row) { + return hnd.columnCount(row); + } + } + + /** */ + private abstract static class AbstractLagLeadWindowFunction extends AbstractWindowFunction implements WindowFunction { + /** */ + private AbstractLagLeadWindowFunction(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** */ + protected int getOffset(Row row) { + if (arguments().size() > 1) + return get(1, row); + else + return 1; + } + + /** */ + protected Object getDefault(Row row) { + if (arguments().size() > 2) + return get(2, row); + else + return null; + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + int offset = getOffset(row); + int idx = applyOffset(rowIdx, offset); + if (idx < 0 || idx >= frame.size()) + return getDefault(row); + else { + Row offsetRow = frame.get(idx); + return get(0, offsetRow); + } + } + + /** */ + protected abstract int applyOffset(int rowIdx, int offset); + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + int argSize = arguments().size(); + assert argSize >= 1 && argSize <= 3 : "Unexpected arguments count: " + argSize; + + ImmutableList.Builder builder = ImmutableList.builderWithExpectedSize(argSize); + builder.add(typeFactory.createTypeWithNullability(typeFactory.createSqlType(ANY), true)); + if (argSize > 1) + builder.add(typeFactory.createTypeWithNullability(typeFactory.createSqlType(INTEGER), false)); + if (argSize > 2) + builder.add(typeFactory.createTypeWithNullability(typeFactory.createSqlType(ANY), true)); + return builder.build(); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createTypeWithNullability(typeFactory.createSqlType(ANY), true); + } + } + + /** ROW_NUMBER window function implementation. */ + private static class RowNumber extends AbstractWindowFunction implements StreamWindowFunction { + /** */ + private RowNumber(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx) { + return rowIdx + 1; + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return List.of(); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createSqlType(BIGINT); + } + } + + /** RANK window function implementation. */ + private static class Rank extends AbstractWindowFunction implements StreamWindowFunction { + /** */ + private int previousPeerIdx = -1; + + /** */ + private long rank = 1; + + /** */ + private long cnt; + + /** */ + private Rank(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx) { + if (previousPeerIdx != peerIdx) { + previousPeerIdx = peerIdx; + rank += cnt; + cnt = 0; + } + cnt++; + return rank; + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return List.of(); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createSqlType(BIGINT); + } + } + + /** DENSE_RANK window function implementation. */ + private static class DenseRank extends AbstractWindowFunction implements StreamWindowFunction { + /** */ + private DenseRank(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx) { + return peerIdx + 1; + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return List.of(); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createSqlType(BIGINT); + } + } + + /** PERCENT_RANK window function implementation. */ + private static class PercentRank extends AbstractWindowFunction implements WindowFunction { + /** */ + private final Rank rank; + + /** */ + private PercentRank(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + rank = new Rank<>(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + int size = frame.size() - 1; + if (size == 0) + return 0.0; + else { + long rank = (Long)this.rank.call(row, rowIdx, peerIdx, frame); + return ((double)rank - 1) / size; + } + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return List.of(); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createSqlType(DOUBLE); + } + } + + /** CUME_DIST window function implementation. */ + private static class CumeDist extends AbstractWindowFunction implements WindowFunction { + /** */ + private CumeDist(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + int cnt = frame.size(rowIdx, peerIdx); + return ((double)cnt) / frame.size(); + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return List.of(); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createSqlType(DOUBLE); + } + } + + /** LAG window function implementation. */ + private static class Lag extends AbstractLagLeadWindowFunction { + /** */ + private Lag(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override protected int applyOffset(int rowIdx, int offset) { + return rowIdx - offset; + } + } + + /** LEAD window function implementation. */ + private static class Lead extends AbstractLagLeadWindowFunction { + /** */ + private Lead(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override protected int applyOffset(int rowIdx, int offset) { + return rowIdx + offset; + } + } + + /** FIRST_VALUE window function implementation. */ + private static class FirstValue extends AbstractWindowFunction implements WindowFunction { + /** */ + private FirstValue(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + int startIdx = frame.getFrameStart(rowIdx, peerIdx); + int endIdx = frame.getFrameEnd(rowIdx, peerIdx); + + if (endIdx < startIdx) + // empty frame + return null; + + Row firstRow = frame.get(startIdx); + return get(0, firstRow); + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return F.asList(typeFactory.createTypeWithNullability(typeFactory.createSqlType(ANY), true)); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createTypeWithNullability(typeFactory.createSqlType(ANY), true); + } + } + + /** LAST_VALUE window function implementation. */ + private static class LastValue extends AbstractWindowFunction implements WindowFunction { + /** */ + private LastValue(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + int endIdx = frame.getFrameEnd(rowIdx, peerIdx); + if (endIdx < 0) + return null; + else { + Row lastRow = frame.get(endIdx); + return get(0, lastRow); + } + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return F.asList(typeFactory.createTypeWithNullability(typeFactory.createSqlType(ANY), true)); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createTypeWithNullability(typeFactory.createSqlType(ANY), true); + } + } + + /** NTILE window function implementation. */ + private static class NTile extends AbstractWindowFunction implements WindowFunction { + /** */ + private NTile(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + int buckets = get(0, row); + int rowCnt = frame.size(); + if (buckets >= rowCnt) + return rowIdx + 1; + else { + int rowsPerBucket = rowCnt / buckets; + int remainderRows = rowCnt % buckets; + + // Remainder rows are assigned starting from the first bucket. + // Thus, each of those buckets has an additional row. + if (rowIdx < ((rowsPerBucket + 1) * remainderRows)) + return (rowIdx / (rowsPerBucket + 1)) + 1; + else + return ((rowIdx - remainderRows) / rowsPerBucket) + 1; + } + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return List.of(typeFactory.createSqlType(INTEGER)); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createSqlType(BIGINT); + } + } + + /** NTH_VALUE window function implementation. */ + private static class NthValue extends AbstractWindowFunction implements WindowFunction { + /** */ + private NthValue(RowHandler hnd, AggregateCall aggCall) { + super(hnd, aggCall); + } + + /** {@inheritDoc} */ + @Override public Object call(Row row, int rowIdx, int peerIdx, WindowPartitionFrame frame) { + int offset = get(1, row); + if (offset < 1) + throw new IllegalArgumentException("Offset must be at least 1."); + + int startIdx = frame.getFrameStart(rowIdx, peerIdx); + int endIdx = frame.getFrameEnd(rowIdx, peerIdx); + // offset is 1-based + int valIdx = startIdx + offset - 1; + if (valIdx > endIdx) + return null; + else { + Row valRow = frame.get(valIdx); + return get(0, valRow); + } + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return List.of(typeFactory.createSqlType(ANY), typeFactory.createSqlType(INTEGER)); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createSqlType(ANY); + } + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartition.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartition.java new file mode 100644 index 0000000000000..0f875faa11f52 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartition.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.function.Consumer; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.apache.ignite.internal.processors.query.calcite.exec.tracker.RowTracker; + +/** Partition of rows in window function calculation. */ +public interface WindowPartition { + /** Adding row to the window partition. */ + void add(Row row); + + /** Evaluates partition to an output. */ + void evalTo(RowHandler.RowFactory factory, Consumer output); + + /** Reset current window partition (i.e., on partition restart). */ + void reset(); + + /** Returns {@code true} if partition is streaming. */ + boolean isStreaming(); + + /** Sets memory tracker for current partition. */ + void attachMemoryTracker(RowTracker memoryTracker); +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionBase.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionBase.java new file mode 100644 index 0000000000000..41aa3eb58c973 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionBase.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.Comparator; +import java.util.List; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.jetbrains.annotations.Nullable; + +/** Base implementation of window partition. */ +abstract class WindowPartitionBase implements WindowPartition { + /** Comparator for computing the peer index. */ + private final Comparator peerCmp; + + /** */ + private final WindowFunctionFactory funcFactory; + + /** */ + private final RowHandler.RowFactory rowFactory; + + /** */ + WindowPartitionBase( + Comparator peerCmp, + WindowFunctionFactory funcFactory, + RowHandler.RowFactory rowFactory + ) { + this.peerCmp = peerCmp; + this.funcFactory = funcFactory; + this.rowFactory = rowFactory; + } + + /** Creates {@link WindowFunctionWrapper} list. */ + final List> createWrappers() { + return funcFactory.createWrappers(); + } + + /** Compares two rows and return true if current row peer not equal to the previous row peer. */ + protected final boolean isNewPeer(Row cur, @Nullable Row prev) { + if (prev == null) + return true; + else if (peerCmp != null) + return peerCmp.compare(prev, cur) != 0; + else + return false; + } + + /** Creates row with window function results. */ + protected final Row createResultRow(RowHandler.RowFactory rowFactory, Row src, Object... results) { + Row resultsRow = this.rowFactory.create(results); + return rowFactory.handler().concat(src, resultsRow); + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionFactory.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionFactory.java new file mode 100644 index 0000000000000..88d0db30e9cf1 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionFactory.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.Comparator; +import java.util.List; +import java.util.function.Supplier; +import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.apache.ignite.internal.processors.query.calcite.util.Commons; + +/** Factory to create {@link WindowPartitionBase} factory from {@link Window.Group}. */ +public final class WindowPartitionFactory implements Supplier> { + /** */ + private final WindowFunctionFactory funcFactory; + + /** */ + private final ExecutionContext ctx; + + /** */ + private final Window.Group grp; + + /** */ + private final RelDataType inputRowType; + + /** */ + private final RowHandler.RowFactory rowFactory; + + /** */ + private final Comparator peerCmp; + + /** */ + private final boolean streamable; + + /** */ + public WindowPartitionFactory( + ExecutionContext ctx, + Window.Group grp, + List calls, + RelDataType inputRowType + ) { + this.ctx = ctx; + this.grp = grp; + this.inputRowType = inputRowType; + + List aggTypes = Commons.transform(calls, AggregateCall::getType); + rowFactory = ctx.rowHandler().factory(Commons.typeFactory(), aggTypes); + if (grp.isRows) + // peer comparator in meaningless in rows frame. + peerCmp = null; + else + peerCmp = ctx.expressionFactory().comparator(grp.collation()); + + streamable = WindowFunctions.streamable(grp); + funcFactory = new WindowFunctionFactory<>(ctx, grp, calls, inputRowType); + } + + /** {@inheritDoc} */ + @Override public WindowPartition get() { + if (streamable) + return new StreamWindowPartition<>(peerCmp, funcFactory, rowFactory); + else + return new BufferingWindowPartition<>(peerCmp, funcFactory, rowFactory, ctx, grp, inputRowType); + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionFrame.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionFrame.java new file mode 100644 index 0000000000000..25225f215ae46 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/window/WindowPartitionFrame.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.exp.window; + +import java.util.Collections; +import java.util.List; + +/** Rows frame within window partition. */ +abstract class WindowPartitionFrame { + /** Holds immutable refrence to buffered window partition rows. */ + protected final List buf; + + /** */ + WindowPartitionFrame(List buf) { + this.buf = Collections.unmodifiableList(buf); + } + + /** Returns row from partition by index. */ + Row get(int idx) { + assert idx >= 0 && idx < buf.size() : "Invalid row index"; + return buf.get(idx); + } + + /** Returns start frame index in partition for current row peer. */ + abstract int getFrameStart(int rowIdx, int peerIdx); + + /** Returns end frame index in partition for current row peer. */ + abstract int getFrameEnd(int rowIdx, int peerIdx); + + /** Returns frame size in partition for the current row peer. */ + final int size(int rowIdx, int peerIdx) { + int start = getFrameStart(rowIdx, peerIdx); + int end = getFrameEnd(rowIdx, peerIdx); + if (end >= start) + return end - start + 1; + else + return 0; + } + + /** Returns row count in partition. */ + final int size() { + return buf.size(); + } + + /** Resets current frame. */ + protected abstract void reset(); +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/AbstractNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/AbstractNode.java index f27548c0eb7c9..ef372b62f2ad2 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/AbstractNode.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/AbstractNode.java @@ -79,8 +79,8 @@ protected AbstractNode(ExecutionContext ctx, RelDataType rowType) { /** * {@link Inbox} node may not have proper context at creation time in case it * creates on first message received from a remote source. This case the context - * sets in scope of {@link Inbox#init(ExecutionContext, Collection, Comparator)} method call. - */ /** {@inheritDoc} */ + * sets in scope of {@link Inbox#init(ExecutionContext, RelDataType, Collection, Comparator)} method call. + */ @Override public ExecutionContext context() { return ctx; } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashJoinNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashJoinNode.java index 0158abb25b0b6..1f92f27286f11 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashJoinNode.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashJoinNode.java @@ -25,14 +25,14 @@ import java.util.Map; import java.util.function.BiFunction; import java.util.function.BiPredicate; +import com.google.common.collect.ImmutableList; +import org.apache.calcite.rel.core.JoinInfo; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.type.RelDataType; -import org.apache.calcite.util.ImmutableBitSet; import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; import org.apache.ignite.internal.processors.query.calcite.exec.MappingRowHandler; import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.GroupKey; -import org.apache.ignite.internal.processors.query.calcite.rel.IgniteJoinInfo; import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; import org.jetbrains.annotations.Nullable; @@ -58,7 +58,7 @@ public static HashJoinNode create( RelDataType leftRowType, RelDataType rightRowType, JoinRelType type, - IgniteJoinInfo info, + JoinInfo info, @Nullable BiPredicate nonEqCond ) { assert !info.pairs().isEmpty(); @@ -120,7 +120,7 @@ private abstract static class AbstractStoringHashJoin nullExclusions; /** */ protected @Nullable RowList rightRows; @@ -148,13 +148,13 @@ private abstract static class AbstractStoringHashJoin ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, boolean keepRowsWithNull, @Nullable BiPredicate nonEqCond ) { super(ctx, rowType); - allowNulls = info.allowNulls(); + nullExclusions = info.nullExclusionFlags; this.keepRowsWithNull = keepRowsWithNull; leftRowHnd = new MappingRowHandler<>(ctx.rowHandler(), info.leftKeys.toIntArray()); @@ -175,7 +175,7 @@ protected AbstractStoringHashJoin( /** */ protected @Nullable RowList lookup(Row row) { - GroupKey key = GroupKey.of(row, leftRowHnd, allowNulls); + GroupKey key = GroupKey.of(row, leftRowHnd, nullExclusions); if (key == null) return null; @@ -190,7 +190,7 @@ protected AbstractStoringHashJoin( waitingRight--; - GroupKey key = keepRowsWithNull ? GroupKey.of(row, rightRowHnd) : GroupKey.of(row, rightRowHnd, allowNulls); + GroupKey key = keepRowsWithNull ? GroupKey.of(row, rightRowHnd) : GroupKey.of(row, rightRowHnd, nullExclusions); if (key != null) { nodeMemoryTracker.onRowAdded(row); @@ -293,7 +293,7 @@ private abstract static class AbstractMatchingHashJoin ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, @Nullable RowHandler.RowFactory leftRowFactory, @Nullable RowHandler.RowFactory rightRowFactory, @@ -438,7 +438,7 @@ private abstract static class AbstractNoTouchingHashJoin private AbstractNoTouchingHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, @Nullable RowHandler.RowFactory leftRowFactory, @Nullable RowHandler.RowFactory rightRowFactory, @@ -467,7 +467,7 @@ private static final class InnerHashJoin extends AbstractNoTouchingHashJoi private InnerHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, @Nullable BiPredicate nonEqCond ) { @@ -490,7 +490,7 @@ private static final class LeftHashJoin extends AbstractNoTouchingHashJoin private LeftHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, RowHandler.RowFactory rightRowFactory, @Nullable BiPredicate nonEqCond @@ -516,7 +516,7 @@ private abstract static class AbstractListTouchingHashJoin private AbstractListTouchingHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, @Nullable RowHandler.RowFactory leftRowFactory, @Nullable RowHandler.RowFactory rightRowFactory, @@ -582,7 +582,7 @@ private static class RightHashJoin extends AbstractListTouchingHashJoin ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, RowHandler.RowFactory leftRowFactory, @Nullable BiPredicate nonEqCond @@ -607,7 +607,7 @@ private static final class FullOuterHashJoin extends AbstractListTouchingH private FullOuterHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, RowHandler.RowFactory leftRowFactory, RowHandler.RowFactory rightRowFactory, @@ -634,7 +634,7 @@ private abstract static class AbstractRowTouchingHashJoin private AbstractRowTouchingHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, @Nullable RowHandler.RowFactory leftRowFactory, @Nullable RowHandler.RowFactory rightRowFactory, @@ -678,7 +678,7 @@ private static class RightRowTouchingHashJoin extends AbstractRowTouchingH private RightRowTouchingHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, RowHandler.RowFactory leftRowFactory, @Nullable BiPredicate nonEqCond @@ -703,7 +703,7 @@ private static final class FullOuterRowTouchingHashJoin extends AbstractRo private FullOuterRowTouchingHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, RowHandler outRowHnd, RowHandler.RowFactory leftRowFactory, RowHandler.RowFactory rightRowFactory, @@ -729,7 +729,7 @@ private abstract static class AbstractFilteringHashJoin extends AbstractSt private AbstractFilteringHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, @Nullable BiPredicate nonEqCond ) { super(ctx, rowType, info, false, nonEqCond); @@ -813,7 +813,7 @@ private static final class SemiHashJoin extends AbstractFilteringHashJoin< private SemiHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, @Nullable BiPredicate nonEqCond ) { super(ctx, rowType, info, nonEqCond); @@ -840,7 +840,7 @@ private static final class AntiHashJoin extends AbstractFilteringHashJoin< private AntiHashJoin( ExecutionContext ctx, RelDataType rowType, - IgniteJoinInfo info, + JoinInfo info, @Nullable BiPredicate nonEqCond ) { super(ctx, rowType, info, nonEqCond); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/WindowNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/WindowNode.java new file mode 100644 index 0000000000000..ae4e0527eb3fd --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/WindowNode.java @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.rel; + +import java.util.ArrayDeque; +import java.util.Comparator; +import java.util.Deque; +import java.util.function.Supplier; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.window.WindowPartition; +import org.apache.ignite.internal.util.typedef.F; + +/** Window node. */ +public class WindowNode extends MemoryTrackingNode implements SingleNode, Downstream { + /** */ + private final Comparator partCmp; + + /** */ + private final Supplier> partFactory; + + /** */ + private final RowHandler.RowFactory rowFactory; + + /** */ + private WindowPartition part; + + /** */ + private int requested; + + /** */ + private int waiting; + + /** */ + private Row prevRow; + + /** */ + private final Deque outBuf = new ArrayDeque<>(IN_BUFFER_SIZE); + + /** */ + private boolean inLoop; + + /** */ + public WindowNode( + ExecutionContext ctx, + RelDataType rowType, + Comparator partCmp, + Supplier> partFactory, + RowHandler.RowFactory rowFactory + ) { + super(ctx, rowType, DFLT_ROW_OVERHEAD); + this.partCmp = partCmp; + this.partFactory = partFactory; + this.rowFactory = rowFactory; + } + + /** {@inheritDoc} */ + @Override public void request(int rowsCnt) throws Exception { + assert !F.isEmpty(sources()) && sources().size() == 1; + assert rowsCnt > 0; + + checkState(); + + requested = rowsCnt; + + if (waiting == 0 && outBuf.isEmpty()) + source().request(waiting = IN_BUFFER_SIZE); + else if (!inLoop) + flush(); + } + + /** {@inheritDoc} */ + @Override public void push(Row row) throws Exception { + assert downstream() != null; + assert waiting > 0; + + checkState(); + + waiting--; + + if (part == null) { + part = partFactory.get(); + part.attachMemoryTracker(nodeMemoryTracker); + } + else if (prevRow != null && partCmp != null && partCmp.compare(prevRow, row) != 0) { + part.evalTo(rowFactory, this::appendToOutBuf); + part.reset(); + } + + part.add(row); + + if (part.isStreaming()) + part.evalTo(rowFactory, this::appendToOutBuf); + + prevRow = row; + + if (!inLoop) + flush(); + } + + /** {@inheritDoc} */ + @Override public void end() throws Exception { + assert downstream() != null; + if (waiting < 0) + return; + + waiting = -1; + + checkState(); + + if (part != null) { + part.evalTo(rowFactory, this::appendToOutBuf); + part.reset(); + } + + flush(); + } + + /** {@inheritDoc} */ + @Override protected void rewindInternal() { + requested = 0; + waiting = 0; + if (part != null) { + part.reset(); + part = null; + } + outBuf.clear(); + nodeMemoryTracker.reset(); + } + + /** {@inheritDoc} */ + @Override protected Downstream requestDownstream(int idx) { + if (idx != 0) + throw new IndexOutOfBoundsException(); + + return this; + } + + /** */ + private void appendToOutBuf(Row row) { + outBuf.add(row); + nodeMemoryTracker.onRowAdded(row); + } + + /** */ + private void flush() throws Exception { + inLoop = true; + try { + while (requested > 0 && !outBuf.isEmpty()) { + requested--; + + Row row = outBuf.poll(); + nodeMemoryTracker.onRowRemoved(row); + downstream().push(row); + } + } + finally { + inLoop = false; + } + + if (waiting == 0 && requested > 0 && outBuf.isEmpty()) + context().execute(() -> source().request(waiting = IN_BUFFER_SIZE), this::onError); + + if (waiting < 0 && requested > 0 && outBuf.isEmpty()) { + requested = 0; + downstream().end(); + } + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelInputEx.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelInputEx.java index cb64b13e634ca..a5f1e7648e227 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelInputEx.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelInputEx.java @@ -19,6 +19,7 @@ import java.util.List; import org.apache.calcite.rel.RelCollation; import org.apache.calcite.rel.RelInput; +import org.apache.calcite.rel.core.Window; import org.apache.ignite.internal.processors.query.calcite.prepare.bounds.SearchBounds; /** */ @@ -35,4 +36,10 @@ public interface RelInputEx extends RelInput { * @return Search bounds. */ List getSearchBounds(String tag); + + /** + * @param tag Tag. + * @return A window group value. + */ + Window.Group getWindowGroup(String tag); } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java index 0460fb49da086..e2fbee0efe276 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java @@ -55,6 +55,7 @@ import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Spool; +import org.apache.calcite.rel.core.Window; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeFactoryImpl.JavaType; @@ -66,12 +67,11 @@ import org.apache.calcite.rex.RexFieldCollation; import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexNode; -import org.apache.calcite.rex.RexOver; import org.apache.calcite.rex.RexSlot; import org.apache.calcite.rex.RexVariable; -import org.apache.calcite.rex.RexWindow; import org.apache.calcite.rex.RexWindowBound; import org.apache.calcite.rex.RexWindowBounds; +import org.apache.calcite.rex.RexWindowExclusion; import org.apache.calcite.runtime.SqlFunctions; import org.apache.calcite.sql.JoinConditionType; import org.apache.calcite.sql.JoinType; @@ -197,6 +197,7 @@ private static RelFactory relFactory(String typeName) { register(enumByName, SqlTrimFunction.Flag.class); register(enumByName, TimeUnitRange.class); register(enumByName, Spool.Type.class); + register(enumByName, RexWindowExclusion.class); ENUM_BY_NAME = enumByName.build(); } @@ -273,8 +274,8 @@ else if (value instanceof Enum) return toJson((Enum)value); else if (value instanceof RexNode) return toJson((RexNode)value); - else if (value instanceof RexWindow) - return toJson((RexWindow)value); + else if (value instanceof Window.Group) + return toJson((Window.Group)value); else if (value instanceof RexFieldCollation) return toJson((RexFieldCollation)value); else if (value instanceof RexWindowBound) @@ -447,49 +448,30 @@ else if (o instanceof Map) { List operands = (List)map.get("operands"); List rexOperands = toRexList(relInput, operands); Object jsonType = map.get("type"); - Map window = (Map)map.get("window"); - if (window != null) { - SqlAggFunction operator = (SqlAggFunction)toOp(opMap); - RelDataType type = toType(typeFactory, jsonType); - List partitionKeys = new ArrayList<>(); - if (window.containsKey("partition")) - partitionKeys = toRexList(relInput, (List)window.get("partition")); - List orderKeys = new ArrayList<>(); - if (window.containsKey("order")) - orderKeys = toRexFieldCollationList(relInput, (List)window.get("order")); - RexWindowBound lowerBound; - RexWindowBound upperBound; - boolean physical; - if (window.get("rows-lower") != null) { - lowerBound = toRexWindowBound(relInput, (Map)window.get("rows-lower")); - upperBound = toRexWindowBound(relInput, (Map)window.get("rows-upper")); - physical = true; - } - else if (window.get("range-lower") != null) { - lowerBound = toRexWindowBound(relInput, (Map)window.get("range-lower")); - upperBound = toRexWindowBound(relInput, (Map)window.get("range-upper")); - physical = false; - } - else { - // No ROWS or RANGE clause - lowerBound = null; - upperBound = null; - physical = false; - } - boolean distinct = (Boolean)map.get("distinct"); - return rexBuilder.makeOver(type, operator, rexOperands, partitionKeys, - ImmutableList.copyOf(orderKeys), lowerBound, upperBound, physical, - true, false, distinct, false); - } - else { - SqlOperator operator = toOp(opMap); - RelDataType type; - if (jsonType != null) - type = toType(typeFactory, jsonType); - else - type = rexBuilder.deriveReturnType(operator, rexOperands); - return rexBuilder.makeCall(type, operator, rexOperands); + + SqlOperator operator = toOp(opMap); + RelDataType type; + if (jsonType != null) + type = toType(typeFactory, jsonType); + else + type = rexBuilder.deriveReturnType(operator, rexOperands); + + if (map.containsKey("winAggregate")) { + Map winAggregate = (Map)map.get("winAggregate"); + Integer ordinal = (Integer)winAggregate.get("ordinal"); + Boolean distinct = (Boolean)winAggregate.get("distinct"); + Boolean ignoreNulls = (Boolean)winAggregate.get("ignoreNulls"); + return new Window.RexWinAggCall( + (SqlAggFunction)operator, + type, + rexOperands, + ordinal, + distinct, + ignoreNulls + ); } + + return rexBuilder.makeCall(type, operator, rexOperands); } Integer input = (Integer)map.get("input"); if (input != null) { @@ -725,6 +707,48 @@ List toSearchBoundList(RelInput input, List> b return bounds.stream().map(b -> toSearchBound(input, b)).collect(Collectors.toList()); } + /** */ + Window.Group toWindowGroup(RelInput input, Map grp) { + if (grp == null) + return null; + + List aggCalls = Commons.transform((List>)grp.get("calls"), + it -> (Window.RexWinAggCall)toRex(input, it)); + ImmutableBitSet partition = grp.get("partition") == null + ? ImmutableBitSet.of() + : ImmutableBitSet.of((Iterable)grp.get("partition")); + RelCollation order = grp.get("order") == null + ? RelCollations.EMPTY + : toCollation((List>)grp.get("order")); + + RexWindowBound lowerBound; + RexWindowBound upperBound; + boolean rows; + if (grp.get("rows-lower") != null) { + lowerBound = toRexWindowBound(input, (Map)grp.get("rows-lower")); + upperBound = toRexWindowBound(input, (Map)grp.get("rows-upper")); + rows = true; + } + else if (grp.get("range-lower") != null) { + lowerBound = toRexWindowBound(input, (Map)grp.get("range-lower")); + upperBound = toRexWindowBound(input, (Map)grp.get("range-upper")); + rows = false; + } + else + throw new IllegalStateException("RANGE or ROWS clause missing"); + + RexWindowExclusion exclude = toEnum(grp.get("exclude")); + return new Window.Group( + partition, + rows, + lowerBound, + upperBound, + exclude, + order, + aggCalls + ); + } + /** */ private Object toJson(Enum enum0) { String key = enum0.getDeclaringClass().getSimpleName() + "#" + enum0.name(); @@ -885,10 +909,12 @@ private Object toJson(RexNode node) { map.put("dynamic", op.isDynamicFunction()); } - if (call instanceof RexOver) { - RexOver over = (RexOver)call; - map.put("distinct", over.isDistinct()); - map.put("window", toJson(over.getWindow())); + if (call instanceof Window.RexWinAggCall) { + Map winAggregate = map(); + winAggregate.put("ordinal", ((Window.RexWinAggCall)call).ordinal); + winAggregate.put("distinct", ((Window.RexWinAggCall)call).distinct); + winAggregate.put("ignoreNulls", ((Window.RexWinAggCall)call).ignoreNulls); + map.put("winAggregate", winAggregate); } return map; @@ -898,28 +924,22 @@ private Object toJson(RexNode node) { } /** */ - private Object toJson(RexWindow window) { + private Object toJson(Window.Group grp) { Map map = map(); - if (!window.partitionKeys.isEmpty()) - map.put("partition", toJson(window.partitionKeys)); - if (!window.orderKeys.isEmpty()) - map.put("order", toJson(window.orderKeys)); - if (window.getLowerBound() == null) { - // No ROWS or RANGE clause - } - else if (window.getUpperBound() == null) - if (window.isRows()) - map.put("rows-lower", toJson(window.getLowerBound())); - else - map.put("range-lower", toJson(window.getLowerBound())); - else if (window.isRows()) { - map.put("rows-lower", toJson(window.getLowerBound())); - map.put("rows-upper", toJson(window.getUpperBound())); + map.put("calls", toJson(grp.aggCalls)); + if (!grp.keys.isEmpty()) + map.put("partition", toJson(grp.keys)); + if (!grp.orderKeys.getKeys().isEmpty()) + map.put("order", toJson(grp.orderKeys)); + if (grp.isRows) { + map.put("rows-lower", toJson(grp.lowerBound)); + map.put("rows-upper", toJson(grp.upperBound)); } else { - map.put("range-lower", toJson(window.getLowerBound())); - map.put("range-upper", toJson(window.getUpperBound())); + map.put("range-lower", toJson(grp.lowerBound)); + map.put("range-upper", toJson(grp.upperBound)); } + map.put("exclude", toJson(grp.exclude)); return map; } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJsonReader.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJsonReader.java index 472a2d17f06e8..5c05b9ebdca80 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJsonReader.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJsonReader.java @@ -38,6 +38,7 @@ import org.apache.calcite.rel.RelInput; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.core.Window; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexNode; @@ -298,6 +299,11 @@ private RelInputImpl(Map jsonRel) { return relJson.toSearchBoundList(this, (List>)get(tag)); } + /** {@inheritDoc} */ + @Override public Window.Group getWindowGroup(String tag) { + return relJson.toWindowGroup(this, (Map)get(tag)); + } + /** {@inheritDoc} */ @Override public RelDistribution getDistribution() { return relJson.toDistribution(get("distribution")); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/Cloner.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/Cloner.java index ee6acfd35b9b7..a60ae8a9cb29b 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/Cloner.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/Cloner.java @@ -46,6 +46,7 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUncollect; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUnionAll; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteValues; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteWindow; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedHashAggregate; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedSortAggregate; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteMapHashAggregate; @@ -273,6 +274,11 @@ private IgniteReceiver collect(IgniteReceiver receiver) { return rel.clone(cluster, F.asList(visit((IgniteRel)rel.getInput()))); } + /** {@inheritDoc} */ + @Override public IgniteRel visit(IgniteWindow rel) { + return rel.clone(cluster, F.asList(visit((IgniteRel)rel.getInput()))); + } + /** {@inheritDoc} */ @Override public IgniteRel visit(IgniteRel rel) { return rel.accept(this); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelShuttle.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelShuttle.java index 62cb65fd95abe..c922ccba7c882 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelShuttle.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteRelShuttle.java @@ -45,6 +45,7 @@ import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUncollect; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteUnionAll; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteValues; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteWindow; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedHashAggregate; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedSortAggregate; import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteMapHashAggregate; @@ -216,6 +217,11 @@ public class IgniteRelShuttle implements IgniteRelVisitor { return processNode(rel); } + /** {@inheritDoc} */ + @Override public IgniteRel visit(IgniteWindow rel) { + return processNode(rel); + } + /** {@inheritDoc} */ @Override public IgniteRel visit(IgniteRel rel) { return rel.accept(this); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java index 8d25cf1c249a0..1c7f00da26537 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java @@ -49,6 +49,7 @@ import org.apache.calcite.sql.SqlSelect; import org.apache.calcite.sql.SqlUpdate; import org.apache.calcite.sql.SqlUtil; +import org.apache.calcite.sql.SqlWindow; import org.apache.calcite.sql.dialect.CalciteSqlDialect; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.type.FamilyOperandTypeChecker; @@ -300,6 +301,13 @@ else if (call.getKind() == SqlKind.CAST) { if (call.getOperandList().size() > 2) throw newValidationError(call, IgniteResource.INSTANCE.invalidCastParameters()); } + else if (call.getKind() == SqlKind.OVER && call.operand(1) instanceof SqlWindow) { + SqlLiteral exclude = call.operand(1).getExclude(); + if (exclude != null && !SqlWindow.isExcludeNoOthers(exclude)) { + String clause = exclude.toSqlString(CalciteSqlDialect.DEFAULT).getSql(); + throw newValidationError(exclude, IgniteResource.INSTANCE.unsupportedClause(clause)); + } + } super.validateCall(call, scope); } @@ -437,10 +445,6 @@ private SqlNode rewriteTableToQuery(SqlNode from) { /** */ private void validateAggregateFunction(SqlCall call, SqlAggFunction aggFunction) { - if (!SqlKind.AGGREGATE.contains(aggFunction.kind)) - throw newValidationError(call, - IgniteResource.INSTANCE.unsupportedAggregationFunction(aggFunction.getName())); - switch (aggFunction.kind) { case COUNT: if (call.operandCount() > 1) @@ -460,6 +464,17 @@ private void validateAggregateFunction(SqlCall call, SqlAggFunction aggFunction) case BIT_AND: case BIT_OR: case BIT_XOR: + case ROW_NUMBER: + case DENSE_RANK: + case RANK: + case PERCENT_RANK: + case CUME_DIST: + case LAG: + case LEAD: + case FIRST_VALUE: + case LAST_VALUE: + case NTILE: + case NTH_VALUE: return; default: throw newValidationError(call, diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerHelper.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerHelper.java index 1cef9ab4ce633..d88275fb786e4 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerHelper.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerHelper.java @@ -125,6 +125,8 @@ public static IgniteRel optimize(SqlNode sqlNode, IgnitePlanner planner, IgniteL rel = planner.replaceCorrelatesCollisions(rel); + rel = planner.transform(PlannerPhase.HEP_WINDOW_SPLIT, rel.getTraitSet(), rel); + rel = planner.extractConjunctionOverDisjunctionCommonPart(rel); rel = planner.transform(PlannerPhase.HEP_FILTER_PUSH_DOWN, rel.getTraitSet(), rel); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java index b8333a541663f..1ac34eab52688 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java @@ -70,11 +70,13 @@ import org.apache.ignite.internal.processors.query.calcite.rule.UncollectConverterRule; import org.apache.ignite.internal.processors.query.calcite.rule.UnionConverterRule; import org.apache.ignite.internal.processors.query.calcite.rule.ValuesConverterRule; +import org.apache.ignite.internal.processors.query.calcite.rule.WindowConverterRule; import org.apache.ignite.internal.processors.query.calcite.rule.logical.ExposeIndexRule; import org.apache.ignite.internal.processors.query.calcite.rule.logical.FilterScanMergeRule; import org.apache.ignite.internal.processors.query.calcite.rule.logical.IgniteMultiJoinOptimizeRule; import org.apache.ignite.internal.processors.query.calcite.rule.logical.LogicalOrToUnionRule; import org.apache.ignite.internal.processors.query.calcite.rule.logical.ProjectScanMergeRule; +import org.apache.ignite.internal.processors.query.calcite.rule.logical.WindowConstantsRule; import static org.apache.ignite.internal.processors.query.calcite.prepare.IgnitePrograms.cbo; import static org.apache.ignite.internal.processors.query.calcite.prepare.IgnitePrograms.hep; @@ -102,6 +104,24 @@ public enum PlannerPhase { } }, + /** */ + HEP_WINDOW_SPLIT("Heuristic phase to split project to project and window") { + /** {@inheritDoc} */ + @Override public RuleSet getRules(PlanningContext ctx) { + return ctx.rules( + RuleSets.ofList( + CoreRules.PROJECT_TO_LOGICAL_PROJECT_AND_WINDOW, + WindowConstantsRule.INSTANCE + ) + ); + } + + /** {@inheritDoc} */ + @Override public Program getProgram(PlanningContext ctx) { + return hep(getRules(ctx)); + } + }, + /** */ HEP_FILTER_PUSH_DOWN("Heuristic phase to push down filters") { /** {@inheritDoc} */ @@ -118,7 +138,8 @@ public enum PlannerPhase { CoreRules.JOIN_CONDITION_PUSH, CoreRules.FILTER_INTO_JOIN, CoreRules.FILTER_CORRELATE, - CoreRules.FILTER_PROJECT_TRANSPOSE + CoreRules.FILTER_PROJECT_TRANSPOSE, + CoreRules.FILTER_WINDOW_TRANSPOSE ) ); } @@ -140,7 +161,8 @@ public enum PlannerPhase { CoreRules.JOIN_PUSH_EXPRESSIONS, CoreRules.PROJECT_MERGE, CoreRules.PROJECT_REMOVE, - CoreRules.PROJECT_FILTER_TRANSPOSE + CoreRules.PROJECT_FILTER_TRANSPOSE, + CoreRules.PROJECT_WINDOW_TRANSPOSE ) ); } @@ -279,6 +301,10 @@ public enum PlannerPhase { NestedLoopJoinConverterRule.INSTANCE, HashJoinConverterRule.INSTANCE, + // This rule replaces input refs to literals in the window agg calls. + // Since ignite aggregate calculation bounded to input field index - this rule should be excluded from rule set. + //CoreRules.WINDOW_REDUCE_EXPRESSIONS, + ValuesConverterRule.INSTANCE, LogicalScanConverterRule.INDEX_SCAN, LogicalScanConverterRule.TABLE_SCAN, @@ -300,7 +326,8 @@ public enum PlannerPhase { TableModifyDistributedConverterRule.INSTANCE, UnionConverterRule.INSTANCE, SortConverterRule.INSTANCE, - TableFunctionScanConverterRule.INSTANCE + TableFunctionScanConverterRule.INSTANCE, + WindowConverterRule.INSTANCE ) ); } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteJoinInfo.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteJoinInfo.java deleted file mode 100644 index 95e2ecbd6b432..0000000000000 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteJoinInfo.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.processors.query.calcite.rel; - -import java.util.ArrayList; -import java.util.List; -import com.google.common.collect.ImmutableList; -import org.apache.calcite.plan.RelOptUtil; -import org.apache.calcite.rel.core.Join; -import org.apache.calcite.rel.core.JoinInfo; -import org.apache.calcite.rex.RexNode; -import org.apache.calcite.util.ImmutableBitSet; -import org.apache.calcite.util.ImmutableIntList; -import org.apache.ignite.internal.util.typedef.F; - -/** Extended {@link JoinInfo}. */ -public class IgniteJoinInfo extends JoinInfo { - /** Conditions with mathing nulls. It usually means presence of 'IS DISTINCT' / 'IS NOT DISTINCT'. */ - private final ImmutableBitSet allowNulls; - - /** */ - public IgniteJoinInfo( - ImmutableIntList leftKeys, - ImmutableIntList rightKeys, - ImmutableBitSet allowNulls, - ImmutableList nonEquis - ) { - super(leftKeys, rightKeys, nonEquis); - - this.allowNulls = allowNulls; - } - - /** */ - public static IgniteJoinInfo of(Join join) { - List leftKeys = new ArrayList<>(); - List rightKeys = new ArrayList<>(); - List skipNulls = new ArrayList<>(); - List nonEquis = new ArrayList<>(); - - RelOptUtil.splitJoinCondition(join.getLeft(), join.getRight(), join.getCondition(), leftKeys, rightKeys, - skipNulls, nonEquis); - - ImmutableBitSet.Builder allowNulls = null; - - if (!F.isEmpty(skipNulls)) { - allowNulls = ImmutableBitSet.builder(); - - for (int i = 0; i < skipNulls.size(); ++i) { - if (!skipNulls.get(i)) - allowNulls.set(i); - } - } - - return new IgniteJoinInfo( - ImmutableIntList.copyOf(leftKeys), - ImmutableIntList.copyOf(rightKeys), - allowNulls == null ? ImmutableBitSet.of() : allowNulls.build(), - ImmutableList.copyOf(nonEquis) - ); - } - - /** */ - public ImmutableBitSet allowNulls() { - return allowNulls; - } -} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteMergeJoin.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteMergeJoin.java index c1dae0e6f90e2..15a813fd659e4 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteMergeJoin.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteMergeJoin.java @@ -44,7 +44,6 @@ import org.apache.ignite.internal.processors.query.calcite.metadata.cost.IgniteCostFactory; import org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils; import org.apache.ignite.internal.processors.query.calcite.util.Commons; -import org.jetbrains.annotations.Nullable; import static org.apache.calcite.rel.RelCollations.EMPTY; import static org.apache.calcite.rel.RelCollations.containsOrderless; @@ -64,9 +63,6 @@ public class IgniteMergeJoin extends AbstractIgniteJoin { */ private final RelCollation rightCollation; - /** Mathing null conditions like 'IS NOT DISTINCT'. */ - private final ImmutableBitSet allowNulls; - /** */ public IgniteMergeJoin( RelOptCluster cluster, @@ -74,11 +70,10 @@ public IgniteMergeJoin( RelNode left, RelNode right, RexNode condition, - @Nullable ImmutableBitSet allowNulls, Set variablesSet, JoinRelType joinType ) { - this(cluster, traitSet, left, right, condition, allowNulls, variablesSet, joinType, + this(cluster, traitSet, left, right, condition, variablesSet, joinType, left.getTraitSet().getCollation(), right.getTraitSet().getCollation()); } @@ -90,7 +85,6 @@ public IgniteMergeJoin(RelInput input) { input.getInputs().get(0), input.getInputs().get(1), input.getExpression("condition"), - input.getBitSet("allowNulls"), ImmutableSet.copyOf(Commons.transform(input.getIntegerList("variablesSet"), CorrelationId::new)), input.getEnum("joinType", JoinRelType.class), ((RelInputEx)input).getCollation("leftCollation"), @@ -105,7 +99,6 @@ private IgniteMergeJoin( RelNode left, RelNode right, RexNode condition, - @Nullable ImmutableBitSet allowNulls, Set variablesSet, JoinRelType joinType, RelCollation leftCollation, @@ -115,13 +108,12 @@ private IgniteMergeJoin( this.leftCollation = leftCollation; this.rightCollation = rightCollation; - this.allowNulls = allowNulls == null ? ImmutableBitSet.of() : allowNulls; } /** {@inheritDoc} */ @Override public Join copy(RelTraitSet traitSet, RexNode condition, RelNode left, RelNode right, JoinRelType joinType, boolean semiJoinDone) { - return new IgniteMergeJoin(getCluster(), traitSet, left, right, condition, allowNulls, variablesSet, joinType, + return new IgniteMergeJoin(getCluster(), traitSet, left, right, condition, variablesSet, joinType, left.getTraitSet().getCollation(), right.getTraitSet().getCollation()); } @@ -132,7 +124,7 @@ private IgniteMergeJoin( /** {@inheritDoc} */ @Override public IgniteRel clone(RelOptCluster cluster, List inputs) { - return new IgniteMergeJoin(cluster, getTraitSet(), inputs.get(0), inputs.get(1), getCondition(), allowNulls, + return new IgniteMergeJoin(cluster, getTraitSet(), inputs.get(0), inputs.get(1), getCondition(), getVariablesSet(), getJoinType(), leftCollation, rightCollation); } @@ -277,8 +269,7 @@ else if (containsOrderless(rightKeys, collation)) { @Override public RelWriter explainTerms(RelWriter pw) { return super.explainTerms(pw) .item("leftCollation", leftCollation) - .item("rightCollation", rightCollation) - .item("allowNulls", allowNulls); + .item("rightCollation", rightCollation); } /** @@ -295,13 +286,6 @@ public RelCollation rightCollation() { return rightCollation; } - /** - * @return Matching null conditions. - */ - public ImmutableBitSet allowNulls() { - return allowNulls; - } - /** Creates pair with default collation for parent and simple yet sufficient collation for children nodes. */ private Pair> defaultCollationPair( RelTraitSet nodeTraits, diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteRelVisitor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteRelVisitor.java index 0f68002fb9570..456b7b46d2695 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteRelVisitor.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteRelVisitor.java @@ -79,7 +79,6 @@ public interface IgniteRelVisitor { */ T visit(IgniteIndexCount rel); - /** * See {@link IgniteRelVisitor#visit(IgniteRel)} */ @@ -190,6 +189,11 @@ public interface IgniteRelVisitor { */ T visit(IgniteUncollect rel); + /** + * See {@link IgniteRelVisitor#visit(IgniteRel)} + */ + T visit(IgniteWindow rel); + /** * Visits a relational node and calculates a result on the basis of node meta information. * @param rel Relational node. diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteWindow.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteWindow.java new file mode 100644 index 0000000000000..33c683c108dfd --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteWindow.java @@ -0,0 +1,295 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.rel; + +import java.util.ArrayList; +import java.util.List; +import com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptCluster; +import org.apache.calcite.plan.RelOptCost; +import org.apache.calcite.plan.RelOptPlanner; +import org.apache.calcite.plan.RelTraitSet; +import org.apache.calcite.rel.RelCollation; +import org.apache.calcite.rel.RelCollations; +import org.apache.calcite.rel.RelDistribution; +import org.apache.calcite.rel.RelFieldCollation; +import org.apache.calcite.rel.RelInput; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.RelWriter; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.metadata.RelMetadataQuery; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rex.RexLiteral; +import org.apache.calcite.util.ImmutableBitSet; +import org.apache.calcite.util.Pair; +import org.apache.calcite.util.Util; +import org.apache.ignite.internal.processors.query.calcite.externalize.RelInputEx; +import org.apache.ignite.internal.processors.query.calcite.metadata.cost.IgniteCostFactory; +import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistribution; +import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions; +import org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils; +import org.apache.ignite.internal.util.collection.IntHashMap; +import org.apache.ignite.internal.util.collection.IntMap; + +import static org.apache.ignite.internal.processors.query.calcite.metadata.cost.IgniteCost.AGG_CALL_MEM_COST; +import static org.apache.ignite.internal.processors.query.calcite.metadata.cost.IgniteCost.AVERAGE_FIELD_SIZE; +import static org.apache.ignite.internal.processors.query.calcite.metadata.cost.IgniteCost.ROW_COMPARISON_COST; +import static org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils.changeTraits; + +/** + * A relational expression representing a set of window aggregates. + * + *

A Window can handle several window aggregate functions, over one + * partition, with pre- and post-expressions, and an optional post-filter. + * Partitions is defined by a partition key (zero or more columns) + * and a range (logical or physical). The partition expect the data to be + * sorted correctly on input to the relational expression. + * + *

Each {@link Window.Group} has a set of + * {@link org.apache.calcite.rex.RexOver} objects. + */ +public class IgniteWindow extends Window implements IgniteRel { + /** */ + private final Group grp; + + /** */ + private final boolean streaming; + + /** */ + public IgniteWindow( + RelOptCluster cluster, + RelTraitSet traitSet, + RelNode input, + RelDataType rowType, + Group grp, + boolean streaming + ) { + super(cluster, traitSet, input, ImmutableList.of(), rowType, ImmutableList.of(grp)); + this.grp = grp; + this.streaming = streaming; + assert !grp.aggCalls.isEmpty(); + } + + /** */ + public IgniteWindow(RelInput input) { + // Streaming flag required only on planning phase, and has not affect on execution. + this(input.getCluster(), + changeTraits(input, IgniteConvention.INSTANCE).getTraitSet().plus(input.getCollation()), + input.getInput(), + input.getRowType("rowType"), + ((RelInputEx)input).getWindowGroup("group"), + false); + } + + /** */ + public Group getGroup() { + return grp; + } + + /** */ + public boolean isStreaming() { + return streaming; + } + + /** {@inheritDoc} */ + @Override public RelNode copy(RelTraitSet traitSet, List inputs) { + return new IgniteWindow(getCluster(), traitSet, sole(inputs), getRowType(), grp, streaming); + } + + /** {@inheritDoc} */ + @Override public Window copy(List constants) { + assert constants.isEmpty(); + return this; + } + + /** {@inheritDoc} */ + @Override public T accept(IgniteRelVisitor visitor) { + return visitor.visit(this); + } + + /** {@inheritDoc} */ + @Override public IgniteRel clone(RelOptCluster cluster, List inputs) { + return new IgniteWindow(cluster, getTraitSet(), sole(inputs), getRowType(), grp, streaming); + } + + /** {@inheritDoc} */ + @Override public RelWriter explainTerms(RelWriter pw) { + return pw + .input("input", getInput()) + .item("rowType", getRowType()) + .item("group", grp) + .item("collation", collation()); + } + + /** {@inheritDoc} */ + @Override public Pair> passThroughTraits(RelTraitSet required) { + if (required.getConvention() != IgniteConvention.INSTANCE) + return null; + + if (!satisfiesDistribution(TraitUtils.distribution(required))) + return null; + + RelCollation requiredCollation = TraitUtils.collation(required); + RelCollation relCollation = TraitUtils.collation(traitSet); + if (satisfiesCollationSansGroupFields(relCollation, requiredCollation)) + required = required.replace(adjustGroupFieldsCollation(relCollation, requiredCollation)); + else if (satisfiesCollationSansGroupFields(requiredCollation, relCollation)) + required = required.replace(truncateCollation(requiredCollation)); + else + return null; + + return Pair.of(required, ImmutableList.of(required)); + } + + /** {@inheritDoc} */ + @Override public Pair> deriveTraits(RelTraitSet childTraits, int childId) { + assert childId == 0; + + if (childTraits.getConvention() != IgniteConvention.INSTANCE) + return null; + + RelCollation childCollation = TraitUtils.collation(childTraits); + RelCollation relCollation = TraitUtils.collation(traitSet); + if (satisfiesCollationSansGroupFields(relCollation, childCollation)) + childTraits = childTraits.replace(adjustGroupFieldsCollation(relCollation, childCollation)); + else if (!satisfiesCollationSansGroupFields(childCollation, relCollation)) + return null; + + // If a child node has the appropriate collation but not the required distribution + // (e.g., a randomly distributed table that has the index we need), + // we can use its collation to eliminate extra sorting. + // However, we must replace the distribution with current window one. + if (!satisfiesDistribution(TraitUtils.distribution(childTraits))) + childTraits = childTraits.replace(distribution()); + + return Pair.of(childTraits, ImmutableList.of(childTraits)); + } + + /** {@inheritDoc} */ + @Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { + IgniteCostFactory costFactory = (IgniteCostFactory)planner.getCostFactory(); + + int aggCnt = grp.aggCalls.size(); + + double rowCnt = mq.getRowCount(getInput()); + double cpuCost = rowCnt * ROW_COMPARISON_COST; + double memCost = (getRowType().getFieldCount() * AVERAGE_FIELD_SIZE + aggCnt * AGG_CALL_MEM_COST) * (streaming ? 1.0 : rowCnt); + + RelOptCost cost = costFactory.makeCost(rowCnt, cpuCost, 0, memCost, 0); + + // Distributed processing is more preferable than processing on the single node. + if (TraitUtils.distribution(traitSet).satisfies(IgniteDistributions.single())) + cost = cost.plus(costFactory.makeTinyCost()); + + return cost; + } + + /** Check input distribution satisfies distribution of this window. */ + private boolean satisfiesDistribution(IgniteDistribution required) { + if (required.satisfies(IgniteDistributions.single()) || required.function().correlated()) + return true; + + if (required.getType() == RelDistribution.Type.HASH_DISTRIBUTED) + return grp.keys.contains(ImmutableBitSet.of(required.getKeys())); + + return false; + } + + /** + * Check left collation satisfies right one. + * - Collations field indicies of the right should be a prefix for left collation. + * - Group fields sort direction can be changed to desired collation. + * - Order fields sort direction should be the same as in desired collation. + */ + private boolean satisfiesCollationSansGroupFields(RelCollation left, RelCollation right) { + if (left.satisfies(right)) + return true; + + int leftFldCnt = left.getFieldCollations().size(); + int rightFldCnt = right.getFieldCollations().size(); + if (leftFldCnt < rightFldCnt) + return false; + + int grpKeysSize = grp.keys.cardinality(); + + assert (leftFldCnt >= grpKeysSize && grp.keys.equals(ImmutableBitSet.of(Util.first(left.getKeys(), grpKeysSize)))) + || (rightFldCnt >= grpKeysSize && grp.keys.equals(ImmutableBitSet.of(Util.first(right.getKeys(), grpKeysSize)))); + + // Check group keys (collation field order and direction meaningless). + // Since window collation starts with group keys with 'default' sorting direction, + // desired collation should start with same fields in any order / with any direction. + int rightGrpFldsCnt = Math.min(grpKeysSize, rightFldCnt); + ImmutableBitSet leftGrpFlds = ImmutableBitSet.of(Util.first(left.getKeys(), grpKeysSize)); + ImmutableBitSet rightGrpFlds = ImmutableBitSet.of(Util.first(right.getKeys(), rightGrpFldsCnt)); + if (!leftGrpFlds.contains(rightGrpFlds)) + return false; + else if (grpKeysSize >= rightFldCnt) + // Right collation fields in group keys only. + return true; + + // Check remaining collation (collation field order and direction meaningfull). + List leftFldCollations = Util.skip(left.getFieldCollations(), grpKeysSize); + List rightFldCollations = Util.skip(right.getFieldCollations(), grpKeysSize); + return Util.startsWith(leftFldCollations, rightFldCollations); + } + + /** */ + private RelCollation adjustGroupFieldsCollation(RelCollation relCollation, RelCollation requiredCollation) { + // Current collation satisfies required collation, but group fields in prefix may have invalid field collation. + // So, we should replace it with field collation from required. + List fldCollations = new ArrayList<>(relCollation.getFieldCollations().size()); + + int grpFldCnt = grp.keys.cardinality(); + IntMap currGrpFldCollations = new IntHashMap<>(grpFldCnt); + for (int i = 0; i < grpFldCnt; i++) { + RelFieldCollation grpFldCollation = relCollation.getFieldCollations().get(i); + currGrpFldCollations.put(grpFldCollation.getFieldIndex(), grpFldCollation); + } + + int requiredGrpFldCnt = Math.min(requiredCollation.getFieldCollations().size(), grpFldCnt); + for (int i = 0; i < requiredGrpFldCnt; i++) { + RelFieldCollation requiredGrpFldCollation = requiredCollation.getFieldCollations().get(i); + fldCollations.add(requiredGrpFldCollation); + + assert currGrpFldCollations.containsKey(requiredGrpFldCollation.getFieldIndex()); + currGrpFldCollations.remove(requiredGrpFldCollation.getFieldIndex()); + } + + // Add remaining group fields collation. + fldCollations.addAll(currGrpFldCollations.values()); + + // Add remaining fields collation. + fldCollations.addAll(Util.skip(relCollation.getFieldCollations(), grpFldCnt)); + + return RelCollations.of(fldCollations); + } + + /** */ + private RelCollation truncateCollation(RelCollation requiredCollation) { + // In case of pass through, required collation can use fields outside of input row type. + // So, we should truncate required collation to input row type. + // We do not need any additional range checks, since current collation keys is a prefix to required collation keys. + // Therefore, only additional keys in suffix can be removed here. + List requiredCollationFields = requiredCollation.getFieldCollations(); + for (int i = 0; i < requiredCollationFields.size(); i++) { + if (requiredCollationFields.get(i).getFieldIndex() >= input.getRowType().getFieldCount()) + return RelCollations.of(requiredCollationFields.subList(0, i)); + } + return requiredCollation; + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/HashJoinConverterRule.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/HashJoinConverterRule.java index 1a3cc988085e3..d7b7560c2795b 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/HashJoinConverterRule.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/HashJoinConverterRule.java @@ -24,12 +24,12 @@ import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.PhysicalNode; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.JoinInfo; import org.apache.calcite.rel.logical.LogicalJoin; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.ignite.internal.processors.query.calcite.hint.HintDefinition; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteHashJoin; -import org.apache.ignite.internal.processors.query.calcite.rel.IgniteJoinInfo; /** Hash join converter rule. */ public class HashJoinConverterRule extends AbstractIgniteJoinConverterRule { @@ -45,7 +45,7 @@ private HashJoinConverterRule() { @Override public boolean matchesJoin(RelOptRuleCall call) { LogicalJoin join = call.rel(0); - IgniteJoinInfo joinInfo = IgniteJoinInfo.of(join); + JoinInfo joinInfo = join.analyzeCondition(); return !joinInfo.pairs().isEmpty(); } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/MergeJoinConverterRule.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/MergeJoinConverterRule.java index 68feee9084c8b..4cfa4dc32cbb9 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/MergeJoinConverterRule.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/MergeJoinConverterRule.java @@ -25,11 +25,11 @@ import org.apache.calcite.rel.PhysicalNode; import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.JoinInfo; import org.apache.calcite.rel.logical.LogicalJoin; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.ignite.internal.processors.query.calcite.hint.HintDefinition; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention; -import org.apache.ignite.internal.processors.query.calcite.rel.IgniteJoinInfo; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteMergeJoin; import org.apache.ignite.internal.util.typedef.F; @@ -51,7 +51,7 @@ public MergeJoinConverterRule() { @Override public boolean matchesJoin(RelOptRuleCall call) { LogicalJoin logicalJoin = call.rel(0); - IgniteJoinInfo info = IgniteJoinInfo.of(logicalJoin); + JoinInfo info = logicalJoin.analyzeCondition(); return info.isEqui() && !F.isEmpty(info.pairs()); } @@ -60,7 +60,7 @@ public MergeJoinConverterRule() { @Override protected PhysicalNode convert(RelOptPlanner planner, RelMetadataQuery mq, LogicalJoin rel) { RelOptCluster cluster = rel.getCluster(); - IgniteJoinInfo joinInfo = IgniteJoinInfo.of(rel); + JoinInfo joinInfo = rel.analyzeCondition(); assert joinInfo.isEqui() && !F.isEmpty(joinInfo.pairs()); @@ -73,7 +73,7 @@ public MergeJoinConverterRule() { RelNode left = convert(rel.getLeft(), leftInTraits); RelNode right = convert(rel.getRight(), rightInTraits); - return new IgniteMergeJoin(cluster, outTraits, left, right, rel.getCondition(), joinInfo.allowNulls(), + return new IgniteMergeJoin(cluster, outTraits, left, right, rel.getCondition(), rel.getVariablesSet(), rel.getJoinType()); } } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/WindowConverterRule.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/WindowConverterRule.java new file mode 100644 index 0000000000000..d550d98182595 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/WindowConverterRule.java @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.rule; + +import java.util.ArrayList; +import java.util.List; + +import com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptCluster; +import org.apache.calcite.plan.RelOptPlanner; +import org.apache.calcite.plan.RelOptRule; +import org.apache.calcite.plan.RelTraitSet; +import org.apache.calcite.rel.PhysicalNode; +import org.apache.calcite.rel.RelCollation; +import org.apache.calcite.rel.RelCollations; +import org.apache.calcite.rel.RelFieldCollation; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.logical.LogicalWindow; +import org.apache.calcite.rel.metadata.RelMetadataQuery; +import org.apache.calcite.rel.type.RelRecordType; +import org.apache.calcite.sql.SqlAggFunction; +import org.apache.calcite.util.ImmutableBitSet; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.window.WindowFunctions; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteWindow; +import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions; +import org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils; +import org.apache.ignite.internal.util.typedef.internal.U; + +/** */ +public class WindowConverterRule extends AbstractIgniteConverterRule { + /** */ + public static final RelOptRule INSTANCE = new WindowConverterRule(); + + /** */ + private WindowConverterRule() { + super(LogicalWindow.class, "WindowConverterRule"); + } + + /** {@inheritDoc} */ + @Override protected PhysicalNode convert(RelOptPlanner planner, RelMetadataQuery mq, LogicalWindow window) { + RelOptCluster cluster = window.getCluster(); + + RelNode result = window.getInput(); + + assert window.constants.isEmpty(); + + for (int grpIdx = 0; grpIdx < window.groups.size(); grpIdx++) { + Window.Group grp = window.groups.get(grpIdx); + + RelCollation collation = mergeCollations( + TraitUtils.createCollation(grp.keys.asList()), + grp.collation() + ); + + RelTraitSet inTraits = cluster + .traitSetOf(IgniteConvention.INSTANCE) + .replace(IgniteDistributions.single()) + .replace(collation); + + RelTraitSet outTraits = cluster + .traitSetOf(IgniteConvention.INSTANCE) + .replace(IgniteDistributions.single()) + .replace(collation); + + result = convert(result, inTraits); + + RelRecordType rowType = new RelRecordType(window.getRowType().getFieldList() + .subList(0, result.getRowType().getFieldCount() + grp.aggCalls.size())); + + Window.Group newGrp = replaceAggCallOrdinal(grp); + + result = new IgniteWindow( + window.getCluster(), + window.getTraitSet().merge(outTraits), + result, + rowType, + newGrp, + WindowFunctions.streamable(newGrp) + ); + } + + return (PhysicalNode)result; + } + + /** Replaces origial agg call ordinal with sequential index within group. */ + private static Window.Group replaceAggCallOrdinal(Window.Group grp) { + List newAggCalls = new ArrayList<>(grp.aggCalls.size()); + ImmutableList calls = grp.aggCalls; + for (int i = 0; i < calls.size(); i++) { + Window.RexWinAggCall aggCall = calls.get(i); + Window.RexWinAggCall newCall = new Window.RexWinAggCall( + (SqlAggFunction)aggCall.op, + aggCall.type, + aggCall.operands, + i, + aggCall.distinct, + aggCall.ignoreNulls + ); + newAggCalls.add(newCall); + } + + return new Window.Group( + grp.keys, + grp.isRows, + grp.lowerBound, + grp.upperBound, + grp.exclude, + grp.orderKeys, + newAggCalls + ); + } + + /** + * Merges provided collation is sinle one. + * + * @param collation0 First collation + * @param collation1 Second collation + * @return New collation + */ + public static RelCollation mergeCollations(RelCollation collation0, RelCollation collation1) { + ImmutableBitSet keys = ImmutableBitSet.of(collation0.getKeys()); + List fields = U.arrayList(collation0.getFieldCollations()); + for (RelFieldCollation it : collation1.getFieldCollations()) { + if (!keys.get(it.getFieldIndex())) + fields.add(it); + } + return RelCollations.of(fields); + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/logical/WindowConstantsRule.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/logical/WindowConstantsRule.java new file mode 100644 index 0000000000000..72ceacf96531f --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rule/logical/WindowConstantsRule.java @@ -0,0 +1,297 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.rule.logical; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.plan.RelRule; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.Window.Group; +import org.apache.calcite.rel.core.Window.RexWinAggCall; +import org.apache.calcite.rel.logical.LogicalWindow; +import org.apache.calcite.rel.rules.TransformationRule; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.rel.type.RelDataTypeField; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexInputRef; +import org.apache.calcite.rex.RexLiteral; +import org.apache.calcite.rex.RexNode; +import org.apache.calcite.rex.RexShuttle; +import org.apache.calcite.sql.SqlAggFunction; +import org.apache.calcite.tools.RelBuilder; +import org.apache.ignite.internal.processors.query.calcite.util.Commons; +import org.apache.ignite.internal.util.collection.BitSetIntSet; +import org.immutables.value.Value; + +/** + * A rule to process window rel with constants. + * If window has agg call, which uses constants, then split window to: + * - project with constants; + * - window without constants; + * - project removing constants. + * Overwise just replace input refs in window bounds with constant values, + */ +@Value.Enclosing +public class WindowConstantsRule extends RelRule implements TransformationRule { + /** */ + public static final WindowConstantsRule INSTANCE = new WindowConstantsRule(WindowConstantsRule.Config.DEFAULT); + + /** */ + private WindowConstantsRule(Config cfg) { + super(cfg); + } + + /** */ + @Override public void onMatch(RelOptRuleCall call) { + LogicalWindow window = call.rel(0); + + assert !window.constants.isEmpty(); + + RelNode input = window.getInput(); + + int[] constRefs = collectConstantsFromAggCalls(window); + if (constRefs.length == 0) { + // Agg calls does not use constants, so only group bounds should be processed. + RelNode newWindow = buildWindowWithoutConstants(window, input, input, constRefs); + call.transformTo(newWindow); + } + else { + // Project constants, used in agg calls, replace agg call constant operands with new input refs, + // and remove constants from result. + RelNode projectWithConstants = buildProjectWithConstants(input, window.constants, constRefs); + RelNode newWindow = buildWindowWithoutConstants(window, input, projectWithConstants, constRefs); + RelNode projectWithoutConstants = buildProjectExcludeConstants(window, input, newWindow, constRefs); + + assert window.getRowType().equalsSansFieldNames(projectWithoutConstants.getRowType()); + call.transformTo(projectWithoutConstants); + } + } + + /** Creates projection with window constants. */ + private RelNode buildProjectWithConstants(RelNode input, List consts, int[] constRefs) { + int inputFldCnt = input.getRowType().getFieldCount(); + RelBuilder relBldr = relBuilderFactory.create(input.getCluster(), null); + relBldr.push(input); + for (int idx : constRefs) + relBldr.projectPlus(consts.get(idx - inputFldCnt)); + return relBldr.build(); + } + + /** Creates new window without constants. */ + private RelNode buildWindowWithoutConstants(LogicalWindow window, RelNode input, RelNode newInput, int[] constRefs) { + int windowFldCnt = window.getRowType().getFieldCount(); + int inputFldCnt = input.getRowType().getFieldCount(); + + List newInputFlds = newInput.getRowType().getFieldList(); + List windowFlds = window.getRowType().getFieldList(); + + assert inputFldCnt <= newInputFlds.size(); + + RelDataTypeFactory typeFactory = window.getCluster().getTypeFactory(); + RelDataTypeFactory.Builder builder = typeFactory.builder(); + + for (int i = 0; i < inputFldCnt; i++) { + // Add fields from original input, passed through window rel. + builder.add(windowFlds.get(i)); + } + for (int i = inputFldCnt; i < newInputFlds.size(); i++) { + // Add constants from new input. + builder.add(newInputFlds.get(i)); + } + for (int i = inputFldCnt; i < windowFlds.size(); i++) { + // Add fields, provided by window. + builder.add(windowFlds.get(i)); + } + + RelDataType type = builder.build(); + assert type.getFieldCount() == newInputFlds.size() + (windowFldCnt - inputFldCnt); + + RexShuttle constToInputRefTransform = new ConstantRefToInputRefTransformation(inputFldCnt, constRefs, newInputFlds); + RexShuttle constToValTransform = new ConstantRefToConstantValueTransformation(inputFldCnt, window.getConstants()); + + // Replace input refs to constants: + // - to new input ref in rex agg call; + // - to actual constant value in group bounds, thus it lets reuse calculated frame bound for the same peer. + // Also replaces origial agg call ordinal with sequential index within group. + ImmutableList.Builder newGrps = ImmutableList.builder(); + for (Group grp : window.groups) { + Group newGrp = new Group( + grp.keys, + grp.isRows, + grp.lowerBound.accept(constToValTransform), + grp.upperBound.accept(constToValTransform), + grp.exclude, + grp.orderKeys, + traverseAggregateCalls(grp.aggCalls, constToInputRefTransform) + ); + newGrps.add(newGrp); + } + + // Agg calls in the original window allready reference fields by index, + // do not need to remap it. + return LogicalWindow.create(window.getTraitSet(), newInput, ImmutableList.of(), type, newGrps.build()); + } + + /** Creates projection without window constants. */ + private RelNode buildProjectExcludeConstants(LogicalWindow window, RelNode input, RelNode newWindow, int[] constRefs) { + int inputFldCnt = input.getRowType().getFieldCount(); + int windowFldCnt = window.getRowType().getFieldCount(); + int constantCnt = constRefs.length; + + RexBuilder rexBuilder = window.getCluster().getRexBuilder(); + List projects = new ArrayList<>(windowFldCnt); + for (int i = 0; i < inputFldCnt; i++) + projects.add(rexBuilder.makeInputRef(newWindow, i)); + for (int i = inputFldCnt; i < windowFldCnt; i++) + projects.add(rexBuilder.makeInputRef(newWindow, i + constantCnt)); + + RelBuilder relBldr = relBuilderFactory.create(newWindow.getCluster(), null); + relBldr.push(newWindow); + relBldr.project(projects); + return relBldr.build(); + } + + /** Collects constants, used in aggregates call. Result is sorted array of used constants indicies. */ + private int[] collectConstantsFromAggCalls(LogicalWindow window) { + int inputFldCnt = window.getInput().getRowType().getFieldCount(); + int constantCnt = window.constants.size(); + + ConstantRefCollector collector = new ConstantRefCollector(inputFldCnt, constantCnt); + window.groups.forEach(grp -> + grp.aggCalls.forEach(aggCall -> + aggCall.accept(collector))); + + // BitSetIntSet returns sorted array of contained values due to nature of bit set. + return collector.used.toIntArray(); + } + + /** Replaces {@link RexWinAggCall} operands constant using provided transformation. */ + private ImmutableList traverseAggregateCalls(List aggCalls, RexShuttle visitor) { + ImmutableList.Builder builder = ImmutableList.builderWithExpectedSize(aggCalls.size()); + for (RexWinAggCall call : aggCalls) { + List newOperands = Commons.transform(call.getOperands(), arg -> arg.accept(visitor)); + RexWinAggCall newCall = new RexWinAggCall( + (SqlAggFunction)call.getOperator(), + call.getType(), + newOperands, + call.ordinal, + call.distinct, + call.ignoreNulls + ); + builder.add(newCall); + } + + return builder.build(); + } + + /** Collects constants, used in visited {@link RexNode}. */ + private static final class ConstantRefCollector extends RexShuttle { + /** */ + private final int inputFldCnt; + + /** */ + private final BitSetIntSet used; + + /** */ + ConstantRefCollector(int inputFldCnt, int constantCnt) { + this.inputFldCnt = inputFldCnt; + used = new BitSetIntSet(constantCnt); + } + + /** {@inheritDoc} */ + @Override public RexNode visitInputRef(RexInputRef inputRef) { + int idx = inputRef.getIndex(); + if (idx >= inputFldCnt) + used.add(idx); + return super.visitInputRef(inputRef); + } + } + + /** Replaces constant references to new input fields references. */ + private static final class ConstantRefToInputRefTransformation extends RexShuttle { + /** */ + private final int inputFldCnt; + + /** */ + private final int[] constRefs; + + /** */ + private final List newInputFlds; + + /** */ + ConstantRefToInputRefTransformation(int inputFldCnt, int[] constRefs, List newInputFlds) { + this.inputFldCnt = inputFldCnt; + this.constRefs = constRefs; + this.newInputFlds = newInputFlds; + } + + /** {@inheritDoc} */ + @Override public RexNode visitInputRef(RexInputRef inputRef) { + int idx = inputRef.getIndex(); + if (idx >= inputFldCnt) { + int refIdx = Arrays.binarySearch(constRefs, idx) + inputFldCnt; + assert refIdx >= 0 && refIdx < newInputFlds.size(); + return RexInputRef.of(refIdx, newInputFlds); + } + + return super.visitInputRef(inputRef); + } + } + + /** Replaces constant references to actual const value. */ + private static final class ConstantRefToConstantValueTransformation extends RexShuttle { + /** */ + private final int inputFldCnt; + + /** */ + private final List consts; + + /** */ + ConstantRefToConstantValueTransformation(int inputFldCnt, List consts) { + this.inputFldCnt = inputFldCnt; + this.consts = consts; + } + + /** {@inheritDoc} */ + @Override public RexNode visitInputRef(RexInputRef inputRef) { + int idx = inputRef.getIndex(); + if (idx >= inputFldCnt) + return consts.get(idx - inputFldCnt); + return super.visitInputRef(inputRef); + } + } + + /** Rule configuration. */ + @Value.Immutable + public interface Config extends RelRule.Config { + /** */ + WindowConstantsRule.Config DEFAULT = ImmutableWindowConstantsRule.Config.of() + .withOperandSupplier(b -> b.operand(LogicalWindow.class) + .predicate(it -> !it.constants.isEmpty()) + .anyInputs()); + + /** {@inheritDoc} */ + @Override default WindowConstantsRule toRule() { + return INSTANCE; + } + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/IgniteOwnSqlOperatorTable.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/IgniteOwnSqlOperatorTable.java index b0a43abd2be06..d5a7dd434e332 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/IgniteOwnSqlOperatorTable.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/IgniteOwnSqlOperatorTable.java @@ -16,6 +16,7 @@ */ package org.apache.ignite.internal.processors.query.calcite.sql.fun; +import org.apache.calcite.sql.SqlAggFunction; import org.apache.calcite.sql.SqlFunction; import org.apache.calcite.sql.SqlFunctionCategory; import org.apache.calcite.sql.SqlKind; @@ -155,6 +156,12 @@ public class IgniteOwnSqlOperatorTable extends ReflectiveSqlOperatorTable { OperandTypes.family(SqlTypeFamily.INTEGER, SqlTypeFamily.INTEGER), SqlFunctionCategory.NUMERIC); + /** Lead window funtion */ + public static final SqlAggFunction LEAD = new SqlLeadLagFunction(SqlKind.LEAD); + + /** Lag window funtion */ + public static final SqlAggFunction LAG = new SqlLeadLagFunction(SqlKind.LAG); + /** * Returns the Ignite operator table, creating it if necessary. */ diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/IgniteStdSqlOperatorTable.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/IgniteStdSqlOperatorTable.java index a49e4a161f098..b573a014cb38f 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/IgniteStdSqlOperatorTable.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/IgniteStdSqlOperatorTable.java @@ -75,6 +75,14 @@ public IgniteStdSqlOperatorTable() { register(SqlStdOperatorTable.UNARY_MINUS); register(SqlStdOperatorTable.UNARY_PLUS); + // Checked arithmetic + register(SqlStdOperatorTable.CHECKED_PLUS); + register(SqlStdOperatorTable.CHECKED_MINUS); + register(SqlStdOperatorTable.CHECKED_MULTIPLY); + register(SqlStdOperatorTable.CHECKED_DIVIDE); + register(SqlStdOperatorTable.CHECKED_DIVIDE_INTEGER); + register(SqlStdOperatorTable.CHECKED_UNARY_MINUS); + // Aggregates. register(SqlStdOperatorTable.COUNT); register(SqlStdOperatorTable.SUM); @@ -321,5 +329,16 @@ public IgniteStdSqlOperatorTable() { register(SqlStdOperatorTable.BIT_AND); register(SqlStdOperatorTable.BIT_OR); register(SqlStdOperatorTable.BIT_XOR); + + // Window specific operations + register(SqlStdOperatorTable.ROW_NUMBER); + register(SqlStdOperatorTable.DENSE_RANK); + register(SqlStdOperatorTable.RANK); + register(SqlStdOperatorTable.PERCENT_RANK); + register(SqlStdOperatorTable.CUME_DIST); + register(SqlStdOperatorTable.FIRST_VALUE); + register(SqlStdOperatorTable.LAST_VALUE); + register(SqlStdOperatorTable.NTILE); + register(SqlStdOperatorTable.NTH_VALUE); } } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/SqlLeadLagFunction.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/SqlLeadLagFunction.java new file mode 100644 index 0000000000000..d1a99e239eb1a --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/fun/SqlLeadLagFunction.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.processors.query.calcite.sql.fun; + +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlOperatorBinding; +import org.apache.calcite.sql.fun.SqlLeadLagAggFunction; +import org.apache.calcite.sql.type.SqlTypeTransforms; + +/** {@link SqlLeadLagAggFunction}, with enforced return type nullability. */ +public class SqlLeadLagFunction extends SqlLeadLagAggFunction { + /** */ + SqlLeadLagFunction(SqlKind kind) { + super(kind); + } + + /** {@inheritDoc} */ + @Override public RelDataType inferReturnType(SqlOperatorBinding opBinding) { + return SqlTypeTransforms.FORCE_NULLABLE.transformType(opBinding, super.inferReturnType(opBinding)); + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java index 05d733e02329c..43055c6234e8c 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java @@ -69,7 +69,10 @@ import org.apache.calcite.sql.SqlRowTypeNameSpec; import org.apache.calcite.sql.SqlSampleSpec; import org.apache.calcite.sql.SqlSelect; +import org.apache.calcite.sql.SqlByRewriter; import org.apache.calcite.sql.SqlSelectKeyword; +import org.apache.calcite.sql.SqlStarExclude; +import org.apache.calcite.sql.SqlStarReplace; import org.apache.calcite.sql.SqlSetOption; import org.apache.calcite.sql.SqlSnapshot; import org.apache.calcite.sql.SqlTableRef; @@ -146,6 +149,20 @@ public class IgniteSqlParserImpl extends SqlAbstractParserImpl implements Ignite private Casing quotedCasing; private int identifierMaxLength; private SqlConformance conformance; + private int rowValueStarCount; + + private void pushRowValueStar() { + rowValueStarCount++; + } + + private void popRowValueStar() { + assert rowValueStarCount > 0; + rowValueStarCount--; + } + + private boolean allowRowValueStar() { + return rowValueStarCount > 0; + } /** * {@link SqlParserImplFactory} implementation for creating parser. @@ -633,6 +650,12 @@ final public SqlNode OrderByLimitOpt(SqlNode e) throws ParseException { ; } if (orderBy != null || offsetFetch[0] != null || offsetFetch[1] != null) { + if (orderBy != null + && e instanceof SqlSelect + && ((SqlSelect) e).hasByClause()) { + {if (true) throw SqlUtil.newContextException(orderBy.getParserPosition(), + RESOURCE.selectByCannotWithOrderBy());} + } {if (true) return new SqlOrderBy(getPos(), e, Util.first(orderBy, SqlNodeList.EMPTY), offsetFetch[0], offsetFetch[1]);} @@ -2060,18 +2083,25 @@ final public void AddKeyValueOption(List list) throws ParseException { throw new ParseException(); } jj_consume_token(EQ); - value = StringLiteral(); - list.add(key); - list.add(value); + if (jj_2_151(2)) { + value = StringLiteral(); + } else if (jj_2_152(2)) { + value = SimpleIdentifier(); + } else { + jj_consume_token(-1); + throw new ParseException(); + } + list.add(key); + list.add(value); } /** Parses an option value (either a string or a numeric) and adds to a list. */ final public void AddOptionValue(List list) throws ParseException { final SqlNode value; - if (jj_2_151(2)) { + if (jj_2_153(2)) { value = NumericLiteral(); list.add(value); - } else if (jj_2_152(2)) { + } else if (jj_2_154(2)) { value = StringLiteral(); list.add(value); } else { @@ -2091,7 +2121,7 @@ final public SqlNodeList ParenthesizedLiteralOptionCommaList() throws ParseExcep AddOptionValue(list); label_15: while (true) { - if (jj_2_153(2)) { + if (jj_2_155(2)) { ; } else { break label_15; @@ -2105,21 +2135,23 @@ final public SqlNodeList ParenthesizedLiteralOptionCommaList() throws ParseExcep } final public void AddHint(List hints) throws ParseException { + final Span s; final SqlIdentifier hintName; final SqlNodeList hintOptions; final SqlHint.HintOptionFormat optionFormat; + s = span(); hintName = SimpleIdentifier(); - if (jj_2_155(5)) { + if (jj_2_157(5)) { hintOptions = ParenthesizedKeyValueOptionCommaList(); optionFormat = SqlHint.HintOptionFormat.KV_LIST; - } else if (jj_2_156(3)) { + } else if (jj_2_158(3)) { hintOptions = ParenthesizedSimpleIdentifierList(); optionFormat = SqlHint.HintOptionFormat.ID_LIST; - } else if (jj_2_157(3)) { + } else if (jj_2_159(3)) { hintOptions = ParenthesizedLiteralOptionCommaList(); optionFormat = SqlHint.HintOptionFormat.LITERAL_LIST; } else { - if (jj_2_154(2)) { + if (jj_2_156(2)) { jj_consume_token(LPAREN); jj_consume_token(RPAREN); } else { @@ -2129,7 +2161,7 @@ final public void AddHint(List hints) throws ParseException { optionFormat = SqlHint.HintOptionFormat.EMPTY; } hints.add( - new SqlHint(Span.of(hintOptions).end(this), hintName, hintOptions, + new SqlHint(s.end(this), hintName, hintOptions, optionFormat)); } @@ -2141,7 +2173,7 @@ final public SqlNode TableHints(SqlIdentifier tableName) throws ParseException { AddHint(hints); label_16: while (true) { - if (jj_2_158(2)) { + if (jj_2_160(2)) { ; } else { break label_16; @@ -2170,16 +2202,17 @@ final public SqlSelect SqlSelect() throws ParseException { final SqlNode having; final SqlNodeList windowDecls; final SqlNode qualify; + final SqlNodeList by; final List hints = new ArrayList(); final Span s; jj_consume_token(SELECT); s = span(); - if (jj_2_160(2)) { + if (jj_2_162(2)) { jj_consume_token(HINT_BEG); AddHint(hints); label_17: while (true) { - if (jj_2_159(2)) { + if (jj_2_161(2)) { ; } else { break label_17; @@ -2192,13 +2225,13 @@ final public SqlSelect SqlSelect() throws ParseException { ; } SqlSelectKeywords(keywords); - if (jj_2_161(2)) { + if (jj_2_163(2)) { jj_consume_token(STREAM); keywords.add(SqlSelectKeyword.STREAM.symbol(getPos())); } else { ; } - if (jj_2_162(2)) { + if (jj_2_164(2)) { keyword = AllOrDistinct(); keywords.add(keyword); } else { @@ -2208,7 +2241,7 @@ final public SqlSelect SqlSelect() throws ParseException { AddSelectItem(selectList); label_18: while (true) { - if (jj_2_163(2)) { + if (jj_2_165(2)) { ; } else { break label_18; @@ -2216,30 +2249,31 @@ final public SqlSelect SqlSelect() throws ParseException { jj_consume_token(COMMA); AddSelectItem(selectList); } - if (jj_2_169(2)) { + by = null; + if (jj_2_171(2)) { jj_consume_token(FROM); fromClause = FromClause(); - if (jj_2_164(2)) { + if (jj_2_166(2)) { where = Where(); } else { where = null; } - if (jj_2_165(2)) { + if (jj_2_167(2)) { groupBy = GroupBy(); } else { groupBy = null; } - if (jj_2_166(2)) { + if (jj_2_168(2)) { having = Having(); } else { having = null; } - if (jj_2_167(2)) { + if (jj_2_169(2)) { windowDecls = Window(); } else { windowDecls = null; } - if (jj_2_168(2)) { + if (jj_2_170(2)) { qualify = Qualify(); } else { qualify = null; @@ -2253,10 +2287,12 @@ final public SqlSelect SqlSelect() throws ParseException { windowDecls = null; qualify = null; } - {if (true) return new SqlSelect(s.end(this), keywordList, + final SqlSelect select = new SqlSelect(s.end(this), keywordList, new SqlNodeList(selectList, Span.of(selectList).pos()), fromClause, where, groupBy, having, windowDecls, qualify, - null, null, null, new SqlNodeList(hints, getPos()));} + null, null, null, new SqlNodeList(hints, getPos())); + SqlByRewriter.rewrite(select, by); + {if (true) return select;} throw new Error("Missing return statement in function"); } @@ -2278,21 +2314,21 @@ final public SqlNode SqlExplain() throws ParseException { final SqlExplainFormat format; jj_consume_token(EXPLAIN); jj_consume_token(PLAN); - if (jj_2_170(2)) { + if (jj_2_172(2)) { detailLevel = ExplainDetailLevel(); } else { ; } depth = ExplainDepth(); - if (jj_2_171(2)) { + if (jj_2_173(2)) { jj_consume_token(AS); jj_consume_token(XML); format = SqlExplainFormat.XML; - } else if (jj_2_172(2)) { + } else if (jj_2_174(2)) { jj_consume_token(AS); jj_consume_token(JSON); format = SqlExplainFormat.JSON; - } else if (jj_2_173(2)) { + } else if (jj_2_175(2)) { jj_consume_token(AS); jj_consume_token(DOT_FORMAT); format = SqlExplainFormat.DOT; @@ -2314,15 +2350,15 @@ final public SqlNode SqlExplain() throws ParseException { * or DML statement (INSERT, UPDATE, DELETE, MERGE). */ final public SqlNode SqlQueryOrDml() throws ParseException { SqlNode stmt; - if (jj_2_174(2)) { + if (jj_2_176(2)) { stmt = OrderedQueryOrExpr(ExprContext.ACCEPT_QUERY); - } else if (jj_2_175(2)) { + } else if (jj_2_177(2)) { stmt = SqlInsert(); - } else if (jj_2_176(2)) { + } else if (jj_2_178(2)) { stmt = SqlDelete(); - } else if (jj_2_177(2)) { + } else if (jj_2_179(2)) { stmt = SqlUpdate(); - } else if (jj_2_178(2)) { + } else if (jj_2_180(2)) { stmt = SqlMerge(); } else { jj_consume_token(-1); @@ -2337,15 +2373,15 @@ final public SqlNode SqlQueryOrDml() throws ParseException { * EXPLAIN PLAN. */ final public SqlExplain.Depth ExplainDepth() throws ParseException { - if (jj_2_179(2)) { + if (jj_2_181(2)) { jj_consume_token(WITH); jj_consume_token(TYPE); {if (true) return SqlExplain.Depth.TYPE;} - } else if (jj_2_180(2)) { + } else if (jj_2_182(2)) { jj_consume_token(WITH); jj_consume_token(IMPLEMENTATION); {if (true) return SqlExplain.Depth.PHYSICAL;} - } else if (jj_2_181(2)) { + } else if (jj_2_183(2)) { jj_consume_token(WITHOUT); jj_consume_token(IMPLEMENTATION); {if (true) return SqlExplain.Depth.LOGICAL;} @@ -2360,13 +2396,13 @@ final public SqlExplain.Depth ExplainDepth() throws ParseException { */ final public SqlExplainLevel ExplainDetailLevel() throws ParseException { SqlExplainLevel level = SqlExplainLevel.EXPPLAN_ATTRIBUTES; - if (jj_2_183(2)) { + if (jj_2_185(2)) { jj_consume_token(EXCLUDING); jj_consume_token(ATTRIBUTES); level = SqlExplainLevel.NO_ATTRIBUTES; - } else if (jj_2_184(2)) { + } else if (jj_2_186(2)) { jj_consume_token(INCLUDING); - if (jj_2_182(2)) { + if (jj_2_184(2)) { jj_consume_token(ALL); level = SqlExplainLevel.ALL_ATTRIBUTES; } else { @@ -2393,12 +2429,12 @@ final public SqlNode SqlDescribe() throws ParseException { final SqlNode stmt; jj_consume_token(DESCRIBE); s = span(); - if (jj_2_190(2)) { - if (jj_2_185(2)) { + if (jj_2_192(2)) { + if (jj_2_187(2)) { jj_consume_token(DATABASE); - } else if (jj_2_186(2)) { + } else if (jj_2_188(2)) { jj_consume_token(CATALOG); - } else if (jj_2_187(2)) { + } else if (jj_2_189(2)) { jj_consume_token(SCHEMA); } else { jj_consume_token(-1); @@ -2409,21 +2445,21 @@ final public SqlNode SqlDescribe() throws ParseException { // DESCRIBE SCHEMA but should be different. See // [CALCITE-1221] Implement DESCRIBE DATABASE, CATALOG, STATEMENT {if (true) return new SqlDescribeSchema(s.end(id), id);} - } else if (jj_2_191(2147483647)) { - if (jj_2_188(2)) { + } else if (jj_2_193(2147483647)) { + if (jj_2_190(2)) { jj_consume_token(TABLE); } else { ; } table = CompoundIdentifier(); - if (jj_2_189(2)) { + if (jj_2_191(2)) { column = SimpleIdentifier(); } else { column = null; } {if (true) return new SqlDescribeTable(s.add(table).addIf(column).pos(), table, column);} - } else if (jj_2_192(2)) { + } else if (jj_2_194(2)) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STATEMENT: jj_consume_token(STATEMENT); @@ -2474,11 +2510,11 @@ final public SqlNode NamedRoutineCall(SqlFunctionCategory routineType, name = CompoundIdentifier(); s = span(); jj_consume_token(LPAREN); - if (jj_2_194(2)) { + if (jj_2_196(2)) { AddArg0(list, exprContext); label_19: while (true) { - if (jj_2_193(2)) { + if (jj_2_195(2)) { ; } else { break label_19; @@ -2507,14 +2543,14 @@ final public SqlNode TableParam() throws ParseException { SqlNode tableRef; s = span(); tableRef = ExplicitTable(getPos()); - if (jj_2_195(2)) { + if (jj_2_197(2)) { jj_consume_token(PARTITION); jj_consume_token(BY); partitionList = SimpleIdentifierOrList(); } else { partitionList = SqlNodeList.EMPTY; } - if (jj_2_196(2)) { + if (jj_2_198(2)) { orderList = OrderByOfSetSemanticsTable(); } else { orderList = SqlNodeList.EMPTY; @@ -2536,14 +2572,14 @@ final public SqlNode PartitionedByAndOrderBy(SqlNode e) throws ParseException { final SqlNodeList partitionList; final SqlNodeList orderList; s = span(); - if (jj_2_197(2)) { + if (jj_2_199(2)) { jj_consume_token(PARTITION); jj_consume_token(BY); partitionList = SimpleIdentifierOrList(); } else { partitionList = SqlNodeList.EMPTY; } - if (jj_2_198(2)) { + if (jj_2_200(2)) { orderList = OrderByOfSetSemanticsTable(); } else { orderList = SqlNodeList.EMPTY; @@ -2558,12 +2594,12 @@ final public SqlNodeList OrderByOfSetSemanticsTable() throws ParseException { jj_consume_token(ORDER); s = span(); jj_consume_token(BY); - if (jj_2_200(2)) { + if (jj_2_202(2)) { jj_consume_token(LPAREN); AddOrderItem(list); label_20: while (true) { - if (jj_2_199(2)) { + if (jj_2_201(2)) { ; } else { break label_20; @@ -2573,7 +2609,7 @@ final public SqlNodeList OrderByOfSetSemanticsTable() throws ParseException { } jj_consume_token(RPAREN); {if (true) return new SqlNodeList(list, s.addAll(list).pos());} - } else if (jj_2_201(2)) { + } else if (jj_2_203(2)) { AddOrderItem(list); {if (true) return new SqlNodeList(list, s.addAll(list).pos());} } else { @@ -2608,9 +2644,9 @@ final public SqlNode SqlInsert() throws ParseException { final SqlNodeList columnList; final Span s; final Pair p; - if (jj_2_202(2)) { + if (jj_2_204(2)) { jj_consume_token(INSERT); - } else if (jj_2_203(2)) { + } else if (jj_2_205(2)) { jj_consume_token(UPSERT); keywords.add(SqlInsertKeyword.UPSERT.symbol(getPos())); } else { @@ -2622,17 +2658,17 @@ final public SqlNode SqlInsert() throws ParseException { keywordList = new SqlNodeList(keywords, s.addAll(keywords).pos()); jj_consume_token(INTO); tableName = CompoundTableIdentifier(); - if (jj_2_204(2)) { + if (jj_2_206(2)) { tableRef = TableHints(tableName); } else { tableRef = tableName; } - if (jj_2_205(5)) { + if (jj_2_207(5)) { tableRef = ExtendTable(tableRef); } else { ; } - if (jj_2_206(2)) { + if (jj_2_208(2)) { p = ParenthesizedCompoundIdentifierList(); if (!p.right.isEmpty()) { tableRef = extend(tableRef, p.right); @@ -2672,18 +2708,18 @@ final public SqlNode SqlDelete() throws ParseException { s = span(); jj_consume_token(FROM); tableName = CompoundTableIdentifier(); - if (jj_2_207(2)) { + if (jj_2_209(2)) { tableRef = TableHints(tableName); } else { tableRef = tableName; } - if (jj_2_208(2)) { + if (jj_2_210(2)) { tableRef = ExtendTable(tableRef); } else { ; } - if (jj_2_210(2)) { - if (jj_2_209(2)) { + if (jj_2_212(2)) { + if (jj_2_211(2)) { jj_consume_token(AS); } else { ; @@ -2692,7 +2728,7 @@ final public SqlNode SqlDelete() throws ParseException { } else { alias = null; } - if (jj_2_211(2)) { + if (jj_2_213(2)) { where = Where(); } else { where = null; @@ -2719,18 +2755,18 @@ final public SqlNode SqlUpdate() throws ParseException { targetColumnList = new SqlNodeList(s.pos()); sourceExpressionList = new SqlNodeList(s.pos()); tableName = CompoundTableIdentifier(); - if (jj_2_212(2)) { + if (jj_2_214(2)) { tableRef = TableHints(tableName); } else { tableRef = tableName; } - if (jj_2_213(2)) { + if (jj_2_215(2)) { tableRef = ExtendTable(tableRef); } else { ; } - if (jj_2_215(2)) { - if (jj_2_214(2)) { + if (jj_2_217(2)) { + if (jj_2_216(2)) { jj_consume_token(AS); } else { ; @@ -2746,7 +2782,7 @@ final public SqlNode SqlUpdate() throws ParseException { AddExpression(sourceExpressionList, ExprContext.ACCEPT_SUB_QUERY); label_21: while (true) { - if (jj_2_216(2)) { + if (jj_2_218(2)) { ; } else { break label_21; @@ -2757,7 +2793,7 @@ final public SqlNode SqlUpdate() throws ParseException { jj_consume_token(EQ); AddExpression(sourceExpressionList, ExprContext.ACCEPT_SUB_QUERY); } - if (jj_2_217(2)) { + if (jj_2_219(2)) { where = Where(); } else { where = null; @@ -2785,18 +2821,18 @@ final public SqlNode SqlMerge() throws ParseException { s = span(); jj_consume_token(INTO); tableName = CompoundTableIdentifier(); - if (jj_2_218(2)) { + if (jj_2_220(2)) { tableRef = TableHints(tableName); } else { tableRef = tableName; } - if (jj_2_219(2)) { + if (jj_2_221(2)) { tableRef = ExtendTable(tableRef); } else { ; } - if (jj_2_221(2)) { - if (jj_2_220(2)) { + if (jj_2_223(2)) { + if (jj_2_222(2)) { jj_consume_token(AS); } else { ; @@ -2809,14 +2845,14 @@ final public SqlNode SqlMerge() throws ParseException { sourceTableRef = TableRef(); jj_consume_token(ON); condition = Expression(ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_223(2)) { + if (jj_2_225(2)) { updateCall = WhenMatchedClause(tableRef, alias); - if (jj_2_222(2)) { + if (jj_2_224(2)) { insertCall = WhenNotMatchedClause(tableRef); } else { insertCall = null; } - } else if (jj_2_224(2)) { + } else if (jj_2_226(2)) { updateCall = null; insertCall = WhenNotMatchedClause(tableRef); } else { @@ -2846,7 +2882,7 @@ final public SqlUpdate WhenMatchedClause(SqlNode table, SqlIdentifier alias) thr AddExpression(updateExprList, ExprContext.ACCEPT_SUB_QUERY); label_22: while (true) { - if (jj_2_225(2)) { + if (jj_2_227(2)) { ; } else { break label_22; @@ -2877,18 +2913,18 @@ final public SqlInsert WhenNotMatchedClause(SqlNode table) throws ParseException insertSpan = span(); SqlInsertKeywords(keywords); keywordList = new SqlNodeList(keywords, insertSpan.end(this)); - if (jj_2_226(2)) { + if (jj_2_228(2)) { insertColumnList = ParenthesizedSimpleIdentifierList(); } else { insertColumnList = null; } - if (jj_2_227(2)) { + if (jj_2_229(2)) { jj_consume_token(LPAREN); jj_consume_token(VALUES); valuesSpan = span(); rowConstructor = RowConstructor(); jj_consume_token(RPAREN); - } else if (jj_2_228(2)) { + } else if (jj_2_230(2)) { jj_consume_token(VALUES); valuesSpan = span(); rowConstructor = RowConstructor(); @@ -2913,10 +2949,10 @@ final public void AddSelectItem(List list) throws ParseException { SqlNode e; final SqlIdentifier id; e = SelectExpression(); - if (jj_2_232(2)) { - if (jj_2_230(2)) { + if (jj_2_234(2)) { + if (jj_2_232(2)) { jj_consume_token(AS); - if (jj_2_229(2)) { + if (jj_2_231(2)) { jj_consume_token(MEASURE); e = SqlInternalOperators.MEASURE.createCall( e.getParserPosition(), e); @@ -2926,7 +2962,7 @@ final public void AddSelectItem(List list) throws ParseException { } else { ; } - if (jj_2_231(2)) { + if (jj_2_233(2)) { id = SimpleIdentifier(); } else { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -2950,10 +2986,10 @@ final public void AddSelectItem(List list) throws ParseException { */ final public SqlNode SelectExpression() throws ParseException { SqlNode e; - if (jj_2_233(2)) { + if (jj_2_235(2)) { jj_consume_token(STAR); {if (true) return SqlIdentifier.star(getPos());} - } else if (jj_2_234(2)) { + } else if (jj_2_236(2)) { e = Expression(ExprContext.ACCEPT_SUB_QUERY); {if (true) return e;} } else { @@ -2964,7 +3000,7 @@ final public SqlNode SelectExpression() throws ParseException { } final public SqlLiteral Natural() throws ParseException { - if (jj_2_235(2)) { + if (jj_2_237(2)) { jj_consume_token(NATURAL); {if (true) return SqlLiteral.createBoolean(true, getPos());} } else { @@ -2976,23 +3012,23 @@ final public SqlLiteral Natural() throws ParseException { final public SqlLiteral JoinType() throws ParseException { JoinType joinType; boolean asof = false; - if (jj_2_241(2)) { + if (jj_2_243(2)) { jj_consume_token(JOIN); joinType = JoinType.INNER; - } else if (jj_2_242(2)) { + } else if (jj_2_244(2)) { jj_consume_token(INNER); jj_consume_token(JOIN); joinType = JoinType.INNER; - } else if (jj_2_243(2)) { + } else if (jj_2_245(2)) { jj_consume_token(ASOF); jj_consume_token(JOIN); joinType = JoinType.ASOF; - } else if (jj_2_244(2)) { + } else if (jj_2_246(2)) { jj_consume_token(LEFT); - if (jj_2_238(2)) { - if (jj_2_236(2)) { + if (jj_2_240(2)) { + if (jj_2_238(2)) { jj_consume_token(OUTER); - } else if (jj_2_237(2)) { + } else if (jj_2_239(2)) { jj_consume_token(ASOF); asof = true; } else { @@ -3004,25 +3040,25 @@ final public SqlLiteral JoinType() throws ParseException { } jj_consume_token(JOIN); joinType = asof ? JoinType.LEFT_ASOF : JoinType.LEFT; - } else if (jj_2_245(2)) { + } else if (jj_2_247(2)) { jj_consume_token(RIGHT); - if (jj_2_239(2)) { + if (jj_2_241(2)) { jj_consume_token(OUTER); } else { ; } jj_consume_token(JOIN); joinType = JoinType.RIGHT; - } else if (jj_2_246(2)) { + } else if (jj_2_248(2)) { jj_consume_token(FULL); - if (jj_2_240(2)) { + if (jj_2_242(2)) { jj_consume_token(OUTER); } else { ; } jj_consume_token(JOIN); joinType = JoinType.FULL; - } else if (jj_2_247(2)) { + } else if (jj_2_249(2)) { jj_consume_token(CROSS); jj_consume_token(JOIN); joinType = JoinType.CROSS; @@ -3073,7 +3109,7 @@ final public SqlNode FromClause() throws ParseException { final public SqlNode JoinOrCommaTable(SqlNode e) throws ParseException { SqlNode e2; SqlLiteral joinType; - if (jj_2_248(2)) { + if (jj_2_250(2)) { jj_consume_token(COMMA); joinType = JoinType.COMMA.symbol(getPos()); e2 = TableRef1(ExprContext.ACCEPT_QUERY_OR_JOIN); @@ -3084,7 +3120,7 @@ final public SqlNode JoinOrCommaTable(SqlNode e) throws ParseException { e2, JoinConditionType.NONE.symbol(SqlParserPos.ZERO), null);} - } else if (jj_2_249(2)) { + } else if (jj_2_251(2)) { e2 = JoinTable(e); {if (true) return e2;} } else { @@ -3099,12 +3135,12 @@ final public SqlNode JoinTable(SqlNode e) throws ParseException { SqlNode e2, condition, matchCondition = null; final SqlLiteral natural, joinType, on, using; SqlNodeList list; - if (jj_2_253(4)) { + if (jj_2_255(4)) { natural = Natural(); joinType = JoinType(); e2 = TableRef1(ExprContext.ACCEPT_QUERY_OR_JOIN); - if (jj_2_251(2)) { - if (jj_2_250(2)) { + if (jj_2_253(2)) { + if (jj_2_252(2)) { jj_consume_token(MATCH_CONDITION); matchCondition = Expression(ExprContext.ACCEPT_SUB_QUERY); } else { @@ -3138,7 +3174,7 @@ final public SqlNode JoinTable(SqlNode e) throws ParseException { e2, on, condition);} - } else if (jj_2_252(2)) { + } else if (jj_2_254(2)) { jj_consume_token(USING); using = JoinConditionType.USING.symbol(getPos()); list = ParenthesizedSimpleIdentifierList(); @@ -3158,7 +3194,7 @@ final public SqlNode JoinTable(SqlNode e) throws ParseException { JoinConditionType.NONE.symbol(joinType.getParserPosition()), null);} } - } else if (jj_2_254(2)) { + } else if (jj_2_256(2)) { jj_consume_token(CROSS); joinType = JoinType.CROSS.symbol(getPos()); jj_consume_token(APPLY); @@ -3173,7 +3209,7 @@ final public SqlNode JoinTable(SqlNode e) throws ParseException { e2, JoinConditionType.NONE.symbol(SqlParserPos.ZERO), null);} - } else if (jj_2_255(2)) { + } else if (jj_2_257(2)) { jj_consume_token(OUTER); joinType = JoinType.LEFT.symbol(getPos()); jj_consume_token(APPLY); @@ -3231,36 +3267,36 @@ final public SqlNode TableRef3(ExprContext exprContext, boolean lateral) throws SqlNodeList args; final SqlNodeList columnAliasList; SqlUnnestOperator unnestOp = SqlStdOperatorTable.UNNEST; - if (jj_2_266(2)) { + if (jj_2_268(2)) { tableName = CompoundTableIdentifier(); s = span(); - if (jj_2_260(3)) { + if (jj_2_262(3)) { tableRef = ImplicitTableFunctionCallArgs(tableName); } else { - if (jj_2_256(2)) { + if (jj_2_258(2)) { tableRef = TableHints(tableName); } else { tableRef = tableName; } - if (jj_2_257(2)) { + if (jj_2_259(2)) { tableRef = ExtendTable(tableRef); } else { ; } tableRef = Over(tableRef); - if (jj_2_258(2)) { + if (jj_2_260(2)) { tableRef = Snapshot(tableRef); } else { ; } - if (jj_2_259(2)) { + if (jj_2_261(3)) { tableRef = MatchRecognize(tableRef); } else { ; } } - } else if (jj_2_267(2)) { - if (jj_2_261(2)) { + } else if (jj_2_269(2)) { + if (jj_2_263(2)) { jj_consume_token(LATERAL); lateral = true; } else { @@ -3269,13 +3305,13 @@ final public SqlNode TableRef3(ExprContext exprContext, boolean lateral) throws tableRef = ParenthesizedExpression(exprContext); tableRef = Over(tableRef); tableRef = addLateral(tableRef, lateral); - if (jj_2_262(2)) { + if (jj_2_264(3)) { tableRef = MatchRecognize(tableRef); } else { ; } - } else if (jj_2_268(2)) { - if (jj_2_263(2)) { + } else if (jj_2_270(2)) { + if (jj_2_265(2)) { jj_consume_token(LATERAL); } else { ; @@ -3283,7 +3319,7 @@ final public SqlNode TableRef3(ExprContext exprContext, boolean lateral) throws jj_consume_token(UNNEST); s = span(); args = ParenthesizedQueryOrCommaList(ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_264(2)) { + if (jj_2_266(2)) { jj_consume_token(WITH); jj_consume_token(ORDINALITY); unnestOp = SqlStdOperatorTable.UNNEST_WITH_ORDINALITY; @@ -3291,8 +3327,8 @@ final public SqlNode TableRef3(ExprContext exprContext, boolean lateral) throws ; } tableRef = unnestOp.createCall(s.end(this), (List) args); - } else if (jj_2_269(2)) { - if (jj_2_265(2)) { + } else if (jj_2_271(2)) { + if (jj_2_267(2)) { jj_consume_token(LATERAL); lateral = true; } else { @@ -3300,30 +3336,30 @@ final public SqlNode TableRef3(ExprContext exprContext, boolean lateral) throws } tableRef = TableFunctionCall(); tableRef = addLateral(tableRef, lateral); - } else if (jj_2_270(2)) { + } else if (jj_2_272(2)) { tableRef = ExtendedTableRef(); } else { jj_consume_token(-1); throw new ParseException(); } - if (jj_2_271(2)) { + if (jj_2_273(2)) { tableRef = Pivot(tableRef); } else { ; } - if (jj_2_272(2)) { + if (jj_2_274(2)) { tableRef = Unpivot(tableRef); } else { ; } - if (jj_2_275(2)) { - if (jj_2_273(2)) { + if (jj_2_277(2)) { + if (jj_2_275(2)) { jj_consume_token(AS); } else { ; } alias = SimpleIdentifier(); - if (jj_2_274(2)) { + if (jj_2_276(2)) { columnAliasList = ParenthesizedSimpleIdentifierList(); } else { columnAliasList = null; @@ -3348,7 +3384,7 @@ final public SqlNode TableRef3(ExprContext exprContext, boolean lateral) throws } else { ; } - if (jj_2_276(2)) { + if (jj_2_278(2)) { tableRef = Tablesample(tableRef); } else { ; @@ -3366,7 +3402,7 @@ final public SqlNode Tablesample(SqlNode tableRef) throws ParseException { int repeatableSeed = 0; jj_consume_token(TABLESAMPLE); s = span(); checkNotJoin(tableRef); - if (jj_2_280(2)) { + if (jj_2_282(2)) { jj_consume_token(SUBSTITUTE); jj_consume_token(LPAREN); sample = StringLiteral(); @@ -3378,11 +3414,11 @@ final public SqlNode Tablesample(SqlNode tableRef) throws ParseException { SqlLiteral.createSample(sampleSpec, s.end(this)); {if (true) return SqlStdOperatorTable.TABLESAMPLE.createCall( s.add(tableRef).end(this), tableRef, sampleLiteral);} - } else if (jj_2_281(2)) { - if (jj_2_277(2)) { + } else if (jj_2_283(2)) { + if (jj_2_279(2)) { jj_consume_token(BERNOULLI); isBernoulli = true; - } else if (jj_2_278(2)) { + } else if (jj_2_280(2)) { jj_consume_token(SYSTEM); isBernoulli = false; } else { @@ -3392,7 +3428,7 @@ final public SqlNode Tablesample(SqlNode tableRef) throws ParseException { jj_consume_token(LPAREN); samplePercentage = UnsignedNumericLiteral(); jj_consume_token(RPAREN); - if (jj_2_279(2)) { + if (jj_2_281(2)) { jj_consume_token(REPEATABLE); jj_consume_token(LPAREN); repeatableSeed = IntLiteral(); @@ -3423,7 +3459,7 @@ final public SqlNode Tablesample(SqlNode tableRef) throws ParseException { * is present. */ final public SqlNode ExtendTable(SqlNode tableRef) throws ParseException { final SqlNodeList extendList; - if (jj_2_282(2)) { + if (jj_2_284(2)) { jj_consume_token(EXTEND); } else { ; @@ -3441,7 +3477,7 @@ final public SqlNodeList ExtendList() throws ParseException { AddColumnType(list); label_24: while (true) { - if (jj_2_283(2)) { + if (jj_2_285(2)) { ; } else { break label_24; @@ -3473,7 +3509,7 @@ final public void AddCompoundIdentifierType(List list, List ex final SqlDataTypeSpec type; final boolean nullable; name = CompoundIdentifier(); - if (jj_2_284(2)) { + if (jj_2_286(2)) { type = DataType(); nullable = NotNullOpt(); } else { @@ -3496,11 +3532,11 @@ final public SqlNode ImplicitTableFunctionCallArgs(SqlIdentifier name) throws Pa final Span s; s = span(); jj_consume_token(LPAREN); - if (jj_2_286(2)) { + if (jj_2_288(2)) { AddArg0(tableFuncArgs, ExprContext.ACCEPT_CURSOR); label_25: while (true) { - if (jj_2_285(2)) { + if (jj_2_287(2)) { ; } else { break label_25; @@ -3530,7 +3566,7 @@ final public SqlNode TableFunctionCall() throws ParseException { jj_consume_token(TABLE); s = span(); jj_consume_token(LPAREN); - if (jj_2_287(2)) { + if (jj_2_289(2)) { jj_consume_token(SPECIFIC); funcType = SqlFunctionCategory.USER_DEFINED_TABLE_SPECIFIC_FUNCTION; } else { @@ -3576,10 +3612,10 @@ final public SqlNode ExplicitTable(SqlParserPos pos) throws ParseException { final public SqlNode TableConstructor() throws ParseException { final List list = new ArrayList(); final Span s; - if (jj_2_288(2)) { + if (jj_2_290(2)) { jj_consume_token(VALUES); s = span(); - } else if (jj_2_289(2)) { + } else if (jj_2_291(2)) { jj_consume_token(VALUE); s = span(); if (!this.conformance.isValueAllowed()) { @@ -3592,7 +3628,7 @@ final public SqlNode TableConstructor() throws ParseException { AddRowConstructor(list); label_26: while (true) { - if (jj_2_290(2)) { + if (jj_2_292(2)) { ; } else { break label_26; @@ -3618,22 +3654,22 @@ final public SqlNode RowConstructor() throws ParseException { final SqlNodeList valueList; final SqlNode value; final Span s; - if (jj_2_292(3)) { + if (jj_2_294(3)) { jj_consume_token(LPAREN); s = span(); jj_consume_token(ROW); valueList = ParenthesizedQueryOrCommaListWithDefault(ExprContext.ACCEPT_NONCURSOR); jj_consume_token(RPAREN); s.add(this); - } else if (jj_2_293(3)) { - if (jj_2_291(2)) { + } else if (jj_2_295(3)) { + if (jj_2_293(2)) { jj_consume_token(ROW); s = span(); } else { s = Span.of(); } valueList = ParenthesizedQueryOrCommaListWithDefault(ExprContext.ACCEPT_NONCURSOR); - } else if (jj_2_294(2)) { + } else if (jj_2_296(2)) { value = Expression(ExprContext.ACCEPT_NONCURSOR); // NOTE: A bare value here is standard SQL syntax, believe it or // not. Taken together with multi-row table constructors, it leads @@ -3673,10 +3709,10 @@ final public SqlNodeList GroupBy() throws ParseException { jj_consume_token(GROUP); s = span(); jj_consume_token(BY); - if (jj_2_295(2)) { + if (jj_2_297(2)) { jj_consume_token(DISTINCT); distinct = true; - } else if (jj_2_296(2)) { + } else if (jj_2_298(2)) { jj_consume_token(ALL); distinct = false; } else { @@ -3697,7 +3733,7 @@ final public List GroupingElementList() throws ParseException { AddGroupingElement(list); label_27: while (true) { - if (jj_2_297(2)) { + if (jj_2_299(2)) { ; } else { break label_27; @@ -3713,7 +3749,7 @@ final public void AddGroupingElement(List list) throws ParseException { final List subList; final SqlNodeList nodes; final Span s; - if (jj_2_298(2)) { + if (jj_2_300(2)) { jj_consume_token(GROUPING); s = span(); jj_consume_token(SETS); @@ -3722,7 +3758,7 @@ final public void AddGroupingElement(List list) throws ParseException { jj_consume_token(RPAREN); list.add( SqlStdOperatorTable.GROUPING_SETS.createCall(s.end(this), subList)); - } else if (jj_2_299(2)) { + } else if (jj_2_301(2)) { jj_consume_token(ROLLUP); s = span(); jj_consume_token(LPAREN); @@ -3730,7 +3766,7 @@ final public void AddGroupingElement(List list) throws ParseException { jj_consume_token(RPAREN); list.add( SqlStdOperatorTable.ROLLUP.createCall(s.end(this), nodes.getList())); - } else if (jj_2_300(2)) { + } else if (jj_2_302(2)) { jj_consume_token(CUBE); s = span(); jj_consume_token(LPAREN); @@ -3738,12 +3774,12 @@ final public void AddGroupingElement(List list) throws ParseException { jj_consume_token(RPAREN); list.add( SqlStdOperatorTable.CUBE.createCall(s.end(this), nodes.getList())); - } else if (jj_2_301(3)) { + } else if (jj_2_303(3)) { jj_consume_token(LPAREN); s = span(); jj_consume_token(RPAREN); list.add(new SqlNodeList(s.end(this))); - } else if (jj_2_302(2)) { + } else if (jj_2_304(2)) { AddExpression(list, ExprContext.ACCEPT_SUB_QUERY); } else { jj_consume_token(-1); @@ -3770,7 +3806,7 @@ final public void AddExpressions(List list, ExprContext exprContext) th AddExpression(list, exprContext); label_28: while (true) { - if (jj_2_303(2)) { + if (jj_2_305(2)) { ; } else { break label_28; @@ -3798,7 +3834,7 @@ final public SqlNodeList Window() throws ParseException { AddWindowSpec(list); label_29: while (true) { - if (jj_2_304(2)) { + if (jj_2_306(2)) { ; } else { break label_29; @@ -3834,12 +3870,12 @@ final public SqlWindow WindowSpecification() throws ParseException { final SqlLiteral allowPartial; jj_consume_token(LPAREN); s = span(); - if (jj_2_305(2)) { + if (jj_2_307(2)) { id = SimpleIdentifier(); } else { id = null; } - if (jj_2_306(2)) { + if (jj_2_308(2)) { jj_consume_token(PARTITION); s1 = span(); jj_consume_token(BY); @@ -3847,28 +3883,28 @@ final public SqlWindow WindowSpecification() throws ParseException { } else { partitionList = SqlNodeList.EMPTY; } - if (jj_2_307(2)) { + if (jj_2_309(2)) { orderList = OrderBy(true); } else { orderList = SqlNodeList.EMPTY; } - if (jj_2_312(2)) { - if (jj_2_308(2)) { + if (jj_2_314(2)) { + if (jj_2_310(2)) { jj_consume_token(ROWS); isRows = SqlLiteral.createBoolean(true, getPos()); - } else if (jj_2_309(2)) { + } else if (jj_2_311(2)) { jj_consume_token(RANGE); isRows = SqlLiteral.createBoolean(false, getPos()); } else { jj_consume_token(-1); throw new ParseException(); } - if (jj_2_310(2)) { + if (jj_2_312(2)) { jj_consume_token(BETWEEN); lowerBound = WindowRange(); jj_consume_token(AND); upperBound = WindowRange(); - } else if (jj_2_311(2)) { + } else if (jj_2_313(2)) { lowerBound = WindowRange(); upperBound = null; } else { @@ -3881,12 +3917,12 @@ final public SqlWindow WindowSpecification() throws ParseException { exclude = SqlWindow.createExcludeNoOthers(getPos()); lowerBound = upperBound = null; } - if (jj_2_313(2)) { + if (jj_2_315(2)) { jj_consume_token(ALLOW); s2 = span(); jj_consume_token(PARTIAL); allowPartial = SqlLiteral.createBoolean(true, s2.end(this)); - } else if (jj_2_314(2)) { + } else if (jj_2_316(2)) { jj_consume_token(DISALLOW); s2 = span(); jj_consume_token(PARTIAL); @@ -3903,30 +3939,30 @@ final public SqlWindow WindowSpecification() throws ParseException { final public SqlNode WindowRange() throws ParseException { final SqlNode e; final Span s; - if (jj_2_319(2)) { + if (jj_2_321(2)) { jj_consume_token(CURRENT); s = span(); jj_consume_token(ROW); {if (true) return SqlWindow.createCurrentRow(s.end(this));} - } else if (jj_2_320(2)) { + } else if (jj_2_322(2)) { jj_consume_token(UNBOUNDED); s = span(); - if (jj_2_315(2)) { + if (jj_2_317(2)) { jj_consume_token(PRECEDING); {if (true) return SqlWindow.createUnboundedPreceding(s.end(this));} - } else if (jj_2_316(2)) { + } else if (jj_2_318(2)) { jj_consume_token(FOLLOWING); {if (true) return SqlWindow.createUnboundedFollowing(s.end(this));} } else { jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_321(2)) { + } else if (jj_2_323(2)) { e = Expression(ExprContext.ACCEPT_NON_QUERY); - if (jj_2_317(2)) { + if (jj_2_319(2)) { jj_consume_token(PRECEDING); {if (true) return SqlWindow.createPreceding(e, getPos());} - } else if (jj_2_318(2)) { + } else if (jj_2_320(2)) { jj_consume_token(FOLLOWING); {if (true) return SqlWindow.createFollowing(e, getPos());} } else { @@ -3942,20 +3978,20 @@ final public SqlNode WindowRange() throws ParseException { /** Parses an exclusion clause for WINDOW FRAME. */ final public SqlLiteral WindowExclusion() throws ParseException { - if (jj_2_326(2)) { + if (jj_2_328(2)) { jj_consume_token(EXCLUDE); - if (jj_2_322(2)) { + if (jj_2_324(2)) { jj_consume_token(CURRENT); jj_consume_token(ROW); {if (true) return SqlWindow.createExcludeCurrentRow(getPos());} - } else if (jj_2_323(2)) { + } else if (jj_2_325(2)) { jj_consume_token(NO); jj_consume_token(OTHERS); {if (true) return SqlWindow.createExcludeNoOthers(getPos());} - } else if (jj_2_324(2)) { + } else if (jj_2_326(2)) { jj_consume_token(GROUP); {if (true) return SqlWindow.createExcludeGroup(getPos());} - } else if (jj_2_325(2)) { + } else if (jj_2_327(2)) { jj_consume_token(TIES); {if (true) return SqlWindow.createExcludeTies(getPos());} } else { @@ -3992,10 +4028,19 @@ final public SqlNodeList OrderBy(boolean accept) throws ParseException { {if (true) throw SqlUtil.newContextException(s.pos(), RESOURCE.illegalOrderBy());} } jj_consume_token(BY); + OrderItemList(list); + {if (true) return new SqlNodeList(list, s.addAll(list).pos());} + throw new Error("Missing return statement in function"); + } + +/** + * Parses a list of ORDER BY items. + */ + final public void OrderItemList(List list) throws ParseException { AddOrderItem(list); label_30: while (true) { - if (jj_2_327(2)) { + if (jj_2_329(2)) { ; } else { break label_30; @@ -4003,8 +4048,6 @@ final public SqlNodeList OrderBy(boolean accept) throws ParseException { jj_consume_token(COMMA); AddOrderItem(list); } - {if (true) return new SqlNodeList(list, s.addAll(list).pos());} - throw new Error("Missing return statement in function"); } /** @@ -4012,11 +4055,31 @@ final public SqlNodeList OrderBy(boolean accept) throws ParseException { */ final public void AddOrderItem(List list) throws ParseException { SqlNode e; + final SqlIdentifier id; e = Expression(ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_330(2)) { - if (jj_2_328(2)) { + if (jj_2_331(2)) { + jj_consume_token(AS); + if (jj_2_330(2)) { + id = SimpleIdentifier(); + } else { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case QUOTED_STRING: + id = SimpleIdentifierFromStringLiteral(); + break; + default: + jj_la1[3] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + e = SqlStdOperatorTable.AS.createCall(span().end(e), e, id); + } else { + ; + } + if (jj_2_334(2)) { + if (jj_2_332(2)) { jj_consume_token(ASC); - } else if (jj_2_329(2)) { + } else if (jj_2_333(2)) { jj_consume_token(DESC); e = SqlStdOperatorTable.DESC.createCall(getPos(), e); } else { @@ -4026,12 +4089,12 @@ final public void AddOrderItem(List list) throws ParseException { } else { ; } - if (jj_2_333(2)) { - if (jj_2_331(2)) { + if (jj_2_337(2)) { + if (jj_2_335(2)) { jj_consume_token(NULLS); jj_consume_token(FIRST); e = SqlStdOperatorTable.NULLS_FIRST.createCall(getPos(), e); - } else if (jj_2_332(2)) { + } else if (jj_2_336(2)) { jj_consume_token(NULLS); jj_consume_token(LAST); e = SqlStdOperatorTable.NULLS_LAST.createCall(getPos(), e); @@ -4105,7 +4168,7 @@ final public SqlNode Pivot(SqlNode tableRef) throws ParseException { AddPivotAgg(aggList); label_31: while (true) { - if (jj_2_334(2)) { + if (jj_2_338(2)) { ; } else { break label_31; @@ -4118,11 +4181,11 @@ final public SqlNode Pivot(SqlNode tableRef) throws ParseException { jj_consume_token(IN); jj_consume_token(LPAREN); s2 = span(); - if (jj_2_336(2)) { + if (jj_2_340(2)) { AddPivotValue(valueList); label_32: while (true) { - if (jj_2_335(2)) { + if (jj_2_339(2)) { ; } else { break label_32; @@ -4147,7 +4210,7 @@ final public void AddPivotAgg(List list) throws ParseException { final SqlIdentifier alias; e = NamedFunctionCall(); if (getToken(1).kind != COMMA && getToken(1).kind != FOR) { - if (jj_2_337(2)) { + if (jj_2_341(2)) { jj_consume_token(AS); } else { ; @@ -4167,8 +4230,8 @@ final public void AddPivotValue(List list) throws ParseException { final SqlIdentifier alias; e = RowConstructor(); tuple = SqlParserUtil.stripRow(e); - if (jj_2_339(2)) { - if (jj_2_338(2)) { + if (jj_2_343(2)) { + if (jj_2_342(2)) { jj_consume_token(AS); } else { ; @@ -4193,11 +4256,11 @@ final public SqlNode Unpivot(SqlNode tableRef) throws ParseException { final SqlNodeList inList; jj_consume_token(UNPIVOT); s = span(); checkNotJoin(tableRef); - if (jj_2_340(2)) { + if (jj_2_344(2)) { jj_consume_token(INCLUDE); jj_consume_token(NULLS); includeNulls = true; - } else if (jj_2_341(2)) { + } else if (jj_2_345(2)) { jj_consume_token(EXCLUDE); jj_consume_token(NULLS); includeNulls = false; @@ -4214,7 +4277,7 @@ final public SqlNode Unpivot(SqlNode tableRef) throws ParseException { AddUnpivotValue(values); label_33: while (true) { - if (jj_2_342(2)) { + if (jj_2_346(2)) { ; } else { break label_33; @@ -4234,7 +4297,7 @@ final public void AddUnpivotValue(List list) throws ParseException { final SqlNodeList columnList; final SqlNode values; columnList = SimpleIdentifierOrList(); - if (jj_2_343(2)) { + if (jj_2_347(2)) { jj_consume_token(AS); values = RowConstructor(); final SqlNodeList valueList = SqlParserUtil.stripRow(values); @@ -4251,6 +4314,7 @@ final public void AddUnpivotValue(List list) throws ParseException { */ final public SqlMatchRecognize MatchRecognize(SqlNode tableRef) throws ParseException { final Span s, s0, s1, s2; + final SqlIdentifier aliasBeforeMatch; final SqlNodeList measureList; final SqlNodeList partitionList; final SqlNodeList orderList; @@ -4263,10 +4327,18 @@ final public SqlMatchRecognize MatchRecognize(SqlNode tableRef) throws ParseExce final SqlNodeList subsetList; final SqlLiteral isStrictStarts; final SqlLiteral isStrictEnds; + if (jj_2_348(2)) { + jj_consume_token(AS); + aliasBeforeMatch = SimpleIdentifier(); + tableRef = SqlStdOperatorTable.AS.createCall( + Span.of(tableRef).end(this), tableRef, aliasBeforeMatch); + } else { + ; + } jj_consume_token(MATCH_RECOGNIZE); s = span(); checkNotJoin(tableRef); jj_consume_token(LPAREN); - if (jj_2_344(2)) { + if (jj_2_349(2)) { jj_consume_token(PARTITION); s2 = span(); jj_consume_token(BY); @@ -4274,25 +4346,25 @@ final public SqlMatchRecognize MatchRecognize(SqlNode tableRef) throws ParseExce } else { partitionList = SqlNodeList.EMPTY; } - if (jj_2_345(2)) { + if (jj_2_350(2)) { orderList = OrderBy(true); } else { orderList = SqlNodeList.EMPTY; } - if (jj_2_346(2)) { + if (jj_2_351(2)) { jj_consume_token(MEASURES); measureList = MeasureColumnCommaList(span()); } else { measureList = SqlNodeList.EMPTY; } - if (jj_2_347(2)) { + if (jj_2_352(2)) { jj_consume_token(ONE); s0 = span(); jj_consume_token(ROW); jj_consume_token(PER); jj_consume_token(MATCH); rowsPerMatch = SqlMatchRecognize.RowsPerMatchOption.ONE_ROW.symbol(s0.end(this)); - } else if (jj_2_348(2)) { + } else if (jj_2_353(2)) { jj_consume_token(ALL); s0 = span(); jj_consume_token(ROWS); @@ -4302,25 +4374,25 @@ final public SqlMatchRecognize MatchRecognize(SqlNode tableRef) throws ParseExce } else { rowsPerMatch = null; } - if (jj_2_354(2)) { + if (jj_2_359(2)) { jj_consume_token(AFTER); s1 = span(); jj_consume_token(MATCH); jj_consume_token(SKIP_); - if (jj_2_352(2)) { + if (jj_2_357(2)) { jj_consume_token(TO); - if (jj_2_350(2)) { + if (jj_2_355(2)) { jj_consume_token(NEXT); jj_consume_token(ROW); after = SqlMatchRecognize.AfterOption.SKIP_TO_NEXT_ROW .symbol(s1.end(this)); - } else if (jj_2_351(2)) { + } else if (jj_2_356(2)) { jj_consume_token(FIRST); var = SimpleIdentifier(); after = SqlMatchRecognize.SKIP_TO_FIRST.createCall( s1.end(var), var); } else if (true) { - if (jj_2_349(2)) { + if (jj_2_354(2)) { jj_consume_token(LAST); } else { ; @@ -4332,7 +4404,7 @@ final public SqlMatchRecognize MatchRecognize(SqlNode tableRef) throws ParseExce jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_353(2)) { + } else if (jj_2_358(2)) { jj_consume_token(PAST); jj_consume_token(LAST); jj_consume_token(ROW); @@ -4347,27 +4419,27 @@ final public SqlMatchRecognize MatchRecognize(SqlNode tableRef) throws ParseExce } jj_consume_token(PATTERN); jj_consume_token(LPAREN); - if (jj_2_355(2)) { + if (jj_2_360(2)) { jj_consume_token(CARET); isStrictStarts = SqlLiteral.createBoolean(true, getPos()); } else { isStrictStarts = SqlLiteral.createBoolean(false, getPos()); } pattern = PatternExpression(); - if (jj_2_356(2)) { + if (jj_2_361(2)) { jj_consume_token(DOLLAR); isStrictEnds = SqlLiteral.createBoolean(true, getPos()); } else { isStrictEnds = SqlLiteral.createBoolean(false, getPos()); } jj_consume_token(RPAREN); - if (jj_2_357(2)) { + if (jj_2_362(2)) { jj_consume_token(WITHIN); interval = IntervalLiteral(); } else { interval = null; } - if (jj_2_358(2)) { + if (jj_2_363(2)) { jj_consume_token(SUBSET); subsetList = SubsetDefinitionCommaList(span()); } else { @@ -4387,7 +4459,7 @@ final public SqlNodeList MeasureColumnCommaList(Span s) throws ParseException { AddMeasureColumn(list); label_34: while (true) { - if (jj_2_359(2)) { + if (jj_2_364(2)) { ; } else { break label_34; @@ -4414,7 +4486,7 @@ final public SqlNode PatternExpression() throws ParseException { left = PatternTerm(); label_35: while (true) { - if (jj_2_360(2)) { + if (jj_2_365(2)) { ; } else { break label_35; @@ -4434,7 +4506,7 @@ final public SqlNode PatternTerm() throws ParseException { left = PatternFactor(); label_36: while (true) { - if (jj_2_361(2)) { + if (jj_2_366(2)) { ; } else { break label_36; @@ -4459,25 +4531,25 @@ final public SqlNode PatternFactor() throws ParseException { case HOOK: case PLUS: case STAR: - if (jj_2_367(2)) { + if (jj_2_372(2)) { jj_consume_token(STAR); startNum = LITERAL_ZERO; endNum = LITERAL_MINUS_ONE; - } else if (jj_2_368(2)) { + } else if (jj_2_373(2)) { jj_consume_token(PLUS); startNum = LITERAL_ONE; endNum = LITERAL_MINUS_ONE; - } else if (jj_2_369(2)) { + } else if (jj_2_374(2)) { jj_consume_token(HOOK); startNum = LITERAL_ZERO; endNum = LITERAL_ONE; - } else if (jj_2_370(2)) { + } else if (jj_2_375(2)) { jj_consume_token(LBRACE); - if (jj_2_364(2)) { + if (jj_2_369(2)) { startNum = UnsignedNumericLiteral(); - if (jj_2_363(2)) { + if (jj_2_368(2)) { jj_consume_token(COMMA); - if (jj_2_362(2)) { + if (jj_2_367(2)) { endNum = UnsignedNumericLiteral(); } else { endNum = LITERAL_MINUS_ONE; @@ -4486,12 +4558,12 @@ final public SqlNode PatternFactor() throws ParseException { endNum = startNum; } jj_consume_token(RBRACE); - } else if (jj_2_365(2)) { + } else if (jj_2_370(2)) { jj_consume_token(COMMA); endNum = UnsignedNumericLiteral(); jj_consume_token(RBRACE); startNum = LITERAL_MINUS_ONE; - } else if (jj_2_366(2)) { + } else if (jj_2_371(2)) { jj_consume_token(MINUS); extra = PatternExpression(); jj_consume_token(MINUS); @@ -4508,7 +4580,7 @@ final public SqlNode PatternFactor() throws ParseException { jj_consume_token(-1); throw new ParseException(); } - if (jj_2_371(2)) { + if (jj_2_376(2)) { jj_consume_token(HOOK); reluctant = SqlLiteral.createBoolean( startNum.intValue(true) != endNum.intValue(true), @@ -4518,7 +4590,7 @@ final public SqlNode PatternFactor() throws ParseException { } break; default: - jj_la1[3] = jj_gen; + jj_la1[4] = jj_gen; {if (true) return e;} } {if (true) return SqlStdOperatorTable.PATTERN_QUANTIFIER.createCall( @@ -4530,15 +4602,15 @@ final public SqlNode PatternPrimary() throws ParseException { final Span s; SqlNode e; final List list; - if (jj_2_373(2)) { + if (jj_2_378(2)) { e = SimpleIdentifier(); {if (true) return e;} - } else if (jj_2_374(2)) { + } else if (jj_2_379(2)) { jj_consume_token(LPAREN); e = PatternExpression(); jj_consume_token(RPAREN); {if (true) return e;} - } else if (jj_2_375(2)) { + } else if (jj_2_380(2)) { jj_consume_token(LBRACE); s = span(); jj_consume_token(MINUS); @@ -4546,7 +4618,7 @@ final public SqlNode PatternPrimary() throws ParseException { jj_consume_token(MINUS); jj_consume_token(RBRACE); {if (true) return SqlStdOperatorTable.PATTERN_EXCLUDE.createCall(s.end(this), e);} - } else if (jj_2_376(2)) { + } else if (jj_2_381(2)) { jj_consume_token(PERMUTE); s = span(); list = new ArrayList(); jj_consume_token(LPAREN); @@ -4554,7 +4626,7 @@ final public SqlNode PatternPrimary() throws ParseException { list.add(e); label_37: while (true) { - if (jj_2_372(2)) { + if (jj_2_377(2)) { ; } else { break label_37; @@ -4578,7 +4650,7 @@ final public SqlNodeList SubsetDefinitionCommaList(Span s) throws ParseException AddSubsetDefinition(list); label_38: while (true) { - if (jj_2_377(2)) { + if (jj_2_382(2)) { ; } else { break label_38; @@ -4610,7 +4682,7 @@ final public SqlNodeList PatternDefinitionCommaList(Span s) throws ParseExceptio eList.add(e); label_39: while (true) { - if (jj_2_378(2)) { + if (jj_2_383(2)) { ; } else { break label_39; @@ -4672,7 +4744,7 @@ final public SqlNode QueryOrExpr(ExprContext exprContext) throws ParseException SqlNodeList withList = null; final SqlNode e; final List list = new ArrayList(); - if (jj_2_379(2)) { + if (jj_2_384(2)) { withList = WithList(); } else { ; @@ -4681,7 +4753,7 @@ final public SqlNode QueryOrExpr(ExprContext exprContext) throws ParseException list.add(e); label_40: while (true) { - if (jj_2_380(2)) { + if (jj_2_385(2)) { ; } else { break label_40; @@ -4696,16 +4768,20 @@ final public SqlNode Query(ExprContext exprContext) throws ParseException { SqlNodeList withList = null; final SqlNode e; final List list = new ArrayList(); - if (jj_2_381(2)) { + if (jj_2_386(2)) { withList = WithList(); + e = LeafQueryOrExpr(exprContext); + list.add(e); + } else if (jj_2_387(2)) { + e = LeafQuery(exprContext); + list.add(e); } else { - ; + jj_consume_token(-1); + throw new ParseException(); } - e = LeafQuery(exprContext); - list.add(e); label_41: while (true) { - if (jj_2_382(2)) { + if (jj_2_388(2)) { ; } else { break label_41; @@ -4771,7 +4847,7 @@ final public SqlNodeList WithList() throws ParseException { final List list = new ArrayList(); boolean recursive = false; jj_consume_token(WITH); - if (jj_2_383(2)) { + if (jj_2_389(2)) { jj_consume_token(RECURSIVE); recursive = true; } else { @@ -4781,7 +4857,7 @@ final public SqlNodeList WithList() throws ParseException { AddWithItem(list, SqlLiteral.createBoolean(recursive, getPos())); label_42: while (true) { - if (jj_2_384(2)) { + if (jj_2_390(2)) { ; } else { break label_42; @@ -4798,7 +4874,7 @@ final public void AddWithItem(List list, SqlLiteral recursive) thro final SqlNodeList columnList; final SqlNode definition; id = SimpleIdentifier(); - if (jj_2_385(2)) { + if (jj_2_391(2)) { columnList = ParenthesizedSimpleIdentifierList(); } else { columnList = null; @@ -4814,10 +4890,10 @@ final public void AddWithItem(List list, SqlLiteral recursive) thro */ final public SqlNode LeafQueryOrExpr(ExprContext exprContext) throws ParseException { SqlNode e; - if (jj_2_386(2)) { + if (jj_2_392(2)) { e = LeafQuery(exprContext); {if (true) return e;} - } else if (jj_2_387(2)) { + } else if (jj_2_393(2)) { e = Expression(exprContext); {if (true) return e;} } else { @@ -4844,11 +4920,92 @@ final public SqlNode Expression(ExprContext exprContext) throws ParseException { throw new Error("Missing return statement in function"); } +/** Adds an optional trailing colon path to the expression under + * construction, for example {@code :field.nested}, {@code :['field']} or + * {@code :item[1].price}. Dot-separated path segments are parsed as simple + * identifiers, but unquoted segment spelling is preserved for case-sensitive + * variant key lookup. Bracketed segments are literals (string for exact key + * access, integer for array index); arbitrary expressions are not allowed. */ + final public void AddOptionalColonPath(List list) throws ParseException { + SqlParserPos colonPos; + List segments; + Span s; + SqlIdentifier p; + if (jj_2_399(2) && (this.conformance.isColonFieldAccessAllowed())) { + jj_consume_token(COLON); + colonPos = getPos(); + segments = new ArrayList(); + s = span(); + if (jj_2_394(2)) { + p = SimpleIdentifier(); + segments.add(p.getParserPosition().isQuoted() + ? p + : new SqlIdentifier(getToken(0).image, p.getParserPosition())); + } else if (jj_2_395(2)) { + ColonBracketSegment(segments); + } else { + jj_consume_token(-1); + throw new ParseException(); + } + label_43: + while (true) { + if (jj_2_396(2)) { + ; + } else { + break label_43; + } + if (jj_2_397(2)) { + jj_consume_token(DOT); + p = SimpleIdentifier(); + segments.add(p.getParserPosition().isQuoted() + ? p + : new SqlIdentifier(getToken(0).image, p.getParserPosition())); + } else if (jj_2_398(2)) { + ColonBracketSegment(segments); + } else { + jj_consume_token(-1); + throw new ParseException(); + } + } + list.add( + new SqlParserUtil.ToTreeListItem( + SqlStdOperatorTable.COLON, colonPos)); + list.add(new SqlNodeList(segments, s.end(this))); + } else { + ; + } + } + +/** Parses one bracketed segment of a colon path: {@code ['field']} for key + * access, or {@code [n]} for array index. */ + final public void ColonBracketSegment(List segments) throws ParseException { + SqlNode lit; + SqlIdentifier id; + jj_consume_token(LBRACKET); + if (jj_2_400(2)) { + lit = StringLiteral(); + segments.add(lit); + } else if (jj_2_401(2)) { + jj_consume_token(UNSIGNED_INTEGER_LITERAL); + segments.add(SqlLiteral.createExactNumeric(token.image, getPos())); + } else if (jj_2_402(2147483647)) { + id = SimpleIdentifier(); + {if (true) throw SqlUtil.newContextException(id.getParserPosition(), + RESOURCE.unknownIdentifier(id.toString()));} + } else { + jj_consume_token(-1); + throw new ParseException(); + } + jj_consume_token(RBRACKET); + } + +/** Parses an expression atom with its dot-access chain and at most one + * trailing colon path. */ final public void AddExpression2b(List list, ExprContext exprContext) throws ParseException { SqlNode e; SqlOperator op; SqlNode ext; - label_43: + label_44: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EXISTS: @@ -4859,8 +5016,8 @@ final public void AddExpression2b(List list, ExprContext exprContext) th ; break; default: - jj_la1[4] = jj_gen; - break label_43; + jj_la1[5] = jj_gen; + break label_44; } op = PrefixRowOperator(); checkNonQueryExpression(exprContext); @@ -4868,12 +5025,12 @@ final public void AddExpression2b(List list, ExprContext exprContext) th } e = Expression3(exprContext); list.add(e); - label_44: + label_45: while (true) { - if (jj_2_388(2)) { + if (jj_2_403(2)) { ; } else { - break label_44; + break label_45; } jj_consume_token(DOT); ext = RowExpressionExtension(); @@ -4882,6 +5039,7 @@ final public void AddExpression2b(List list, ExprContext exprContext) th SqlStdOperatorTable.DOT, getPos())); list.add(ext); } + AddOptionalColonPath(list); } /** @@ -4909,28 +5067,28 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep SqlIdentifier p; final Span s = span(); AddExpression2b(list, exprContext); - if (jj_2_432(2)) { - label_45: + if (jj_2_447(2)) { + label_46: while (true) { - if (jj_2_424(2)) { + if (jj_2_439(2)) { checkNonQueryExpression(exprContext); - if (jj_2_392(2)) { + if (jj_2_407(2)) { jj_consume_token(NOT); jj_consume_token(IN); op = SqlStdOperatorTable.NOT_IN; - } else if (jj_2_393(2)) { + } else if (jj_2_408(2)) { jj_consume_token(IN); op = SqlStdOperatorTable.IN; - } else if (jj_2_394(2)) { + } else if (jj_2_409(2)) { final SqlKind k; k = comp(); - if (jj_2_389(2)) { + if (jj_2_404(2)) { jj_consume_token(SOME); op = SqlStdOperatorTable.some(k); - } else if (jj_2_390(2)) { + } else if (jj_2_405(2)) { jj_consume_token(ANY); op = SqlStdOperatorTable.some(k); - } else if (jj_2_391(2)) { + } else if (jj_2_406(2)) { jj_consume_token(ALL); op = SqlStdOperatorTable.all(k); } else { @@ -4956,18 +5114,18 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep } else { list.add(nodeList); } - } else if (jj_2_425(2)) { + } else if (jj_2_440(2)) { checkNonQueryExpression(exprContext); - if (jj_2_401(2)) { + if (jj_2_416(2)) { jj_consume_token(NOT); jj_consume_token(BETWEEN); op = SqlStdOperatorTable.NOT_BETWEEN; s.clear().add(this); - if (jj_2_397(2)) { - if (jj_2_395(2)) { + if (jj_2_412(2)) { + if (jj_2_410(2)) { jj_consume_token(SYMMETRIC); op = SqlStdOperatorTable.SYMMETRIC_NOT_BETWEEN; - } else if (jj_2_396(2)) { + } else if (jj_2_411(2)) { jj_consume_token(ASYMMETRIC); } else { jj_consume_token(-1); @@ -4976,15 +5134,15 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep } else { ; } - } else if (jj_2_402(2)) { + } else if (jj_2_417(2)) { jj_consume_token(BETWEEN); op = SqlStdOperatorTable.BETWEEN; s.clear().add(this); - if (jj_2_400(2)) { - if (jj_2_398(2)) { + if (jj_2_415(2)) { + if (jj_2_413(2)) { jj_consume_token(SYMMETRIC); op = SqlStdOperatorTable.SYMMETRIC_BETWEEN; - } else if (jj_2_399(2)) { + } else if (jj_2_414(2)) { jj_consume_token(ASYMMETRIC); } else { jj_consume_token(-1); @@ -5001,22 +5159,22 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep list.add(new SqlParserUtil.ToTreeListItem(op, s.pos())); list.addAll(list3); list3.clear(); - } else if (jj_2_426(2)) { + } else if (jj_2_441(2)) { checkNonQueryExpression(exprContext); s.clear().add(this); - if (jj_2_414(2)) { - if (jj_2_407(2)) { + if (jj_2_429(2)) { + if (jj_2_422(2)) { jj_consume_token(NOT); - if (jj_2_403(2)) { + if (jj_2_418(2)) { jj_consume_token(LIKE); op = SqlStdOperatorTable.NOT_LIKE; - } else if (jj_2_404(2)) { + } else if (jj_2_419(2)) { jj_consume_token(ILIKE); op = SqlLibraryOperators.NOT_ILIKE; - } else if (jj_2_405(2)) { + } else if (jj_2_420(2)) { jj_consume_token(RLIKE); op = SqlLibraryOperators.NOT_RLIKE; - } else if (jj_2_406(2)) { + } else if (jj_2_421(2)) { jj_consume_token(SIMILAR); jj_consume_token(TO); op = SqlStdOperatorTable.NOT_SIMILAR_TO; @@ -5024,16 +5182,16 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_408(2)) { + } else if (jj_2_423(2)) { jj_consume_token(LIKE); op = SqlStdOperatorTable.LIKE; - } else if (jj_2_409(2)) { + } else if (jj_2_424(2)) { jj_consume_token(ILIKE); op = SqlLibraryOperators.ILIKE; - } else if (jj_2_410(2)) { + } else if (jj_2_425(2)) { jj_consume_token(RLIKE); op = SqlLibraryOperators.RLIKE; - } else if (jj_2_411(2)) { + } else if (jj_2_426(2)) { jj_consume_token(SIMILAR); jj_consume_token(TO); op = SqlStdOperatorTable.SIMILAR_TO; @@ -5041,20 +5199,20 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_415(2)) { + } else if (jj_2_430(2)) { jj_consume_token(NEGATE); jj_consume_token(TILDE); op = SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE; - if (jj_2_412(2)) { + if (jj_2_427(2)) { jj_consume_token(STAR); op = SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE; } else { ; } - } else if (jj_2_416(2)) { + } else if (jj_2_431(2)) { jj_consume_token(TILDE); op = SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE; - if (jj_2_413(2)) { + if (jj_2_428(2)) { jj_consume_token(STAR); op = SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE; } else { @@ -5067,7 +5225,7 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep list2 = Expression2(ExprContext.ACCEPT_SUB_QUERY); list.add(new SqlParserUtil.ToTreeListItem(op, s.pos())); list.addAll(list2); - if (jj_2_417(2)) { + if (jj_2_432(2)) { jj_consume_token(ESCAPE); e = Expression3(ExprContext.ACCEPT_SUB_QUERY); s.clear().add(this); @@ -5078,40 +5236,40 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep } else { ; } - } else if (jj_2_427(2)) { + } else if (jj_2_442(2)) { InfixCast(list, exprContext, s); - } else if (jj_2_428(3)) { + } else if (jj_2_443(3)) { op = BinaryRowOperator(); checkNonQueryExpression(exprContext); list.add(new SqlParserUtil.ToTreeListItem(op, getPos())); AddExpression2b(list, ExprContext.ACCEPT_SUB_QUERY); - } else if (jj_2_429(2)) { + } else if (jj_2_444(2)) { jj_consume_token(LBRACKET); - if (jj_2_418(2)) { + if (jj_2_433(2)) { jj_consume_token(OFFSET); itemOp = SqlLibraryOperators.OFFSET; jj_consume_token(LPAREN); e = Expression(ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(RPAREN); - } else if (jj_2_419(2)) { + } else if (jj_2_434(2)) { jj_consume_token(ORDINAL); itemOp = SqlLibraryOperators.ORDINAL; jj_consume_token(LPAREN); e = Expression(ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(RPAREN); - } else if (jj_2_420(2)) { + } else if (jj_2_435(2)) { jj_consume_token(SAFE_OFFSET); itemOp = SqlLibraryOperators.SAFE_OFFSET; jj_consume_token(LPAREN); e = Expression(ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(RPAREN); - } else if (jj_2_421(2)) { + } else if (jj_2_436(2)) { jj_consume_token(SAFE_ORDINAL); itemOp = SqlLibraryOperators.SAFE_ORDINAL; jj_consume_token(LPAREN); e = Expression(ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(RPAREN); - } else if (jj_2_422(2)) { + } else if (jj_2_437(2)) { itemOp = SqlStdOperatorTable.ITEM; e = Expression(ExprContext.ACCEPT_SUB_QUERY); } else { @@ -5123,12 +5281,12 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep new SqlParserUtil.ToTreeListItem( itemOp, getPos())); list.add(e); - label_46: + label_47: while (true) { - if (jj_2_423(2)) { + if (jj_2_438(2)) { ; } else { - break label_46; + break label_47; } jj_consume_token(DOT); p = SimpleIdentifier(); @@ -5137,7 +5295,8 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep SqlStdOperatorTable.DOT, getPos())); list.add(p); } - } else if (jj_2_430(2)) { + AddOptionalColonPath(list); + } else if (jj_2_445(2)) { checkNonQueryExpression(exprContext); op = PostfixRowOperator(); list.add(new SqlParserUtil.ToTreeListItem(op, getPos())); @@ -5145,10 +5304,10 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep jj_consume_token(-1); throw new ParseException(); } - if (jj_2_431(2)) { + if (jj_2_446(2)) { ; } else { - break label_45; + break label_46; } } {if (true) return list;} @@ -5160,25 +5319,25 @@ final public List Expression2(ExprContext exprContext) throws ParseExcep /** Parses a comparison operator inside a SOME / ALL predicate. */ final public SqlKind comp() throws ParseException { - if (jj_2_433(2)) { + if (jj_2_448(2)) { jj_consume_token(LT); {if (true) return SqlKind.LESS_THAN;} - } else if (jj_2_434(2)) { + } else if (jj_2_449(2)) { jj_consume_token(LE); {if (true) return SqlKind.LESS_THAN_OR_EQUAL;} - } else if (jj_2_435(2)) { + } else if (jj_2_450(2)) { jj_consume_token(GT); {if (true) return SqlKind.GREATER_THAN;} - } else if (jj_2_436(2)) { + } else if (jj_2_451(2)) { jj_consume_token(GE); {if (true) return SqlKind.GREATER_THAN_OR_EQUAL;} - } else if (jj_2_437(2)) { + } else if (jj_2_452(2)) { jj_consume_token(EQ); {if (true) return SqlKind.EQUALS;} - } else if (jj_2_438(2)) { + } else if (jj_2_453(2)) { jj_consume_token(NE); {if (true) return SqlKind.NOT_EQUALS;} - } else if (jj_2_439(2)) { + } else if (jj_2_454(2)) { jj_consume_token(NE2); if (!this.conformance.isBangEqualAllowed()) { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.bangEqualNotAllowed());} @@ -5201,39 +5360,50 @@ final public SqlNode Expression3(ExprContext exprContext) throws ParseException final SqlNodeList list1; final Span s; final Span rowSpan; - if (jj_2_442(2)) { + if (jj_2_457(2)) { e = AtomicRowExpression(); checkNonQueryExpression(exprContext); {if (true) return e;} - } else if (jj_2_443(2)) { + } else if (jj_2_458(2)) { e = CursorExpression(exprContext); {if (true) return e;} - } else if (jj_2_444(3)) { + } else if (jj_2_459(3)) { jj_consume_token(ROW); s = span(); + pushRowValueStar(); list = ParenthesizedQueryOrCommaList(exprContext); - if (exprContext != ExprContext.ACCEPT_ALL - && exprContext != ExprContext.ACCEPT_CURSOR - && !this.conformance.allowExplicitRowValueConstructor()) - { - {if (true) throw SqlUtil.newContextException(s.end(list), - RESOURCE.illegalRowExpression());} + try { + if (exprContext != ExprContext.ACCEPT_ALL + && exprContext != ExprContext.ACCEPT_CURSOR + && !this.conformance.allowExplicitRowValueConstructor()) + { + {if (true) throw SqlUtil.newContextException(s.end(list), + RESOURCE.illegalRowExpression());} + } + {if (true) return SqlStdOperatorTable.ROW.createCall(list);} + } finally { + popRowValueStar(); } - {if (true) return SqlStdOperatorTable.ROW.createCall(list);} - } else if (jj_2_445(2)) { - if (jj_2_440(2)) { + } else if (jj_2_460(2)) { + if (jj_2_455(2)) { jj_consume_token(ROW); - rowSpan = span(); + rowSpan = span(); pushRowValueStar(); } else { rowSpan = null; } list1 = ParenthesizedQueryOrCommaList(exprContext); - if (rowSpan != null) { - // interpret as row constructor - {if (true) return SqlStdOperatorTable.ROW.createCall(rowSpan.end(list1), - (List) list1);} + try { + if (rowSpan != null) { + // interpret as row constructor + {if (true) return SqlStdOperatorTable.ROW.createCall(rowSpan.end(list1), + (List) list1);} + } + } finally { + if (rowSpan != null) { + popRowValueStar(); + } } - if (jj_2_441(2)) { + if (jj_2_456(2)) { e = IntervalQualifier(); if ((list1.size() == 1) && list1.get(0) instanceof SqlCall) @@ -5291,11 +5461,11 @@ final public SqlNode LambdaExpression() throws ParseException { */ final public SqlNodeList SimpleIdentifierOrListOrEmpty() throws ParseException { SqlNodeList list; - if (jj_2_446(2)) { + if (jj_2_461(2)) { jj_consume_token(LPAREN); jj_consume_token(RPAREN); {if (true) return SqlNodeList.EMPTY;} - } else if (jj_2_447(2)) { + } else if (jj_2_462(2)) { list = SimpleIdentifierOrList(); {if (true) return list;} } else { @@ -5306,24 +5476,24 @@ final public SqlNodeList SimpleIdentifierOrListOrEmpty() throws ParseException { } final public SqlOperator periodOperator() throws ParseException { - if (jj_2_448(2)) { + if (jj_2_463(2)) { jj_consume_token(OVERLAPS); {if (true) return SqlStdOperatorTable.OVERLAPS;} - } else if (jj_2_449(2)) { + } else if (jj_2_464(2)) { jj_consume_token(IMMEDIATELY); jj_consume_token(PRECEDES); {if (true) return SqlStdOperatorTable.IMMEDIATELY_PRECEDES;} - } else if (jj_2_450(2)) { + } else if (jj_2_465(2)) { jj_consume_token(PRECEDES); {if (true) return SqlStdOperatorTable.PRECEDES;} - } else if (jj_2_451(2)) { + } else if (jj_2_466(2)) { jj_consume_token(IMMEDIATELY); jj_consume_token(SUCCEEDS); {if (true) return SqlStdOperatorTable.IMMEDIATELY_SUCCEEDS;} - } else if (jj_2_452(2)) { + } else if (jj_2_467(2)) { jj_consume_token(SUCCEEDS); {if (true) return SqlStdOperatorTable.SUCCEEDS;} - } else if (jj_2_453(2)) { + } else if (jj_2_468(2)) { jj_consume_token(EQUALS); {if (true) return SqlStdOperatorTable.PERIOD_EQUALS;} } else { @@ -5349,9 +5519,9 @@ final public SqlCollation CollateClause() throws ParseException { */ final public SqlNode UnsignedNumericLiteralOrParam() throws ParseException { final SqlNode e; - if (jj_2_454(2)) { + if (jj_2_469(2)) { e = UnsignedNumericLiteral(); - } else if (jj_2_455(2)) { + } else if (jj_2_470(2)) { e = DynamicParam(); } else { jj_consume_token(-1); @@ -5372,20 +5542,20 @@ final public SqlNode RowExpressionExtension() throws ParseException { final List args; final SqlLiteral quantifier; p = SimpleIdentifier(); - if (jj_2_459(2147483647)) { + if (jj_2_474(2147483647)) { s = span(); - if (jj_2_456(2)) { + if (jj_2_471(2)) { jj_consume_token(LPAREN); jj_consume_token(STAR); quantifier = null; args = ImmutableList.of(SqlIdentifier.star(getPos())); jj_consume_token(RPAREN); - } else if (jj_2_457(2)) { + } else if (jj_2_472(2)) { jj_consume_token(LPAREN); jj_consume_token(RPAREN); quantifier = null; args = ImmutableList.of(); - } else if (jj_2_458(2)) { + } else if (jj_2_473(2)) { args = FunctionParameterList(ExprContext.ACCEPT_SUB_QUERY); quantifier = (SqlLiteral) args.get(0); args.remove(0); @@ -5412,16 +5582,16 @@ final public SqlCall StringAggFunctionCall() throws ParseException { final SqlNodeList orderBy; final Pair nullTreatment; final SqlNode separator; - if (jj_2_460(2)) { + if (jj_2_475(2)) { jj_consume_token(ARRAY_AGG); s = span(); op = SqlLibraryOperators.ARRAY_AGG; - } else if (jj_2_461(2)) { + } else if (jj_2_476(2)) { jj_consume_token(ARRAY_CONCAT_AGG); s = span(); op = SqlLibraryOperators.ARRAY_CONCAT_AGG; - } else if (jj_2_462(2)) { + } else if (jj_2_477(2)) { jj_consume_token(GROUP_CONCAT); s = span(); op = SqlLibraryOperators.GROUP_CONCAT; - } else if (jj_2_463(2)) { + } else if (jj_2_478(2)) { jj_consume_token(STRING_AGG); s = span(); op = SqlLibraryOperators.STRING_AGG; } else { @@ -5429,18 +5599,18 @@ final public SqlCall StringAggFunctionCall() throws ParseException { throw new ParseException(); } jj_consume_token(LPAREN); - if (jj_2_464(2)) { + if (jj_2_479(2)) { qualifier = AllOrDistinct(); } else { qualifier = null; } AddArg(args, ExprContext.ACCEPT_SUB_QUERY); - label_47: + label_48: while (true) { - if (jj_2_465(2)) { + if (jj_2_480(2)) { ; } else { - break label_47; + break label_48; } jj_consume_token(COMMA); // a comma-list can't appear where only a query is expected @@ -5448,18 +5618,18 @@ final public SqlCall StringAggFunctionCall() throws ParseException { checkNonQueryExpression(ExprContext.ACCEPT_SUB_QUERY); AddArg(args, ExprContext.ACCEPT_SUB_QUERY); } - if (jj_2_466(2)) { + if (jj_2_481(2)) { nullTreatment = NullTreatment(); } else { nullTreatment = null; } - if (jj_2_467(2)) { + if (jj_2_482(2)) { orderBy = OrderBy(true); args.add(orderBy); } else { ; } - if (jj_2_468(2)) { + if (jj_2_483(2)) { jj_consume_token(SEPARATOR); s2 = span(); separator = StringLiteral(); @@ -5492,10 +5662,10 @@ final public SqlCall PercentileFunctionCall() throws ParseException { final SqlNode e; final List args = new ArrayList(); final Pair nullTreatment; - if (jj_2_469(2)) { + if (jj_2_484(2)) { jj_consume_token(PERCENTILE_CONT); op = SqlStdOperatorTable.PERCENTILE_CONT; - } else if (jj_2_470(2)) { + } else if (jj_2_485(2)) { jj_consume_token(PERCENTILE_DISC); op = SqlStdOperatorTable.PERCENTILE_DISC; } else { @@ -5505,14 +5675,14 @@ final public SqlCall PercentileFunctionCall() throws ParseException { s = span(); jj_consume_token(LPAREN); AddArg(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_472(2)) { + if (jj_2_487(2)) { jj_consume_token(RPAREN); {if (true) return op.createCall(s.end(this), args);} - } else if (jj_2_473(2)) { + } else if (jj_2_488(2)) { jj_consume_token(COMMA); e = NumericLiteral(); args.add(e); - if (jj_2_471(2)) { + if (jj_2_486(2)) { nullTreatment = NullTreatment(); } else { nullTreatment = null; @@ -5540,33 +5710,36 @@ final public SqlCall PercentileFunctionCall() throws ParseException { */ final public SqlNode AtomicRowExpression() throws ParseException { final SqlNode e; - if (jj_2_474(2)) { + if (jj_2_489(2)) { e = LiteralOrIntervalExpression(); - } else if (jj_2_475(2)) { + } else if (jj_2_490(2)) { e = DynamicParam(); - } else if (jj_2_476(2)) { + } else if (jj_2_491(2)) { e = BuiltinFunctionCall(); - } else if (jj_2_477(2)) { + } else if (jj_2_492(2)) { e = JdbcFunctionCall(); - } else if (jj_2_478(2)) { + } else if (jj_2_493(2)) { e = MultisetConstructor(); - } else if (jj_2_479(2)) { + } else if (jj_2_494(2)) { e = ArrayConstructor(); - } else if (jj_2_480(3)) { + } else if (jj_2_495(3)) { e = MapConstructor(); - } else if (jj_2_481(2)) { + } else if (jj_2_496(2)) { e = PeriodConstructor(); - } else if (jj_2_482(2147483647)) { + } else if (jj_2_497(2147483647)) { e = NamedFunctionCall(); - } else if (jj_2_483(2)) { + } else if (jj_2_498(2)) { e = ContextVariable(); - } else if (jj_2_484(2)) { + } else if (jj_2_499(2)) { e = CompoundIdentifier(); - } else if (jj_2_485(2)) { + } else if (allowRowValueStar()) { + jj_consume_token(STAR); + {if (true) return SqlIdentifier.star(getPos());} + } else if (jj_2_500(2)) { e = NewSpecification(); - } else if (jj_2_486(2)) { + } else if (jj_2_501(2)) { e = CaseExpression(); - } else if (jj_2_487(2)) { + } else if (jj_2_502(2)) { e = SequenceExpression(); } else { jj_consume_token(-1); @@ -5587,12 +5760,12 @@ final public SqlNode CaseExpression() throws ParseException { final List thenList = new ArrayList(); jj_consume_token(CASE); s = span(); - if (jj_2_488(2)) { + if (jj_2_503(2)) { caseIdentifier = Expression(ExprContext.ACCEPT_SUB_QUERY); } else { caseIdentifier = null; } - label_48: + label_49: while (true) { jj_consume_token(WHEN); whenSpan.add(this); @@ -5605,13 +5778,13 @@ final public SqlNode CaseExpression() throws ParseException { thenSpan.add(this); e = Expression(ExprContext.ACCEPT_SUB_QUERY); thenList.add(e); - if (jj_2_489(2)) { + if (jj_2_504(2)) { ; } else { - break label_48; + break label_49; } } - if (jj_2_490(2)) { + if (jj_2_505(2)) { jj_consume_token(ELSE); elseClause = Expression(ExprContext.ACCEPT_SUB_QUERY); } else { @@ -5629,10 +5802,10 @@ final public SqlCall SequenceExpression() throws ParseException { final Span s; final SqlOperator f; final SqlNode sequenceRef; - if (jj_2_491(2)) { + if (jj_2_506(2)) { jj_consume_token(NEXT); f = SqlStdOperatorTable.NEXT_VALUE; s = span(); - } else if (jj_2_492(3)) { + } else if (jj_2_507(3)) { jj_consume_token(CURRENT); f = SqlStdOperatorTable.CURRENT_VALUE; s = span(); } else { @@ -5653,16 +5826,16 @@ final public SqlCall SequenceExpression() throws ParseException { final public SqlSetOption SqlSetOption(Span s, String scope) throws ParseException { SqlIdentifier name; final SqlNode val; - if (jj_2_498(2)) { + if (jj_2_513(2)) { jj_consume_token(SET); s.add(this); name = CompoundIdentifier(); jj_consume_token(EQ); - if (jj_2_493(2)) { + if (jj_2_508(2)) { val = Literal(); - } else if (jj_2_494(2)) { + } else if (jj_2_509(2)) { val = SimpleIdentifier(); - } else if (jj_2_495(2)) { + } else if (jj_2_510(2)) { jj_consume_token(ON); // OFF is handled by SimpleIdentifier, ON handled here. val = new SqlIdentifier(token.image.toUpperCase(Locale.ROOT), @@ -5672,12 +5845,12 @@ final public SqlSetOption SqlSetOption(Span s, String scope) throws ParseExcepti throw new ParseException(); } {if (true) return new SqlSetOption(s.end(val), scope, (SqlNode) name, val);} - } else if (jj_2_499(2)) { + } else if (jj_2_514(2)) { jj_consume_token(RESET); s.add(this); - if (jj_2_496(2)) { + if (jj_2_511(2)) { name = CompoundIdentifier(); - } else if (jj_2_497(2)) { + } else if (jj_2_512(2)) { jj_consume_token(ALL); name = new SqlIdentifier(token.image.toUpperCase(Locale.ROOT), getPos()); @@ -5710,9 +5883,9 @@ final public SqlAlter SqlAlter() throws ParseException { } final public String Scope() throws ParseException { - if (jj_2_500(2)) { + if (jj_2_515(2)) { jj_consume_token(SYSTEM); - } else if (jj_2_501(2)) { + } else if (jj_2_516(2)) { jj_consume_token(SESSION); } else { jj_consume_token(-1); @@ -5731,20 +5904,20 @@ final public SqlCreate SqlCreate() throws ParseException { final SqlCreate create; jj_consume_token(CREATE); s = span(); - if (jj_2_502(2)) { + if (jj_2_517(2)) { jj_consume_token(OR); jj_consume_token(REPLACE); replace = true; } else { ; } - if (jj_2_503(2)) { + if (jj_2_518(2)) { create = SqlCreateTable(s, replace); - } else if (jj_2_504(2)) { + } else if (jj_2_519(2)) { create = SqlCreateIndex(s, replace); - } else if (jj_2_505(2)) { + } else if (jj_2_520(2)) { create = SqlCreateUser(s, replace); - } else if (jj_2_506(2)) { + } else if (jj_2_521(2)) { create = SqlCreateView(s, replace); } else { jj_consume_token(-1); @@ -5763,13 +5936,13 @@ final public SqlDrop SqlDrop() throws ParseException { final SqlDrop drop; jj_consume_token(DROP); s = span(); - if (jj_2_507(2)) { + if (jj_2_522(2)) { drop = SqlDropTable(s, replace); - } else if (jj_2_508(2)) { + } else if (jj_2_523(2)) { drop = SqlDropIndex(s, replace); - } else if (jj_2_509(2)) { + } else if (jj_2_524(2)) { drop = SqlDropUser(s, replace); - } else if (jj_2_510(2)) { + } else if (jj_2_525(2)) { drop = SqlDropView(s, replace); } else { jj_consume_token(-1); @@ -5791,9 +5964,9 @@ final public SqlDrop SqlDrop() throws ParseException { */ final public SqlNode Literal() throws ParseException { SqlNode e; - if (jj_2_511(2)) { + if (jj_2_526(2)) { e = NonIntervalLiteral(); - } else if (jj_2_512(2)) { + } else if (jj_2_527(2)) { e = IntervalLiteral(); } else { jj_consume_token(-1); @@ -5806,13 +5979,13 @@ final public SqlNode Literal() throws ParseException { /** Parses a literal that is not an interval literal. */ final public SqlNode NonIntervalLiteral() throws ParseException { final SqlNode e; - if (jj_2_513(2)) { + if (jj_2_528(2)) { e = NumericLiteral(); - } else if (jj_2_514(2)) { + } else if (jj_2_529(2)) { e = StringLiteral(); - } else if (jj_2_515(2)) { + } else if (jj_2_530(2)) { e = SpecialLiteral(); - } else if (jj_2_516(2)) { + } else if (jj_2_531(2)) { e = DateTimeLiteral(); } else { jj_consume_token(-1); @@ -5830,9 +6003,9 @@ final public SqlNode NonIntervalLiteral() throws ParseException { * LOOKAHEAD. */ final public SqlNode LiteralOrIntervalExpression() throws ParseException { final SqlNode e; - if (jj_2_517(2)) { + if (jj_2_532(2)) { e = IntervalLiteralOrExpression(); - } else if (jj_2_518(2)) { + } else if (jj_2_533(2)) { e = NonIntervalLiteral(); } else { jj_consume_token(-1); @@ -5845,17 +6018,17 @@ final public SqlNode LiteralOrIntervalExpression() throws ParseException { /** Parses a unsigned numeric literal */ final public SqlNumericLiteral UnsignedNumericLiteral() throws ParseException { final String p; - if (jj_2_519(2)) { + if (jj_2_534(2)) { jj_consume_token(UNSIGNED_INTEGER_LITERAL); {if (true) return SqlLiteral.createExactNumeric(token.image, getPos());} - } else if (jj_2_520(2)) { + } else if (jj_2_535(2)) { jj_consume_token(DECIMAL_NUMERIC_LITERAL); {if (true) return SqlLiteral.createExactNumeric(token.image, getPos());} - } else if (jj_2_521(2)) { + } else if (jj_2_536(2)) { jj_consume_token(DECIMAL); p = SimpleStringLiteral(); {if (true) return SqlParserUtil.parseDecimalLiteral(SqlParserUtil.trim(p, " "), getPos());} - } else if (jj_2_522(2)) { + } else if (jj_2_537(2)) { jj_consume_token(APPROX_NUMERIC_LITERAL); {if (true) return SqlLiteral.createApproxNumeric(token.image, getPos());} } else { @@ -5869,16 +6042,16 @@ final public SqlNumericLiteral UnsignedNumericLiteral() throws ParseException { final public SqlLiteral NumericLiteral() throws ParseException { final SqlNumericLiteral num; final Span s; - if (jj_2_523(2)) { + if (jj_2_538(2)) { jj_consume_token(PLUS); num = UnsignedNumericLiteral(); {if (true) return num;} - } else if (jj_2_524(2)) { + } else if (jj_2_539(2)) { jj_consume_token(MINUS); s = span(); num = UnsignedNumericLiteral(); {if (true) return SqlLiteral.createNegative(num, s.end(this));} - } else if (jj_2_525(2)) { + } else if (jj_2_540(2)) { num = UnsignedNumericLiteral(); {if (true) return num;} } else { @@ -5890,16 +6063,16 @@ final public SqlLiteral NumericLiteral() throws ParseException { /** Parse a special literal keyword */ final public SqlLiteral SpecialLiteral() throws ParseException { - if (jj_2_526(2)) { + if (jj_2_541(2)) { jj_consume_token(TRUE); {if (true) return SqlLiteral.createBoolean(true, getPos());} - } else if (jj_2_527(2)) { + } else if (jj_2_542(2)) { jj_consume_token(FALSE); {if (true) return SqlLiteral.createBoolean(false, getPos());} - } else if (jj_2_528(2)) { + } else if (jj_2_543(2)) { jj_consume_token(UNKNOWN); {if (true) return SqlLiteral.createUnknown(getPos());} - } else if (jj_2_529(2)) { + } else if (jj_2_544(2)) { jj_consume_token(NULL); {if (true) return SqlLiteral.createNull(getPos());} } else { @@ -5926,7 +6099,7 @@ final public SqlNode StringLiteral() throws ParseException { char unicodeEscapeChar = 0; String charSet = null; SqlCharStringLiteral literal; - if (jj_2_534(2)) { + if (jj_2_549(2)) { jj_consume_token(BINARY_STRING_LITERAL); frags = new ArrayList(); try { @@ -5936,15 +6109,15 @@ final public SqlNode StringLiteral() throws ParseException { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.illegalBinaryString(token.image));} } - label_49: + label_50: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case QUOTED_STRING: ; break; default: - jj_la1[5] = jj_gen; - break label_49; + jj_la1[6] = jj_gen; + break label_50; } jj_consume_token(QUOTED_STRING); try { @@ -5962,13 +6135,13 @@ final public SqlNode StringLiteral() throws ParseException { SqlParserPos pos2 = SqlParserPos.sum(frags); {if (true) return SqlStdOperatorTable.LITERAL_CHAIN.createCall(pos2, frags);} } - } else if (jj_2_535(2)) { - if (jj_2_530(2)) { + } else if (jj_2_550(2)) { + if (jj_2_545(2)) { jj_consume_token(PREFIXED_STRING_LITERAL); charSet = SqlParserUtil.getCharacterSet(token.image); - } else if (jj_2_531(2)) { + } else if (jj_2_546(2)) { jj_consume_token(QUOTED_STRING); - } else if (jj_2_532(2)) { + } else if (jj_2_547(2)) { jj_consume_token(UNICODE_STRING_LITERAL); // TODO jvs 2-Feb-2009: support the explicit specification of // a character set for Unicode string literals, per SQL:2003 @@ -5987,15 +6160,15 @@ final public SqlNode StringLiteral() throws ParseException { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.unknownCharacterSet(charSet));} } - label_50: + label_51: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case QUOTED_STRING: ; break; default: - jj_la1[6] = jj_gen; - break label_50; + jj_la1[7] = jj_gen; + break label_51; } jj_consume_token(QUOTED_STRING); p = SqlParserUtil.parseString(token.image); @@ -6007,7 +6180,7 @@ final public SqlNode StringLiteral() throws ParseException { RESOURCE.unknownCharacterSet(charSet));} } } - if (jj_2_533(2)) { + if (jj_2_548(2)) { jj_consume_token(UESCAPE); jj_consume_token(QUOTED_STRING); if (unicodeEscapeChar == 0) { @@ -6033,7 +6206,7 @@ final public SqlNode StringLiteral() throws ParseException { SqlParserPos pos2 = SqlParserPos.sum(rands); {if (true) return SqlStdOperatorTable.LITERAL_CHAIN.createCall(pos2, rands);} } - } else if (jj_2_536(2)) { + } else if (jj_2_551(2)) { jj_consume_token(C_STYLE_ESCAPED_STRING_LITERAL); try { p = SqlParserUtil.parseCString(getToken(0).image); @@ -6042,7 +6215,7 @@ final public SqlNode StringLiteral() throws ParseException { RESOURCE.unicodeEscapeMalformed(e.i));} } {if (true) return SqlLiteral.createCharString(p, "UTF16", getPos());} - } else if (jj_2_537(2)) { + } else if (jj_2_552(2)) { jj_consume_token(BIG_QUERY_DOUBLE_QUOTED_STRING); p = SqlParserUtil.stripQuotes(getToken(0).image, DQ, DQ, "\\\"", Casing.UNCHANGED); @@ -6052,7 +6225,7 @@ final public SqlNode StringLiteral() throws ParseException { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.unknownCharacterSet(charSet));} } - } else if (jj_2_538(2)) { + } else if (jj_2_553(2)) { jj_consume_token(BIG_QUERY_QUOTED_STRING); p = SqlParserUtil.stripQuotes(getToken(0).image, "'", "'", "\\'", Casing.UNCHANGED); @@ -6074,13 +6247,13 @@ final public SqlNode StringLiteral() throws ParseException { * on BigQuery also matches a double-quoted string, such as "foo". * Returns the value of the string with quotes removed. */ final public String SimpleStringLiteral() throws ParseException { - if (jj_2_539(2)) { + if (jj_2_554(2)) { jj_consume_token(QUOTED_STRING); {if (true) return SqlParserUtil.parseString(token.image);} - } else if (jj_2_540(2)) { + } else if (jj_2_555(2)) { jj_consume_token(BIG_QUERY_QUOTED_STRING); {if (true) return SqlParserUtil.stripQuotes(token.image, "'", "'", "\\'", Casing.UNCHANGED);} - } else if (jj_2_541(2)) { + } else if (jj_2_556(2)) { jj_consume_token(BIG_QUERY_DOUBLE_QUOTED_STRING); {if (true) return SqlParserUtil.stripQuotes(token.image, DQ, DQ, "\\\"", Casing.UNCHANGED);} } else { @@ -6097,55 +6270,55 @@ final public SqlLiteral DateTimeLiteral() throws ParseException { final String p; final Span s; boolean local = false; - if (jj_2_544(2)) { + if (jj_2_559(2)) { jj_consume_token(LBRACE_D); jj_consume_token(QUOTED_STRING); p = SqlParserUtil.parseString(token.image); jj_consume_token(RBRACE); {if (true) return SqlParserUtil.parseDateLiteral(p, getPos());} - } else if (jj_2_545(2)) { + } else if (jj_2_560(2)) { jj_consume_token(LBRACE_T); jj_consume_token(QUOTED_STRING); p = SqlParserUtil.parseString(token.image); jj_consume_token(RBRACE); {if (true) return SqlParserUtil.parseTimeLiteral(p, getPos());} - } else if (jj_2_546(2)) { + } else if (jj_2_561(2)) { jj_consume_token(LBRACE_TS); s = span(); jj_consume_token(QUOTED_STRING); p = SqlParserUtil.parseString(token.image); jj_consume_token(RBRACE); {if (true) return SqlParserUtil.parseTimestampLiteral(p, s.end(this));} - } else if (jj_2_547(2)) { + } else if (jj_2_562(2)) { jj_consume_token(DATE); s = span(); p = SimpleStringLiteral(); {if (true) return SqlLiteral.createUnknown("DATE", p, s.end(this));} - } else if (jj_2_548(2)) { + } else if (jj_2_563(2)) { jj_consume_token(DATETIME); s = span(); p = SimpleStringLiteral(); {if (true) return SqlLiteral.createUnknown("DATETIME", p, s.end(this));} - } else if (jj_2_549(2)) { + } else if (jj_2_564(2)) { jj_consume_token(TIME); s = span(); p = SimpleStringLiteral(); {if (true) return SqlLiteral.createUnknown("TIME", p, s.end(this));} - } else if (jj_2_550(2)) { + } else if (jj_2_565(2)) { jj_consume_token(UUID); s = span(); p = SimpleStringLiteral(); {if (true) return SqlLiteral.createUnknown("UUID", p, s.end(this));} - } else if (jj_2_551(2)) { + } else if (jj_2_566(2)) { jj_consume_token(TIMESTAMP); s = span(); p = SimpleStringLiteral(); {if (true) return SqlLiteral.createUnknown("TIMESTAMP", p, s.end(this));} - } else if (jj_2_552(2)) { + } else if (jj_2_567(2)) { jj_consume_token(TIME); s = span(); jj_consume_token(WITH); - if (jj_2_542(2)) { + if (jj_2_557(2)) { jj_consume_token(LOCAL); local = true; } else { @@ -6155,11 +6328,11 @@ final public SqlLiteral DateTimeLiteral() throws ParseException { jj_consume_token(ZONE); p = SimpleStringLiteral(); {if (true) return SqlLiteral.createUnknown("TIME WITH " + (local ? "LOCAL " : "") + "TIME ZONE", p, s.end(this));} - } else if (jj_2_553(2)) { + } else if (jj_2_568(2)) { jj_consume_token(TIMESTAMP); s = span(); jj_consume_token(WITH); - if (jj_2_543(2)) { + if (jj_2_558(2)) { jj_consume_token(LOCAL); local = true; } else { @@ -6184,13 +6357,13 @@ final public SqlNode DateTimeConstructorCall() throws ParseException { final Span s; final SqlLiteral quantifier; final List args; - if (jj_2_554(2)) { + if (jj_2_569(2)) { jj_consume_token(DATE); - } else if (jj_2_555(2)) { + } else if (jj_2_570(2)) { jj_consume_token(TIME); - } else if (jj_2_556(2)) { + } else if (jj_2_571(2)) { jj_consume_token(DATETIME); - } else if (jj_2_557(2)) { + } else if (jj_2_572(2)) { jj_consume_token(TIMESTAMP); } else { jj_consume_token(-1); @@ -6212,22 +6385,22 @@ final public SqlNode MultisetConstructor() throws ParseException { final Span s; jj_consume_token(MULTISET); s = span(); - if (jj_2_559(2)) { + if (jj_2_574(2)) { jj_consume_token(LPAREN); // by sub query "MULTISET(SELECT * FROM T)" e = LeafQueryOrExpr(ExprContext.ACCEPT_QUERY); jj_consume_token(RPAREN); {if (true) return SqlStdOperatorTable.MULTISET_QUERY.createCall( s.end(this), e);} - } else if (jj_2_560(2)) { + } else if (jj_2_575(2)) { jj_consume_token(LBRACKET); AddExpression(args, ExprContext.ACCEPT_NON_QUERY); - label_51: + label_52: while (true) { - if (jj_2_558(2)) { + if (jj_2_573(2)) { ; } else { - break label_51; + break label_52; } jj_consume_token(COMMA); AddExpression(args, ExprContext.ACCEPT_NON_QUERY); @@ -6250,12 +6423,12 @@ final public SqlNode ArrayConstructor() throws ParseException { final String p; jj_consume_token(ARRAY); s = span(); - if (jj_2_564(2)) { - if (jj_2_561(2)) { + if (jj_2_579(2)) { + if (jj_2_576(2)) { jj_consume_token(LPAREN); jj_consume_token(RPAREN); args = SqlNodeList.EMPTY; - } else if (jj_2_562(2)) { + } else if (jj_2_577(2)) { args = ParenthesizedQueryOrCommaList(ExprContext.ACCEPT_ALL); } else { jj_consume_token(-1); @@ -6269,9 +6442,9 @@ final public SqlNode ArrayConstructor() throws ParseException { // equivalent to standard 'ARRAY [1, 2]' {if (true) return SqlLibraryOperators.ARRAY.createCall(s.end(this), args.getList());} } - } else if (jj_2_565(2)) { + } else if (jj_2_580(2)) { jj_consume_token(LBRACKET); - if (jj_2_563(2)) { + if (jj_2_578(2)) { args = ExpressionCommaList(s, ExprContext.ACCEPT_SUB_QUERY); } else { args = SqlNodeList.EMPTY; @@ -6292,29 +6465,29 @@ final public SqlCall ArrayLiteral() throws ParseException { final Span s; jj_consume_token(LBRACE); s = span(); - if (jj_2_568(2)) { + if (jj_2_583(2)) { e = Literal(); list = startList(e); - label_52: + label_53: while (true) { - if (jj_2_566(2)) { + if (jj_2_581(2)) { ; } else { - break label_52; + break label_53; } jj_consume_token(COMMA); e = Literal(); list.add(e); } - } else if (jj_2_569(2)) { + } else if (jj_2_584(2)) { e = ArrayLiteral(); list = startList(e); - label_53: + label_54: while (true) { - if (jj_2_567(2)) { + if (jj_2_582(2)) { ; } else { - break label_53; + break label_54; } jj_consume_token(COMMA); e = ArrayLiteral(); @@ -6334,12 +6507,12 @@ final public SqlNode MapConstructor() throws ParseException { final Span s; jj_consume_token(MAP); s = span(); - if (jj_2_573(2)) { - if (jj_2_570(2)) { + if (jj_2_588(2)) { + if (jj_2_585(2)) { jj_consume_token(LPAREN); jj_consume_token(RPAREN); args = SqlNodeList.EMPTY; - } else if (jj_2_571(2)) { + } else if (jj_2_586(2)) { args = ParenthesizedQueryOrCommaList(ExprContext.ACCEPT_ALL); } else { jj_consume_token(-1); @@ -6352,9 +6525,9 @@ final public SqlNode MapConstructor() throws ParseException { // MAP function e.g. "MAP(1, 2)" equivalent to standard "MAP[1, 2]" {if (true) return SqlLibraryOperators.MAP.createCall(s.end(this), args.getList());} } - } else if (jj_2_574(2)) { + } else if (jj_2_589(2)) { jj_consume_token(LBRACKET); - if (jj_2_572(2)) { + if (jj_2_587(2)) { args = ExpressionCommaList(s, ExprContext.ACCEPT_NON_QUERY); } else { args = SqlNodeList.EMPTY; @@ -6394,11 +6567,11 @@ final public SqlLiteral IntervalLiteral() throws ParseException { final Span s; jj_consume_token(INTERVAL); s = span(); - if (jj_2_577(2)) { - if (jj_2_575(2)) { + if (jj_2_592(2)) { + if (jj_2_590(2)) { jj_consume_token(MINUS); sign = -1; - } else if (jj_2_576(2)) { + } else if (jj_2_591(2)) { jj_consume_token(PLUS); sign = 1; } else { @@ -6426,11 +6599,11 @@ final public SqlNode IntervalLiteralOrExpression() throws ParseException { SqlNode e; jj_consume_token(INTERVAL); s = span(); - if (jj_2_580(2)) { - if (jj_2_578(2)) { + if (jj_2_595(2)) { + if (jj_2_593(2)) { jj_consume_token(MINUS); sign = -1; - } else if (jj_2_579(2)) { + } else if (jj_2_594(2)) { jj_consume_token(PLUS); sign = 1; } else { @@ -6440,20 +6613,20 @@ final public SqlNode IntervalLiteralOrExpression() throws ParseException { } else { ; } - if (jj_2_584(2)) { + if (jj_2_599(2)) { // literal (with quoted string) p = SimpleStringLiteral(); intervalQualifier = IntervalQualifier(); {if (true) return SqlParserUtil.parseIntervalLiteral(s.end(intervalQualifier), sign, p, intervalQualifier);} - } else if (jj_2_585(2)) { - if (jj_2_581(2)) { + } else if (jj_2_600(2)) { + if (jj_2_596(2)) { jj_consume_token(LPAREN); e = Expression(ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(RPAREN); - } else if (jj_2_582(2)) { + } else if (jj_2_597(2)) { e = UnsignedNumericLiteral(); - } else if (jj_2_583(2)) { + } else if (jj_2_598(2)) { e = CompoundIdentifier(); } else { jj_consume_token(-1); @@ -6473,10 +6646,10 @@ final public SqlNode IntervalLiteralOrExpression() throws ParseException { } final public TimeUnit Year() throws ParseException { - if (jj_2_586(2)) { + if (jj_2_601(2)) { jj_consume_token(YEAR); {if (true) return TimeUnit.YEAR;} - } else if (jj_2_587(2)) { + } else if (jj_2_602(2)) { jj_consume_token(YEARS); {if (true) return warn(TimeUnit.YEAR);} } else { @@ -6487,10 +6660,10 @@ final public TimeUnit Year() throws ParseException { } final public TimeUnit Quarter() throws ParseException { - if (jj_2_588(2)) { + if (jj_2_603(2)) { jj_consume_token(QUARTER); {if (true) return TimeUnit.QUARTER;} - } else if (jj_2_589(2)) { + } else if (jj_2_604(2)) { jj_consume_token(QUARTERS); {if (true) return warn(TimeUnit.QUARTER);} } else { @@ -6501,10 +6674,10 @@ final public TimeUnit Quarter() throws ParseException { } final public TimeUnit Month() throws ParseException { - if (jj_2_590(2)) { + if (jj_2_605(2)) { jj_consume_token(MONTH); {if (true) return TimeUnit.MONTH;} - } else if (jj_2_591(2)) { + } else if (jj_2_606(2)) { jj_consume_token(MONTHS); {if (true) return warn(TimeUnit.MONTH);} } else { @@ -6515,10 +6688,10 @@ final public TimeUnit Month() throws ParseException { } final public TimeUnit Week() throws ParseException { - if (jj_2_592(2)) { + if (jj_2_607(2)) { jj_consume_token(WEEK); {if (true) return TimeUnit.WEEK;} - } else if (jj_2_593(2)) { + } else if (jj_2_608(2)) { jj_consume_token(WEEKS); {if (true) return warn(TimeUnit.WEEK);} } else { @@ -6529,10 +6702,10 @@ final public TimeUnit Week() throws ParseException { } final public TimeUnit Day() throws ParseException { - if (jj_2_594(2)) { + if (jj_2_609(2)) { jj_consume_token(DAY); {if (true) return TimeUnit.DAY;} - } else if (jj_2_595(2)) { + } else if (jj_2_610(2)) { jj_consume_token(DAYS); {if (true) return warn(TimeUnit.DAY);} } else { @@ -6543,10 +6716,10 @@ final public TimeUnit Day() throws ParseException { } final public TimeUnit Hour() throws ParseException { - if (jj_2_596(2)) { + if (jj_2_611(2)) { jj_consume_token(HOUR); {if (true) return TimeUnit.HOUR;} - } else if (jj_2_597(2)) { + } else if (jj_2_612(2)) { jj_consume_token(HOURS); {if (true) return warn(TimeUnit.HOUR);} } else { @@ -6557,10 +6730,10 @@ final public TimeUnit Hour() throws ParseException { } final public TimeUnit Minute() throws ParseException { - if (jj_2_598(2)) { + if (jj_2_613(2)) { jj_consume_token(MINUTE); {if (true) return TimeUnit.MINUTE;} - } else if (jj_2_599(2)) { + } else if (jj_2_614(2)) { jj_consume_token(MINUTES); {if (true) return warn(TimeUnit.MINUTE);} } else { @@ -6571,10 +6744,10 @@ final public TimeUnit Minute() throws ParseException { } final public TimeUnit Second() throws ParseException { - if (jj_2_600(2)) { + if (jj_2_615(2)) { jj_consume_token(SECOND); {if (true) return TimeUnit.SECOND;} - } else if (jj_2_601(2)) { + } else if (jj_2_616(2)) { jj_consume_token(SECONDS); {if (true) return warn(TimeUnit.SECOND);} } else { @@ -6584,48 +6757,57 @@ final public TimeUnit Second() throws ParseException { throw new Error("Missing return statement in function"); } + final public SqlIntervalQualifier IntervalWithoutQualifier() throws ParseException { + final Span s; + int secondFracPrec = RelDataType.PRECISION_NOT_SPECIFIED; + s = span(); + {if (true) return new SqlIntervalQualifier(TimeUnit.SECOND, -1, null, secondFracPrec, + s.end(this));} + throw new Error("Missing return statement in function"); + } + final public SqlIntervalQualifier IntervalQualifier() throws ParseException { final Span s; final TimeUnit start; final TimeUnit end; final int startPrec; int secondFracPrec = RelDataType.PRECISION_NOT_SPECIFIED; - if (jj_2_615(2)) { + if (jj_2_630(2)) { start = Year(); s = span(); startPrec = PrecisionOpt(); - if (jj_2_602(2)) { + if (jj_2_617(2)) { jj_consume_token(TO); end = Month(); } else { end = null; } - } else if (jj_2_616(2)) { + } else if (jj_2_631(2)) { start = Quarter(); s = span(); startPrec = PrecisionOpt(); end = null; - } else if (jj_2_617(2)) { + } else if (jj_2_632(2)) { start = Month(); s = span(); startPrec = PrecisionOpt(); end = null; - } else if (jj_2_618(2)) { + } else if (jj_2_633(2)) { start = Week(); s = span(); startPrec = PrecisionOpt(); end = null; - } else if (jj_2_619(2)) { + } else if (jj_2_634(2)) { start = Day(); s = span(); startPrec = PrecisionOpt(); - if (jj_2_606(2)) { + if (jj_2_621(2)) { jj_consume_token(TO); - if (jj_2_603(2)) { + if (jj_2_618(2)) { end = Hour(); - } else if (jj_2_604(2)) { + } else if (jj_2_619(2)) { end = Minute(); - } else if (jj_2_605(2)) { + } else if (jj_2_620(2)) { end = Second(); secondFracPrec = PrecisionOpt(); } else { @@ -6635,17 +6817,17 @@ final public SqlIntervalQualifier IntervalQualifier() throws ParseException { } else { end = null; } - } else if (jj_2_620(2)) { + } else if (jj_2_635(2)) { start = Hour(); s = span(); startPrec = PrecisionOpt(); - if (jj_2_610(2)) { + if (jj_2_625(2)) { jj_consume_token(TO); - if (jj_2_608(2)) { + if (jj_2_623(2)) { end = Minute(); - } else if (jj_2_609(2)) { + } else if (jj_2_624(2)) { end = Second(); - if (jj_2_607(2)) { + if (jj_2_622(2)) { jj_consume_token(LPAREN); secondFracPrec = UnsignedIntLiteral(); jj_consume_token(RPAREN); @@ -6659,14 +6841,14 @@ final public SqlIntervalQualifier IntervalQualifier() throws ParseException { } else { end = null; } - } else if (jj_2_621(2)) { + } else if (jj_2_636(2)) { start = Minute(); s = span(); startPrec = PrecisionOpt(); - if (jj_2_612(2)) { + if (jj_2_627(2)) { jj_consume_token(TO); end = Second(); - if (jj_2_611(2)) { + if (jj_2_626(2)) { jj_consume_token(LPAREN); secondFracPrec = UnsignedIntLiteral(); jj_consume_token(RPAREN); @@ -6676,13 +6858,13 @@ final public SqlIntervalQualifier IntervalQualifier() throws ParseException { } else { end = null; } - } else if (jj_2_622(2)) { + } else if (jj_2_637(2)) { start = Second(); s = span(); - if (jj_2_614(2)) { + if (jj_2_629(2)) { jj_consume_token(LPAREN); startPrec = UnsignedIntLiteral(); - if (jj_2_613(2)) { + if (jj_2_628(2)) { jj_consume_token(COMMA); secondFracPrec = UnsignedIntLiteral(); } else { @@ -6708,20 +6890,20 @@ final public SqlIntervalQualifier IntervalQualifierStart() throws ParseException final TimeUnit start; int startPrec = RelDataType.PRECISION_NOT_SPECIFIED; int secondFracPrec = RelDataType.PRECISION_NOT_SPECIFIED; - if (jj_2_632(2)) { - if (jj_2_623(2)) { + if (jj_2_647(2)) { + if (jj_2_638(2)) { start = Year(); - } else if (jj_2_624(2)) { + } else if (jj_2_639(2)) { start = Quarter(); - } else if (jj_2_625(2)) { + } else if (jj_2_640(2)) { start = Month(); - } else if (jj_2_626(2)) { + } else if (jj_2_641(2)) { start = Week(); - } else if (jj_2_627(2)) { + } else if (jj_2_642(2)) { start = Day(); - } else if (jj_2_628(2)) { + } else if (jj_2_643(2)) { start = Hour(); - } else if (jj_2_629(2)) { + } else if (jj_2_644(2)) { start = Minute(); } else { jj_consume_token(-1); @@ -6729,13 +6911,13 @@ final public SqlIntervalQualifier IntervalQualifierStart() throws ParseException } s = span(); startPrec = PrecisionOpt(); - } else if (jj_2_633(2)) { + } else if (jj_2_648(2)) { start = Second(); s = span(); - if (jj_2_631(2)) { + if (jj_2_646(2)) { jj_consume_token(LPAREN); startPrec = UnsignedIntLiteral(); - if (jj_2_630(2)) { + if (jj_2_645(2)) { jj_consume_token(COMMA); secondFracPrec = UnsignedIntLiteral(); } else { @@ -6772,10 +6954,10 @@ final public SqlIntervalQualifier IntervalQualifierStart() throws ParseException final public SqlIntervalQualifier TimeUnitOrName() throws ParseException { final SqlIdentifier unitName; final SqlIntervalQualifier intervalQualifier; - if (jj_2_634(2)) { + if (jj_2_649(2)) { intervalQualifier = TimeUnit(); {if (true) return intervalQualifier;} - } else if (jj_2_635(2)) { + } else if (jj_2_650(2)) { unitName = SimpleIdentifier(); {if (true) return new SqlIntervalQualifier(unitName.getSimple(), unitName.getParserPosition());} @@ -6799,49 +6981,49 @@ final public SqlIntervalQualifier TimeUnitOrName() throws ParseException { final public SqlIntervalQualifier TimeUnit() throws ParseException { final Span span; final String w; - if (jj_2_637(2)) { + if (jj_2_652(2)) { jj_consume_token(NANOSECOND); {if (true) return new SqlIntervalQualifier(TimeUnit.NANOSECOND, null, getPos());} - } else if (jj_2_638(2)) { + } else if (jj_2_653(2)) { jj_consume_token(MICROSECOND); {if (true) return new SqlIntervalQualifier(TimeUnit.MICROSECOND, null, getPos());} - } else if (jj_2_639(2)) { + } else if (jj_2_654(2)) { jj_consume_token(MILLISECOND); {if (true) return new SqlIntervalQualifier(TimeUnit.MILLISECOND, null, getPos());} - } else if (jj_2_640(2)) { + } else if (jj_2_655(2)) { jj_consume_token(SECOND); {if (true) return new SqlIntervalQualifier(TimeUnit.SECOND, null, getPos());} - } else if (jj_2_641(2)) { + } else if (jj_2_656(2)) { jj_consume_token(MINUTE); {if (true) return new SqlIntervalQualifier(TimeUnit.MINUTE, null, getPos());} - } else if (jj_2_642(2)) { + } else if (jj_2_657(2)) { jj_consume_token(HOUR); {if (true) return new SqlIntervalQualifier(TimeUnit.HOUR, null, getPos());} - } else if (jj_2_643(2)) { + } else if (jj_2_658(2)) { jj_consume_token(DAY); {if (true) return new SqlIntervalQualifier(TimeUnit.DAY, null, getPos());} - } else if (jj_2_644(2)) { + } else if (jj_2_659(2)) { jj_consume_token(DAYOFWEEK); {if (true) return new SqlIntervalQualifier(TimeUnit.DOW, null, getPos());} - } else if (jj_2_645(2)) { + } else if (jj_2_660(2)) { jj_consume_token(DAYOFYEAR); {if (true) return new SqlIntervalQualifier(TimeUnit.DOY, null, getPos());} - } else if (jj_2_646(2)) { + } else if (jj_2_661(2)) { jj_consume_token(DOW); {if (true) return new SqlIntervalQualifier(TimeUnit.DOW, null, getPos());} - } else if (jj_2_647(2)) { + } else if (jj_2_662(2)) { jj_consume_token(DOY); {if (true) return new SqlIntervalQualifier(TimeUnit.DOY, null, getPos());} - } else if (jj_2_648(2)) { + } else if (jj_2_663(2)) { jj_consume_token(ISODOW); {if (true) return new SqlIntervalQualifier(TimeUnit.ISODOW, null, getPos());} - } else if (jj_2_649(2)) { + } else if (jj_2_664(2)) { jj_consume_token(ISOYEAR); {if (true) return new SqlIntervalQualifier(TimeUnit.ISOYEAR, null, getPos());} - } else if (jj_2_650(2)) { + } else if (jj_2_665(2)) { jj_consume_token(WEEK); span = span(); - if (jj_2_636(2)) { + if (jj_2_651(2)) { jj_consume_token(LPAREN); w = weekdayName(); jj_consume_token(RPAREN); @@ -6849,25 +7031,25 @@ final public SqlIntervalQualifier TimeUnit() throws ParseException { } else { {if (true) return new SqlIntervalQualifier(TimeUnit.WEEK, null, getPos());} } - } else if (jj_2_651(2)) { + } else if (jj_2_666(2)) { jj_consume_token(MONTH); {if (true) return new SqlIntervalQualifier(TimeUnit.MONTH, null, getPos());} - } else if (jj_2_652(2)) { + } else if (jj_2_667(2)) { jj_consume_token(QUARTER); {if (true) return new SqlIntervalQualifier(TimeUnit.QUARTER, null, getPos());} - } else if (jj_2_653(2)) { + } else if (jj_2_668(2)) { jj_consume_token(YEAR); {if (true) return new SqlIntervalQualifier(TimeUnit.YEAR, null, getPos());} - } else if (jj_2_654(2)) { + } else if (jj_2_669(2)) { jj_consume_token(EPOCH); {if (true) return new SqlIntervalQualifier(TimeUnit.EPOCH, null, getPos());} - } else if (jj_2_655(2)) { + } else if (jj_2_670(2)) { jj_consume_token(DECADE); {if (true) return new SqlIntervalQualifier(TimeUnit.DECADE, null, getPos());} - } else if (jj_2_656(2)) { + } else if (jj_2_671(2)) { jj_consume_token(CENTURY); {if (true) return new SqlIntervalQualifier(TimeUnit.CENTURY, null, getPos());} - } else if (jj_2_657(2)) { + } else if (jj_2_672(2)) { jj_consume_token(MILLENNIUM); {if (true) return new SqlIntervalQualifier(TimeUnit.MILLENNIUM, null, getPos());} } else { @@ -6878,25 +7060,25 @@ final public SqlIntervalQualifier TimeUnit() throws ParseException { } final public String weekdayName() throws ParseException { - if (jj_2_658(2)) { + if (jj_2_673(2)) { jj_consume_token(SUNDAY); {if (true) return "WEEK_SUNDAY";} - } else if (jj_2_659(2)) { + } else if (jj_2_674(2)) { jj_consume_token(MONDAY); {if (true) return "WEEK_MONDAY";} - } else if (jj_2_660(2)) { + } else if (jj_2_675(2)) { jj_consume_token(TUESDAY); {if (true) return "WEEK_TUESDAY";} - } else if (jj_2_661(2)) { + } else if (jj_2_676(2)) { jj_consume_token(WEDNESDAY); {if (true) return "WEEK_WEDNESDAY";} - } else if (jj_2_662(2)) { + } else if (jj_2_677(2)) { jj_consume_token(THURSDAY); {if (true) return "WEEK_THURSDAY";} - } else if (jj_2_663(2)) { + } else if (jj_2_678(2)) { jj_consume_token(FRIDAY); {if (true) return "WEEK_FRIDAY";} - } else if (jj_2_664(2)) { + } else if (jj_2_679(2)) { jj_consume_token(SATURDAY); {if (true) return "WEEK_SATURDAY";} } else { @@ -6927,41 +7109,41 @@ final public void AddIdentifierSegment(List names, List po char unicodeEscapeChar = BACKSLASH; final SqlParserPos pos; final Span span; - if (jj_2_666(2)) { + if (jj_2_681(2)) { jj_consume_token(IDENTIFIER); id = unquotedIdentifier(); pos = getPos(); - } else if (jj_2_667(2)) { + } else if (jj_2_682(2)) { jj_consume_token(HYPHENATED_IDENTIFIER); id = unquotedIdentifier(); pos = getPos(); - } else if (jj_2_668(2)) { + } else if (jj_2_683(2)) { jj_consume_token(QUOTED_IDENTIFIER); id = SqlParserUtil.stripQuotes(getToken(0).image, DQ, DQ, DQDQ, quotedCasing); pos = getPos().withQuoting(true); - } else if (jj_2_669(2)) { + } else if (jj_2_684(2)) { jj_consume_token(BACK_QUOTED_IDENTIFIER); id = SqlParserUtil.stripQuotes(getToken(0).image, "`", "`", "``", quotedCasing); pos = getPos().withQuoting(true); - } else if (jj_2_670(2)) { + } else if (jj_2_685(2)) { jj_consume_token(BIG_QUERY_BACK_QUOTED_IDENTIFIER); id = SqlParserUtil.stripQuotes(getToken(0).image, "`", "`", "\\`", quotedCasing); pos = getPos().withQuoting(true); - } else if (jj_2_671(2)) { + } else if (jj_2_686(2)) { jj_consume_token(BRACKET_QUOTED_IDENTIFIER); id = SqlParserUtil.stripQuotes(getToken(0).image, "[", "]", "]]", quotedCasing); pos = getPos().withQuoting(true); - } else if (jj_2_672(2)) { + } else if (jj_2_687(2)) { jj_consume_token(UNICODE_QUOTED_IDENTIFIER); span = span(); String image = getToken(0).image; image = image.substring(image.indexOf('"')); image = SqlParserUtil.stripQuotes(image, DQ, DQ, DQDQ, quotedCasing); - if (jj_2_665(2)) { + if (jj_2_680(2)) { jj_consume_token(UESCAPE); jj_consume_token(QUOTED_STRING); String s = SqlParserUtil.parseString(token.image); @@ -6973,7 +7155,7 @@ final public void AddIdentifierSegment(List names, List po SqlLiteral lit = SqlLiteral.createCharString(image, "UTF16", pos); lit = lit.unescapeUnicode(unicodeEscapeChar); id = lit.toValue(); - } else if (jj_2_673(2)) { + } else if (jj_2_688(2)) { id = NonReservedKeyWord(); pos = getPos(); } else { @@ -7056,12 +7238,12 @@ final public void AddSimpleIdentifiers(List list) throws ParseException SqlIdentifier id; id = SimpleIdentifier(); list.add(id); - label_54: + label_55: while (true) { - if (jj_2_674(2)) { + if (jj_2_689(2)) { ; } else { - break label_54; + break label_55; } jj_consume_token(COMMA); id = SimpleIdentifier(); @@ -7094,10 +7276,10 @@ final public SqlNodeList ParenthesizedSimpleIdentifierList() throws ParseExcepti final public SqlNodeList SimpleIdentifierOrList() throws ParseException { SqlIdentifier id; SqlNodeList list; - if (jj_2_675(2)) { + if (jj_2_690(2)) { id = SimpleIdentifier(); {if (true) return new SqlNodeList(Collections.singletonList(id), id.getParserPosition());} - } else if (jj_2_676(2)) { + } else if (jj_2_691(2)) { list = ParenthesizedSimpleIdentifierList(); {if (true) return list;} } else { @@ -7115,17 +7297,17 @@ final public SqlIdentifier CompoundIdentifier() throws ParseException { final List posList = new ArrayList(); boolean star = false; AddIdentifierSegment(nameList, posList); - label_55: + label_56: while (true) { - if (jj_2_677(2)) { + if (jj_2_692(2)) { ; } else { - break label_55; + break label_56; } jj_consume_token(DOT); AddIdentifierSegment(nameList, posList); } - if (jj_2_678(2)) { + if (jj_2_693(2)) { jj_consume_token(DOT); jj_consume_token(STAR); star = true; @@ -7149,12 +7331,12 @@ final public SqlIdentifier CompoundTableIdentifier() throws ParseException { final List nameList = new ArrayList(); final List posList = new ArrayList(); AddTableIdentifierSegment(nameList, posList); - label_56: + label_57: while (true) { - if (jj_2_679(2)) { + if (jj_2_694(2)) { ; } else { - break label_56; + break label_57; } jj_consume_token(DOT); AddTableIdentifierSegment(nameList, posList); @@ -7169,12 +7351,12 @@ final public SqlIdentifier CompoundTableIdentifier() throws ParseException { */ final public void AddCompoundIdentifierTypes(List list, List extendList) throws ParseException { AddCompoundIdentifierType(list, extendList); - label_57: + label_58: while (true) { - if (jj_2_680(2)) { + if (jj_2_695(2)) { ; } else { - break label_57; + break label_58; } jj_consume_token(COMMA); AddCompoundIdentifierType(list, extendList); @@ -7226,10 +7408,10 @@ final public int UnsignedIntLiteral() throws ParseException { final public int IntLiteral() throws ParseException { Token t; - if (jj_2_683(2)) { - if (jj_2_681(2)) { + if (jj_2_698(2)) { + if (jj_2_696(2)) { t = jj_consume_token(UNSIGNED_INTEGER_LITERAL); - } else if (jj_2_682(2)) { + } else if (jj_2_697(2)) { jj_consume_token(PLUS); t = jj_consume_token(UNSIGNED_INTEGER_LITERAL); } else { @@ -7242,7 +7424,7 @@ final public int IntLiteral() throws ParseException { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.invalidLiteral(t.image, Integer.class.getCanonicalName()));} } - } else if (jj_2_684(2)) { + } else if (jj_2_699(2)) { jj_consume_token(MINUS); t = jj_consume_token(UNSIGNED_INTEGER_LITERAL); try { @@ -7264,12 +7446,12 @@ final public SqlDataTypeSpec DataType() throws ParseException { final Span s; typeName = TypeName(); s = Span.of(typeName.getParserPos()); - label_58: + label_59: while (true) { - if (jj_2_685(2)) { + if (jj_2_700(2)) { ; } else { - break label_58; + break label_59; } typeName = CollectionsTypeName(typeName); } @@ -7283,13 +7465,13 @@ final public SqlTypeNameSpec TypeName() throws ParseException { final SqlTypeNameSpec typeNameSpec; final SqlIdentifier typeName; final Span s = Span.of(); - if (jj_2_686(2)) { + if (jj_2_701(2)) { typeNameSpec = SqlTypeName(s); - } else if (jj_2_687(2)) { + } else if (jj_2_702(2)) { typeNameSpec = RowTypeName(); - } else if (jj_2_688(2)) { + } else if (jj_2_703(2)) { typeNameSpec = MapTypeName(); - } else if (jj_2_689(2)) { + } else if (jj_2_704(2)) { typeName = CompoundIdentifier(); typeNameSpec = new SqlUserDefinedTypeNameSpec(typeName, s.end(this)); } else { @@ -7303,15 +7485,15 @@ final public SqlTypeNameSpec TypeName() throws ParseException { // Types used for JDBC and ODBC scalar conversion function final public SqlTypeNameSpec SqlTypeName(Span s) throws ParseException { final SqlTypeNameSpec sqlTypeNameSpec; - if (jj_2_690(2)) { + if (jj_2_705(2)) { sqlTypeNameSpec = SqlTypeName1(s); - } else if (jj_2_691(2)) { + } else if (jj_2_706(2)) { sqlTypeNameSpec = SqlTypeName2(s); - } else if (jj_2_692(2)) { + } else if (jj_2_707(2)) { sqlTypeNameSpec = SqlTypeName3(s); - } else if (jj_2_693(2)) { + } else if (jj_2_708(2)) { sqlTypeNameSpec = CharacterTypeName(s); - } else if (jj_2_694(2)) { + } else if (jj_2_709(2)) { sqlTypeNameSpec = DateTimeTypeName(); } else { jj_consume_token(-1); @@ -7325,54 +7507,97 @@ final public SqlTypeNameSpec SqlTypeName(Span s) throws ParseException { // For extra specification, we mean precision, scale, charSet, etc. final public SqlTypeNameSpec SqlTypeName1(Span s) throws ParseException { final SqlTypeName sqlTypeName; - if (jj_2_698(2)) { + boolean unsigned = false; + if (jj_2_717(2)) { jj_consume_token(GEOMETRY); if (!this.conformance.allowGeometry()) { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.geometryDisabled());} } s.add(this); sqlTypeName = SqlTypeName.GEOMETRY; - } else if (jj_2_699(2)) { + } else if (jj_2_718(2)) { jj_consume_token(BOOLEAN); s.add(this); sqlTypeName = SqlTypeName.BOOLEAN; - } else if (jj_2_700(2)) { - if (jj_2_695(2)) { + } else if (jj_2_719(2)) { + if (jj_2_710(2)) { jj_consume_token(INTEGER); - } else if (jj_2_696(2)) { + } else if (jj_2_711(2)) { jj_consume_token(INT); } else { jj_consume_token(-1); throw new ParseException(); } - s.add(this); sqlTypeName = SqlTypeName.INTEGER; - } else if (jj_2_701(2)) { + if (jj_2_712(2)) { + jj_consume_token(UNSIGNED); + unsigned = true; + } else { + ; + } + if (unsigned && !this.conformance.supportsUnsignedTypes()) { + {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.unsignedDisabled());} + } + s.add(this); sqlTypeName = unsigned ? SqlTypeName.UINTEGER : SqlTypeName.INTEGER; + } else if (jj_2_720(2)) { + jj_consume_token(UNSIGNED); + if (!this.conformance.supportsUnsignedTypes()) { + {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.unsignedDisabled());} + } + s.add(this); sqlTypeName = SqlTypeName.UINTEGER; + } else if (jj_2_721(2)) { jj_consume_token(TINYINT); - s.add(this); sqlTypeName = SqlTypeName.TINYINT; - } else if (jj_2_702(2)) { + if (jj_2_713(2)) { + jj_consume_token(UNSIGNED); + unsigned = true; + } else { + ; + } + if (unsigned && !this.conformance.supportsUnsignedTypes()) { + {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.unsignedDisabled());} + } + s.add(this); sqlTypeName = unsigned ? SqlTypeName.UTINYINT : SqlTypeName.TINYINT; + } else if (jj_2_722(2)) { jj_consume_token(SMALLINT); - s.add(this); sqlTypeName = SqlTypeName.SMALLINT; - } else if (jj_2_703(2)) { + if (jj_2_714(2)) { + jj_consume_token(UNSIGNED); + unsigned = true; + } else { + ; + } + if (unsigned && !this.conformance.supportsUnsignedTypes()) { + {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.unsignedDisabled());} + } + s.add(this); sqlTypeName = unsigned ? SqlTypeName.USMALLINT : SqlTypeName.SMALLINT; + } else if (jj_2_723(2)) { jj_consume_token(BIGINT); - s.add(this); sqlTypeName = SqlTypeName.BIGINT; - } else if (jj_2_704(2)) { + if (jj_2_715(2)) { + jj_consume_token(UNSIGNED); + unsigned = true; + } else { + ; + } + if (unsigned && !this.conformance.supportsUnsignedTypes()) { + {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.unsignedDisabled());} + } + s.add(this); sqlTypeName = unsigned ? SqlTypeName.UBIGINT : SqlTypeName.BIGINT; + } else if (jj_2_724(2)) { jj_consume_token(REAL); s.add(this); sqlTypeName = SqlTypeName.REAL; - } else if (jj_2_705(2)) { + } else if (jj_2_725(2)) { jj_consume_token(DOUBLE); s.add(this); - if (jj_2_697(2)) { + if (jj_2_716(2)) { jj_consume_token(PRECISION); } else { ; } sqlTypeName = SqlTypeName.DOUBLE; - } else if (jj_2_706(2)) { + } else if (jj_2_726(2)) { jj_consume_token(FLOAT); s.add(this); sqlTypeName = SqlTypeName.FLOAT; - } else if (jj_2_707(2)) { + } else if (jj_2_727(2)) { jj_consume_token(VARIANT); s.add(this); sqlTypeName = SqlTypeName.VARIANT; - } else if (jj_2_708(2)) { + } else if (jj_2_728(2)) { jj_consume_token(UUID); s.add(this); sqlTypeName = SqlTypeName.UUID; } else { @@ -7387,16 +7612,16 @@ final public SqlTypeNameSpec SqlTypeName1(Span s) throws ParseException { final public SqlTypeNameSpec SqlTypeName2(Span s) throws ParseException { final SqlTypeName sqlTypeName; int precision = -1; - if (jj_2_710(2)) { + if (jj_2_730(2)) { jj_consume_token(BINARY); s.add(this); - if (jj_2_709(2)) { + if (jj_2_729(2)) { jj_consume_token(VARYING); sqlTypeName = SqlTypeName.VARBINARY; } else { sqlTypeName = SqlTypeName.BINARY; } - } else if (jj_2_711(2)) { + } else if (jj_2_731(2)) { jj_consume_token(VARBINARY); s.add(this); sqlTypeName = SqlTypeName.VARBINARY; } else { @@ -7413,29 +7638,29 @@ final public SqlTypeNameSpec SqlTypeName3(Span s) throws ParseException { final SqlTypeName sqlTypeName; int precision = RelDataType.PRECISION_NOT_SPECIFIED; int scale = RelDataType.SCALE_NOT_SPECIFIED; - if (jj_2_715(2)) { - if (jj_2_712(2)) { + if (jj_2_735(2)) { + if (jj_2_732(2)) { jj_consume_token(DECIMAL); - } else if (jj_2_713(2)) { + } else if (jj_2_733(2)) { jj_consume_token(DEC); - } else if (jj_2_714(2)) { + } else if (jj_2_734(2)) { jj_consume_token(NUMERIC); } else { jj_consume_token(-1); throw new ParseException(); } s.add(this); sqlTypeName = SqlTypeName.DECIMAL; - } else if (jj_2_716(2)) { + } else if (jj_2_736(2)) { jj_consume_token(ANY); s.add(this); sqlTypeName = SqlTypeName.ANY; } else { jj_consume_token(-1); throw new ParseException(); } - if (jj_2_718(2)) { + if (jj_2_738(2)) { jj_consume_token(LPAREN); precision = UnsignedIntLiteral(); - if (jj_2_717(2)) { + if (jj_2_737(2)) { jj_consume_token(COMMA); scale = IntLiteral(); } else { @@ -7451,213 +7676,213 @@ final public SqlTypeNameSpec SqlTypeName3(Span s) throws ParseException { // Types used for for JDBC and ODBC scalar conversion function final public SqlJdbcDataTypeName JdbcOdbcDataTypeName() throws ParseException { - if (jj_2_753(2)) { - if (jj_2_719(2)) { + if (jj_2_773(2)) { + if (jj_2_739(2)) { jj_consume_token(SQL_CHAR); - } else if (jj_2_720(2)) { + } else if (jj_2_740(2)) { jj_consume_token(CHAR); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_CHAR;} - } else if (jj_2_754(2)) { - if (jj_2_721(2)) { + } else if (jj_2_774(2)) { + if (jj_2_741(2)) { jj_consume_token(SQL_VARCHAR); - } else if (jj_2_722(2)) { + } else if (jj_2_742(2)) { jj_consume_token(VARCHAR); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_VARCHAR;} - } else if (jj_2_755(2)) { - if (jj_2_723(2)) { + } else if (jj_2_775(2)) { + if (jj_2_743(2)) { jj_consume_token(SQL_DATE); - } else if (jj_2_724(2)) { + } else if (jj_2_744(2)) { jj_consume_token(DATE); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_DATE;} - } else if (jj_2_756(2)) { - if (jj_2_725(2)) { + } else if (jj_2_776(2)) { + if (jj_2_745(2)) { jj_consume_token(SQL_TIME); - } else if (jj_2_726(2)) { + } else if (jj_2_746(2)) { jj_consume_token(TIME); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_TIME;} - } else if (jj_2_757(2)) { - if (jj_2_727(2)) { + } else if (jj_2_777(2)) { + if (jj_2_747(2)) { jj_consume_token(SQL_TIMESTAMP); - } else if (jj_2_728(2)) { + } else if (jj_2_748(2)) { jj_consume_token(TIMESTAMP); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_TIMESTAMP;} - } else if (jj_2_758(2)) { - if (jj_2_729(2)) { + } else if (jj_2_778(2)) { + if (jj_2_749(2)) { jj_consume_token(SQL_DECIMAL); - } else if (jj_2_730(2)) { + } else if (jj_2_750(2)) { jj_consume_token(DECIMAL); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_DECIMAL;} - } else if (jj_2_759(2)) { - if (jj_2_731(2)) { + } else if (jj_2_779(2)) { + if (jj_2_751(2)) { jj_consume_token(SQL_NUMERIC); - } else if (jj_2_732(2)) { + } else if (jj_2_752(2)) { jj_consume_token(NUMERIC); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_NUMERIC;} - } else if (jj_2_760(2)) { - if (jj_2_733(2)) { + } else if (jj_2_780(2)) { + if (jj_2_753(2)) { jj_consume_token(SQL_BOOLEAN); - } else if (jj_2_734(2)) { + } else if (jj_2_754(2)) { jj_consume_token(BOOLEAN); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_BOOLEAN;} - } else if (jj_2_761(2)) { - if (jj_2_735(2)) { + } else if (jj_2_781(2)) { + if (jj_2_755(2)) { jj_consume_token(SQL_INTEGER); - } else if (jj_2_736(2)) { + } else if (jj_2_756(2)) { jj_consume_token(INTEGER); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_INTEGER;} - } else if (jj_2_762(2)) { - if (jj_2_737(2)) { + } else if (jj_2_782(2)) { + if (jj_2_757(2)) { jj_consume_token(SQL_BINARY); - } else if (jj_2_738(2)) { + } else if (jj_2_758(2)) { jj_consume_token(BINARY); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_BINARY;} - } else if (jj_2_763(2)) { - if (jj_2_739(2)) { + } else if (jj_2_783(2)) { + if (jj_2_759(2)) { jj_consume_token(SQL_VARBINARY); - } else if (jj_2_740(2)) { + } else if (jj_2_760(2)) { jj_consume_token(VARBINARY); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_VARBINARY;} - } else if (jj_2_764(2)) { - if (jj_2_741(2)) { + } else if (jj_2_784(2)) { + if (jj_2_761(2)) { jj_consume_token(SQL_TINYINT); - } else if (jj_2_742(2)) { + } else if (jj_2_762(2)) { jj_consume_token(TINYINT); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_TINYINT;} - } else if (jj_2_765(2)) { - if (jj_2_743(2)) { + } else if (jj_2_785(2)) { + if (jj_2_763(2)) { jj_consume_token(SQL_SMALLINT); - } else if (jj_2_744(2)) { + } else if (jj_2_764(2)) { jj_consume_token(SMALLINT); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_SMALLINT;} - } else if (jj_2_766(2)) { - if (jj_2_745(2)) { + } else if (jj_2_786(2)) { + if (jj_2_765(2)) { jj_consume_token(SQL_BIGINT); - } else if (jj_2_746(2)) { + } else if (jj_2_766(2)) { jj_consume_token(BIGINT); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_BIGINT;} - } else if (jj_2_767(2)) { - if (jj_2_747(2)) { + } else if (jj_2_787(2)) { + if (jj_2_767(2)) { jj_consume_token(SQL_REAL); - } else if (jj_2_748(2)) { + } else if (jj_2_768(2)) { jj_consume_token(REAL); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_REAL;} - } else if (jj_2_768(2)) { - if (jj_2_749(2)) { + } else if (jj_2_788(2)) { + if (jj_2_769(2)) { jj_consume_token(SQL_DOUBLE); - } else if (jj_2_750(2)) { + } else if (jj_2_770(2)) { jj_consume_token(DOUBLE); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_DOUBLE;} - } else if (jj_2_769(2)) { - if (jj_2_751(2)) { + } else if (jj_2_789(2)) { + if (jj_2_771(2)) { jj_consume_token(SQL_FLOAT); - } else if (jj_2_752(2)) { + } else if (jj_2_772(2)) { jj_consume_token(FLOAT); } else { jj_consume_token(-1); throw new ParseException(); } {if (true) return SqlJdbcDataTypeName.SQL_FLOAT;} - } else if (jj_2_770(2)) { + } else if (jj_2_790(2)) { jj_consume_token(SQL_INTERVAL_YEAR); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_YEAR;} - } else if (jj_2_771(2)) { + } else if (jj_2_791(2)) { jj_consume_token(SQL_INTERVAL_YEAR_TO_MONTH); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_YEAR_TO_MONTH;} - } else if (jj_2_772(2)) { + } else if (jj_2_792(2)) { jj_consume_token(SQL_INTERVAL_MONTH); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_MONTH;} - } else if (jj_2_773(2)) { + } else if (jj_2_793(2)) { jj_consume_token(SQL_INTERVAL_DAY); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_DAY;} - } else if (jj_2_774(2)) { + } else if (jj_2_794(2)) { jj_consume_token(SQL_INTERVAL_DAY_TO_HOUR); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_DAY_TO_HOUR;} - } else if (jj_2_775(2)) { + } else if (jj_2_795(2)) { jj_consume_token(SQL_INTERVAL_DAY_TO_MINUTE); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_DAY_TO_MINUTE;} - } else if (jj_2_776(2)) { + } else if (jj_2_796(2)) { jj_consume_token(SQL_INTERVAL_DAY_TO_SECOND); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_DAY_TO_SECOND;} - } else if (jj_2_777(2)) { + } else if (jj_2_797(2)) { jj_consume_token(SQL_INTERVAL_HOUR); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_HOUR;} - } else if (jj_2_778(2)) { + } else if (jj_2_798(2)) { jj_consume_token(SQL_INTERVAL_HOUR_TO_MINUTE); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_HOUR_TO_MINUTE;} - } else if (jj_2_779(2)) { + } else if (jj_2_799(2)) { jj_consume_token(SQL_INTERVAL_HOUR_TO_SECOND); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_HOUR_TO_SECOND;} - } else if (jj_2_780(2)) { + } else if (jj_2_800(2)) { jj_consume_token(SQL_INTERVAL_MINUTE); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_MINUTE;} - } else if (jj_2_781(2)) { + } else if (jj_2_801(2)) { jj_consume_token(SQL_INTERVAL_MINUTE_TO_SECOND); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_MINUTE_TO_SECOND;} - } else if (jj_2_782(2)) { + } else if (jj_2_802(2)) { jj_consume_token(SQL_INTERVAL_SECOND); {if (true) return SqlJdbcDataTypeName.SQL_INTERVAL_SECOND;} } else { @@ -7680,10 +7905,10 @@ final public SqlLiteral JdbcOdbcDataType() throws ParseException { */ final public SqlTypeNameSpec CollectionsTypeName(SqlTypeNameSpec elementTypeName) throws ParseException { final SqlTypeName collectionTypeName; - if (jj_2_783(2)) { + if (jj_2_803(2)) { jj_consume_token(MULTISET); collectionTypeName = SqlTypeName.MULTISET; - } else if (jj_2_784(2)) { + } else if (jj_2_804(2)) { jj_consume_token(ARRAY); collectionTypeName = SqlTypeName.ARRAY; } else { @@ -7699,10 +7924,10 @@ final public SqlTypeNameSpec CollectionsTypeName(SqlTypeNameSpec elementTypeName * Parse a nullable option, default is true. */ final public boolean NullableOptDefaultTrue() throws ParseException { - if (jj_2_785(2)) { + if (jj_2_805(2)) { jj_consume_token(NULL); {if (true) return true;} - } else if (jj_2_786(2)) { + } else if (jj_2_806(2)) { jj_consume_token(NOT); jj_consume_token(NULL); {if (true) return false;} @@ -7716,10 +7941,10 @@ final public boolean NullableOptDefaultTrue() throws ParseException { * Parse a nullable option, default is false. */ final public boolean NullableOptDefaultFalse() throws ParseException { - if (jj_2_787(2)) { + if (jj_2_807(2)) { jj_consume_token(NULL); {if (true) return true;} - } else if (jj_2_788(2)) { + } else if (jj_2_808(2)) { jj_consume_token(NOT); jj_consume_token(NULL); {if (true) return false;} @@ -7731,7 +7956,7 @@ final public boolean NullableOptDefaultFalse() throws ParseException { /** Parses NOT NULL and returns false, or parses nothing and returns true. */ final public boolean NotNullOpt() throws ParseException { - if (jj_2_789(2)) { + if (jj_2_809(2)) { jj_consume_token(NOT); jj_consume_token(NULL); {if (true) return false;} @@ -7748,12 +7973,12 @@ final public boolean NotNullOpt() throws ParseException { final public void AddFieldNameTypes(List fieldNames, List fieldTypes) throws ParseException { AddFieldNameType(fieldNames, fieldTypes); - label_59: + label_60: while (true) { - if (jj_2_790(2)) { + if (jj_2_810(2)) { ; } else { - break label_59; + break label_60; } jj_consume_token(COMMA); AddFieldNameType(fieldNames, fieldTypes); @@ -7808,23 +8033,23 @@ final public SqlTypeNameSpec CharacterTypeName(Span s) throws ParseException { int precision = -1; final SqlTypeName sqlTypeName; String charSetName = null; - if (jj_2_794(2)) { - if (jj_2_791(2)) { + if (jj_2_814(2)) { + if (jj_2_811(2)) { jj_consume_token(CHARACTER); - } else if (jj_2_792(2)) { + } else if (jj_2_812(2)) { jj_consume_token(CHAR); } else { jj_consume_token(-1); throw new ParseException(); } s.add(this); - if (jj_2_793(2)) { + if (jj_2_813(2)) { jj_consume_token(VARYING); sqlTypeName = SqlTypeName.VARCHAR; } else { sqlTypeName = SqlTypeName.CHAR; } - } else if (jj_2_795(2)) { + } else if (jj_2_815(2)) { jj_consume_token(VARCHAR); s.add(this); sqlTypeName = SqlTypeName.VARCHAR; } else { @@ -7832,7 +8057,7 @@ final public SqlTypeNameSpec CharacterTypeName(Span s) throws ParseException { throw new ParseException(); } precision = PrecisionOpt(); - if (jj_2_796(2)) { + if (jj_2_816(2)) { jj_consume_token(CHARACTER); jj_consume_token(SET); charSetName = Identifier(); @@ -7850,17 +8075,17 @@ final public SqlTypeNameSpec DateTimeTypeName() throws ParseException { int precision = -1; SqlTypeName typeName; final Span s; - if (jj_2_797(2)) { + if (jj_2_817(2)) { jj_consume_token(DATE); typeName = SqlTypeName.DATE; {if (true) return new SqlBasicTypeNameSpec(typeName, getPos());} - } else if (jj_2_798(2)) { + } else if (jj_2_818(2)) { jj_consume_token(TIME); s = span(); precision = PrecisionOpt(); typeName = TimeZoneOpt(true); {if (true) return new SqlBasicTypeNameSpec(typeName, precision, s.end(this));} - } else if (jj_2_799(2)) { + } else if (jj_2_819(2)) { jj_consume_token(TIMESTAMP); s = span(); precision = PrecisionOpt(); @@ -7876,7 +8101,7 @@ final public SqlTypeNameSpec DateTimeTypeName() throws ParseException { // Parse an optional data type precision, default is -1. final public int PrecisionOpt() throws ParseException { int precision = -1; - if (jj_2_800(2)) { + if (jj_2_820(2)) { jj_consume_token(LPAREN); precision = UnsignedIntLiteral(); jj_consume_token(RPAREN); @@ -7894,14 +8119,14 @@ final public int PrecisionOpt() throws ParseException { */ final public SqlTypeName TimeZoneOpt(boolean timeType) throws ParseException { boolean local = false; - if (jj_2_802(3)) { + if (jj_2_822(3)) { jj_consume_token(WITHOUT); jj_consume_token(TIME); jj_consume_token(ZONE); {if (true) return timeType ? SqlTypeName.TIME : SqlTypeName.TIMESTAMP;} - } else if (jj_2_803(2)) { + } else if (jj_2_823(2)) { jj_consume_token(WITH); - if (jj_2_801(2)) { + if (jj_2_821(2)) { jj_consume_token(LOCAL); local = true; } else { @@ -7951,14 +8176,14 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { final SqlLiteral style; // mssql convert 'style' operand final SqlFunction f; final SqlNode format; - if (jj_2_840(2)) { - if (jj_2_804(2)) { + if (jj_2_860(2)) { + if (jj_2_824(2)) { jj_consume_token(CAST); f = SqlStdOperatorTable.CAST; - } else if (jj_2_805(2)) { + } else if (jj_2_825(2)) { jj_consume_token(SAFE_CAST); f = SqlLibraryOperators.SAFE_CAST; - } else if (jj_2_806(2)) { + } else if (jj_2_826(2)) { jj_consume_token(TRY_CAST); f = SqlLibraryOperators.TRY_CAST; } else { @@ -7969,10 +8194,10 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { jj_consume_token(LPAREN); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(AS); - if (jj_2_807(2)) { + if (jj_2_827(2)) { dt = DataType(); args.add(dt); - } else if (jj_2_808(2)) { + } else if (jj_2_828(2)) { jj_consume_token(INTERVAL); e = IntervalQualifier(); args.add(e); @@ -7980,7 +8205,7 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { jj_consume_token(-1); throw new ParseException(); } - if (jj_2_809(2)) { + if (jj_2_829(2)) { jj_consume_token(FORMAT); format = StringLiteral(); args.add(format); @@ -7989,7 +8214,7 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { } jj_consume_token(RPAREN); {if (true) return f.createCall(s.end(this), args);} - } else if (jj_2_841(2)) { + } else if (jj_2_861(2)) { jj_consume_token(EXTRACT); s = span(); jj_consume_token(LPAREN); @@ -7999,7 +8224,7 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(RPAREN); {if (true) return SqlStdOperatorTable.EXTRACT.createCall(s.end(this), args);} - } else if (jj_2_842(2)) { + } else if (jj_2_862(2)) { jj_consume_token(POSITION); s = span(); jj_consume_token(LPAREN); @@ -8010,7 +8235,7 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { args.add(e); jj_consume_token(IN); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_810(2)) { + if (jj_2_830(2)) { jj_consume_token(FROM); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); } else { @@ -8018,30 +8243,30 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { } jj_consume_token(RPAREN); {if (true) return SqlStdOperatorTable.POSITION.createCall(s.end(this), args);} - } else if (jj_2_843(2)) { + } else if (jj_2_863(2)) { jj_consume_token(CONVERT); s = span(); jj_consume_token(LPAREN); - if (jj_2_820(2)) { + if (jj_2_840(2)) { AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_813(2)) { + if (jj_2_833(2)) { jj_consume_token(USING); name = SimpleIdentifier(); args.add(name); jj_consume_token(RPAREN); {if (true) return SqlStdOperatorTable.TRANSLATE.createCall(s.end(this), args);} - } else if (jj_2_814(2)) { + } else if (jj_2_834(2)) { jj_consume_token(COMMA); e = SimpleIdentifier(); args.add(e); - if (jj_2_811(2)) { + if (jj_2_831(2)) { jj_consume_token(COMMA); e = SimpleIdentifier(); args.add(e); jj_consume_token(RPAREN); SqlOperator op = SqlStdOperatorTable.getConvertFuncByConformance(this.conformance); {if (true) return op.createCall(s.end(this), args);} - } else if (jj_2_812(2)) { + } else if (jj_2_832(2)) { jj_consume_token(RPAREN); {if (true) return SqlLibraryOperators.CONVERT_ORACLE.createCall(s.end(this), args);} } else { @@ -8052,11 +8277,11 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_821(2)) { - if (jj_2_815(2)) { + } else if (jj_2_841(2)) { + if (jj_2_835(2)) { dt = DataType(); args.add(dt); - } else if (jj_2_816(2)) { + } else if (jj_2_836(2)) { jj_consume_token(INTERVAL); e = IntervalQualifier(); args.add(e); @@ -8066,12 +8291,12 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { } jj_consume_token(COMMA); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_819(2)) { + if (jj_2_839(2)) { jj_consume_token(COMMA); - if (jj_2_817(2)) { + if (jj_2_837(2)) { style = UnsignedNumericLiteral(); args.add(style); - } else if (jj_2_818(2)) { + } else if (jj_2_838(2)) { jj_consume_token(NULL); args.add(SqlLiteral.createNull(getPos())); } else { @@ -8087,25 +8312,25 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_844(2)) { + } else if (jj_2_864(2)) { jj_consume_token(TRANSLATE); s = span(); jj_consume_token(LPAREN); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_823(2)) { + if (jj_2_843(2)) { jj_consume_token(USING); name = SimpleIdentifier(); args.add(name); jj_consume_token(RPAREN); {if (true) return SqlStdOperatorTable.TRANSLATE.createCall(s.end(this), args);} - } else if (jj_2_824(2)) { - label_60: + } else if (jj_2_844(2)) { + label_61: while (true) { - if (jj_2_822(2)) { + if (jj_2_842(2)) { ; } else { - break label_60; + break label_61; } jj_consume_token(COMMA); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); @@ -8117,7 +8342,7 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_845(2)) { + } else if (jj_2_865(2)) { jj_consume_token(OVERLAY); s = span(); jj_consume_token(LPAREN); @@ -8126,7 +8351,7 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(FROM); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_825(2)) { + if (jj_2_845(2)) { jj_consume_token(FOR); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); } else { @@ -8134,15 +8359,15 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { } jj_consume_token(RPAREN); {if (true) return SqlStdOperatorTable.OVERLAY.createCall(s.end(this), args);} - } else if (jj_2_846(2)) { + } else if (jj_2_866(2)) { jj_consume_token(FLOOR); s = span(); e = FloorCeilOptions(s, true); {if (true) return e;} - } else if (jj_2_847(2)) { - if (jj_2_826(2)) { + } else if (jj_2_867(2)) { + if (jj_2_846(2)) { jj_consume_token(CEIL); - } else if (jj_2_827(2)) { + } else if (jj_2_847(2)) { jj_consume_token(CEILING); } else { jj_consume_token(-1); @@ -8151,24 +8376,24 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { s = span(); e = FloorCeilOptions(s, false); {if (true) return e;} - } else if (jj_2_848(2)) { + } else if (jj_2_868(2)) { jj_consume_token(SUBSTRING); s = span(); jj_consume_token(LPAREN); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_828(2)) { + if (jj_2_848(2)) { jj_consume_token(FROM); - } else if (jj_2_829(2)) { + } else if (jj_2_849(2)) { jj_consume_token(COMMA); } else { jj_consume_token(-1); throw new ParseException(); } AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_832(2)) { - if (jj_2_830(2)) { + if (jj_2_852(2)) { + if (jj_2_850(2)) { jj_consume_token(FOR); - } else if (jj_2_831(2)) { + } else if (jj_2_851(2)) { jj_consume_token(COMMA); } else { jj_consume_token(-1); @@ -8181,23 +8406,23 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { jj_consume_token(RPAREN); {if (true) return SqlStdOperatorTable.SUBSTRING.createCall( s.end(this), args);} - } else if (jj_2_849(2)) { + } else if (jj_2_869(2)) { jj_consume_token(TRIM); SqlLiteral flag = null; SqlNode trimChars = null; SqlParserPos fromPos = SqlParserPos.ZERO; s = span(); jj_consume_token(LPAREN); - if (jj_2_838(2)) { - if (jj_2_833(2)) { + if (jj_2_858(2)) { + if (jj_2_853(2)) { jj_consume_token(BOTH); s.add(this); flag = SqlTrimFunction.Flag.BOTH.symbol(getPos()); - } else if (jj_2_834(2)) { + } else if (jj_2_854(2)) { jj_consume_token(TRAILING); s.add(this); flag = SqlTrimFunction.Flag.TRAILING.symbol(getPos()); - } else if (jj_2_835(2)) { + } else if (jj_2_855(2)) { jj_consume_token(LEADING); s.add(this); flag = SqlTrimFunction.Flag.LEADING.symbol(getPos()); @@ -8205,7 +8430,7 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { jj_consume_token(-1); throw new ParseException(); } - if (jj_2_836(2)) { + if (jj_2_856(2)) { trimChars = Expression(ExprContext.ACCEPT_SUB_QUERY); } else { ; @@ -8213,9 +8438,9 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { jj_consume_token(FROM); fromPos = getPos(); e = Expression(ExprContext.ACCEPT_SUB_QUERY); - } else if (jj_2_839(2)) { + } else if (jj_2_859(2)) { e = Expression(ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_837(2)) { + if (jj_2_857(2)) { jj_consume_token(FROM); trimChars = e; fromPos = getPos(); e = Expression(ExprContext.ACCEPT_SUB_QUERY); @@ -8235,67 +8460,67 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { args.add(trimChars); args.add(e); {if (true) return SqlStdOperatorTable.TRIM.createCall(s.end(this), args);} - } else if (jj_2_850(2)) { + } else if (jj_2_870(2)) { node = ContainsSubstrFunctionCall(); {if (true) return node;} - } else if (jj_2_851(2)) { + } else if (jj_2_871(2)) { node = DateTimeConstructorCall(); {if (true) return node;} - } else if (jj_2_852(2)) { + } else if (jj_2_872(2)) { node = DateDiffFunctionCall(); {if (true) return node;} - } else if (jj_2_853(2)) { + } else if (jj_2_873(2)) { node = DateTruncFunctionCall(); {if (true) return node;} - } else if (jj_2_854(2)) { + } else if (jj_2_874(2)) { node = DatetimeTruncFunctionCall(); {if (true) return node;} - } else if (jj_2_855(2)) { + } else if (jj_2_875(2)) { node = TimestampAddFunctionCall(); {if (true) return node;} - } else if (jj_2_856(2)) { + } else if (jj_2_876(2)) { node = DatetimeDiffFunctionCall(); {if (true) return node;} - } else if (jj_2_857(2)) { + } else if (jj_2_877(2)) { node = TimestampDiffFunctionCall(); {if (true) return node;} - } else if (jj_2_858(2)) { + } else if (jj_2_878(2)) { node = TimestampDiff3FunctionCall(); {if (true) return node;} - } else if (jj_2_859(2)) { + } else if (jj_2_879(2)) { node = TimestampTruncFunctionCall(); {if (true) return node;} - } else if (jj_2_860(2)) { + } else if (jj_2_880(2)) { node = TimeDiffFunctionCall(); {if (true) return node;} - } else if (jj_2_861(2)) { + } else if (jj_2_881(2)) { node = TimeTruncFunctionCall(); {if (true) return node;} - } else if (jj_2_862(2)) { + } else if (jj_2_882(2)) { node = MatchRecognizeFunctionCall(); {if (true) return node;} - } else if (jj_2_863(2)) { + } else if (jj_2_883(2)) { node = JsonExistsFunctionCall(); {if (true) return node;} - } else if (jj_2_864(2)) { + } else if (jj_2_884(2)) { node = JsonValueFunctionCall(); {if (true) return node;} - } else if (jj_2_865(2)) { + } else if (jj_2_885(2)) { node = JsonQueryFunctionCall(); {if (true) return node;} - } else if (jj_2_866(2)) { + } else if (jj_2_886(2)) { node = JsonObjectFunctionCall(); {if (true) return node;} - } else if (jj_2_867(2)) { + } else if (jj_2_887(2)) { node = JsonObjectAggFunctionCall(); {if (true) return node;} - } else if (jj_2_868(2)) { + } else if (jj_2_888(2)) { node = JsonArrayFunctionCall(); {if (true) return node;} - } else if (jj_2_869(2)) { + } else if (jj_2_889(2)) { node = JsonArrayAggFunctionCall(); {if (true) return node;} - } else if (jj_2_870(2)) { + } else if (jj_2_890(2)) { node = GroupByWindowingCall(); {if (true) return node;} } else { @@ -8307,15 +8532,15 @@ final public SqlNode BuiltinFunctionCall() throws ParseException { final public SqlJsonEncoding JsonRepresentation() throws ParseException { jj_consume_token(JSON); - if (jj_2_874(2)) { + if (jj_2_894(2)) { jj_consume_token(ENCODING); - if (jj_2_871(2)) { + if (jj_2_891(2)) { jj_consume_token(UTF8); {if (true) return SqlJsonEncoding.UTF8;} - } else if (jj_2_872(2)) { + } else if (jj_2_892(2)) { jj_consume_token(UTF16); {if (true) return SqlJsonEncoding.UTF16;} - } else if (jj_2_873(2)) { + } else if (jj_2_893(2)) { jj_consume_token(UTF32); {if (true) return SqlJsonEncoding.UTF32;} } else { @@ -8345,7 +8570,7 @@ final public SqlDataTypeSpec JsonReturningClause() throws ParseException { final public SqlDataTypeSpec JsonOutputClause() throws ParseException { SqlDataTypeSpec dataType; dataType = JsonReturningClause(); - if (jj_2_875(2)) { + if (jj_2_895(2)) { jj_consume_token(FORMAT); JsonRepresentation(); } else { @@ -8368,19 +8593,19 @@ final public List JsonApiCommonSyntax() throws ParseException { AddExpression(args, ExprContext.ACCEPT_NON_QUERY); jj_consume_token(COMMA); AddExpression(args, ExprContext.ACCEPT_NON_QUERY); - if (jj_2_877(2)) { + if (jj_2_897(2)) { jj_consume_token(PASSING); e = Expression(ExprContext.ACCEPT_NON_QUERY); jj_consume_token(AS); e = SimpleIdentifier(); - label_61: + label_62: while (true) { - if (jj_2_876(2)) { + if (jj_2_896(2)) { ; } else { - break label_61; + break label_62; } jj_consume_token(COMMA); e = Expression(ExprContext.ACCEPT_NON_QUERY); @@ -8397,16 +8622,16 @@ final public List JsonApiCommonSyntax() throws ParseException { } final public SqlJsonExistsErrorBehavior JsonExistsErrorBehavior() throws ParseException { - if (jj_2_878(2)) { + if (jj_2_898(2)) { jj_consume_token(TRUE); {if (true) return SqlJsonExistsErrorBehavior.TRUE;} - } else if (jj_2_879(2)) { + } else if (jj_2_899(2)) { jj_consume_token(FALSE); {if (true) return SqlJsonExistsErrorBehavior.FALSE;} - } else if (jj_2_880(2)) { + } else if (jj_2_900(2)) { jj_consume_token(UNKNOWN); {if (true) return SqlJsonExistsErrorBehavior.UNKNOWN;} - } else if (jj_2_881(2)) { + } else if (jj_2_901(2)) { jj_consume_token(ERROR); {if (true) return SqlJsonExistsErrorBehavior.ERROR;} } else { @@ -8426,7 +8651,7 @@ final public SqlCall JsonExistsFunctionCall() throws ParseException { jj_consume_token(LPAREN); commonSyntax = JsonApiCommonSyntax(); args.addAll(commonSyntax); - if (jj_2_882(2)) { + if (jj_2_902(2)) { errorBehavior = JsonExistsErrorBehavior(); args.add(errorBehavior.symbol(getPos())); jj_consume_token(ON); @@ -8441,13 +8666,13 @@ final public SqlCall JsonExistsFunctionCall() throws ParseException { final public List JsonValueEmptyOrErrorBehavior() throws ParseException { final List list = new ArrayList(); - if (jj_2_883(2)) { + if (jj_2_903(2)) { jj_consume_token(ERROR); list.add(SqlJsonValueEmptyOrErrorBehavior.ERROR.symbol(getPos())); - } else if (jj_2_884(2)) { + } else if (jj_2_904(2)) { jj_consume_token(NULL); list.add(SqlJsonValueEmptyOrErrorBehavior.NULL.symbol(getPos())); - } else if (jj_2_885(2)) { + } else if (jj_2_905(2)) { jj_consume_token(DEFAULT_); list.add(SqlJsonValueEmptyOrErrorBehavior.DEFAULT.symbol(getPos())); AddExpression(list, ExprContext.ACCEPT_NON_QUERY); @@ -8456,10 +8681,10 @@ final public List JsonValueEmptyOrErrorBehavior() throws ParseException throw new ParseException(); } jj_consume_token(ON); - if (jj_2_886(2)) { + if (jj_2_906(2)) { jj_consume_token(EMPTY); list.add(SqlJsonEmptyOrError.EMPTY.symbol(getPos())); - } else if (jj_2_887(2)) { + } else if (jj_2_907(2)) { jj_consume_token(ERROR); list.add(SqlJsonEmptyOrError.ERROR.symbol(getPos())); } else { @@ -8481,19 +8706,19 @@ final public SqlCall JsonValueFunctionCall() throws ParseException { jj_consume_token(LPAREN); commonSyntax = JsonApiCommonSyntax(); args.addAll(commonSyntax); - if (jj_2_888(2)) { + if (jj_2_908(2)) { e = JsonReturningClause(); args.add(SqlJsonValueReturning.RETURNING.symbol(getPos())); args.add(e); } else { ; } - label_62: + label_63: while (true) { - if (jj_2_889(2)) { + if (jj_2_909(2)) { ; } else { - break label_62; + break label_63; } behavior = JsonValueEmptyOrErrorBehavior(); args.addAll(behavior); @@ -8505,17 +8730,17 @@ final public SqlCall JsonValueFunctionCall() throws ParseException { final public List JsonQueryEmptyOrErrorBehavior() throws ParseException { final List list = new ArrayList(); - if (jj_2_890(2)) { + if (jj_2_910(2)) { jj_consume_token(ERROR); list.add(SqlLiteral.createSymbol(SqlJsonQueryEmptyOrErrorBehavior.ERROR, getPos())); - } else if (jj_2_891(2)) { + } else if (jj_2_911(2)) { jj_consume_token(NULL); list.add(SqlLiteral.createSymbol(SqlJsonQueryEmptyOrErrorBehavior.NULL, getPos())); - } else if (jj_2_892(2)) { + } else if (jj_2_912(2)) { jj_consume_token(EMPTY); jj_consume_token(ARRAY); list.add(SqlLiteral.createSymbol(SqlJsonQueryEmptyOrErrorBehavior.EMPTY_ARRAY, getPos())); - } else if (jj_2_893(2)) { + } else if (jj_2_913(2)) { jj_consume_token(EMPTY); jj_consume_token(OBJECT); list.add(SqlLiteral.createSymbol(SqlJsonQueryEmptyOrErrorBehavior.EMPTY_OBJECT, getPos())); @@ -8524,10 +8749,10 @@ final public List JsonQueryEmptyOrErrorBehavior() throws ParseException throw new ParseException(); } jj_consume_token(ON); - if (jj_2_894(2)) { + if (jj_2_914(2)) { jj_consume_token(EMPTY); list.add(SqlLiteral.createSymbol(SqlJsonEmptyOrError.EMPTY, getPos())); - } else if (jj_2_895(2)) { + } else if (jj_2_915(2)) { jj_consume_token(ERROR); list.add(SqlLiteral.createSymbol(SqlJsonEmptyOrError.ERROR, getPos())); } else { @@ -8539,31 +8764,31 @@ final public List JsonQueryEmptyOrErrorBehavior() throws ParseException } final public SqlNode JsonQueryWrapperBehavior() throws ParseException { - if (jj_2_900(2)) { + if (jj_2_920(2)) { jj_consume_token(WITHOUT); - if (jj_2_896(2)) { + if (jj_2_916(2)) { jj_consume_token(ARRAY); } else { ; } {if (true) return SqlLiteral.createSymbol(SqlJsonQueryWrapperBehavior.WITHOUT_ARRAY, getPos());} - } else if (jj_2_901(2)) { + } else if (jj_2_921(2)) { jj_consume_token(WITH); jj_consume_token(CONDITIONAL); - if (jj_2_897(2)) { + if (jj_2_917(2)) { jj_consume_token(ARRAY); } else { ; } {if (true) return SqlLiteral.createSymbol(SqlJsonQueryWrapperBehavior.WITH_CONDITIONAL_ARRAY, getPos());} - } else if (jj_2_902(2)) { + } else if (jj_2_922(2)) { jj_consume_token(WITH); - if (jj_2_898(2)) { + if (jj_2_918(2)) { jj_consume_token(UNCONDITIONAL); } else { ; } - if (jj_2_899(2)) { + if (jj_2_919(2)) { jj_consume_token(ARRAY); } else { ; @@ -8588,25 +8813,25 @@ final public SqlCall JsonQueryFunctionCall() throws ParseException { commonSyntax = JsonApiCommonSyntax(); args[0] = commonSyntax.get(0); args[1] = commonSyntax.get(1); - if (jj_2_903(2)) { + if (jj_2_923(2)) { e = JsonReturningClause(); args[5] = e; } else { ; } - if (jj_2_904(2)) { + if (jj_2_924(2)) { e = JsonQueryWrapperBehavior(); jj_consume_token(WRAPPER); args[2] = e; } else { ; } - label_63: + label_64: while (true) { - if (jj_2_905(2)) { + if (jj_2_925(2)) { ; } else { - break label_63; + break label_64; } behavior = JsonQueryEmptyOrErrorBehavior(); final SqlJsonEmptyOrError symbol = @@ -8636,7 +8861,7 @@ final public List JsonNameAndValue() throws ParseException { final List list = new ArrayList(); final SqlNode e; boolean kvMode = false; - if (jj_2_906(2)) { + if (jj_2_926(2)) { jj_consume_token(KEY); kvMode = true; } else { @@ -8644,16 +8869,16 @@ final public List JsonNameAndValue() throws ParseException { } e = JsonName(); list.add(e); - if (jj_2_907(2)) { + if (jj_2_927(2)) { jj_consume_token(VALUE); - } else if (jj_2_908(2)) { + } else if (jj_2_928(2)) { jj_consume_token(COMMA); - if (kvMode) { + if (kvMode || this.conformance.isColonFieldAccessAllowed()) { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.illegalComma());} } - } else if (jj_2_909(2)) { + } else if (jj_2_929(2)) { jj_consume_token(COLON); - if (kvMode) { + if (kvMode || this.conformance.isColonFieldAccessAllowed()) { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.illegalColon());} } } else { @@ -8666,12 +8891,12 @@ final public List JsonNameAndValue() throws ParseException { } final public SqlNode JsonConstructorNullClause() throws ParseException { - if (jj_2_910(2)) { + if (jj_2_930(2)) { jj_consume_token(NULL); jj_consume_token(ON); jj_consume_token(NULL); {if (true) return SqlLiteral.createSymbol(SqlJsonConstructorNullClause.NULL_ON_NULL, getPos());} - } else if (jj_2_911(2)) { + } else if (jj_2_931(2)) { jj_consume_token(ABSENT); jj_consume_token(ON); jj_consume_token(NULL); @@ -8692,15 +8917,15 @@ final public SqlCall JsonObjectFunctionCall() throws ParseException { jj_consume_token(JSON_OBJECT); span = span(); jj_consume_token(LPAREN); - if (jj_2_913(2)) { + if (jj_2_933(2)) { list = JsonNameAndValue(); nvArgs.addAll(list); - label_64: + label_65: while (true) { - if (jj_2_912(2)) { + if (jj_2_932(2)) { ; } else { - break label_64; + break label_65; } jj_consume_token(COMMA); list = JsonNameAndValue(); @@ -8709,7 +8934,7 @@ final public SqlCall JsonObjectFunctionCall() throws ParseException { } else { ; } - if (jj_2_914(2)) { + if (jj_2_934(2)) { e = JsonConstructorNullClause(); otherArgs[0] = e; } else { @@ -8736,7 +8961,7 @@ final public SqlCall JsonObjectAggFunctionCall() throws ParseException { list = JsonNameAndValue(); args[0] = list.get(0); args[1] = list.get(1); - if (jj_2_915(2)) { + if (jj_2_935(2)) { e = JsonConstructorNullClause(); nullClause = (SqlJsonConstructorNullClause) ((SqlLiteral) e).getValue(); } else { @@ -8756,14 +8981,14 @@ final public SqlCall JsonArrayFunctionCall() throws ParseException { jj_consume_token(JSON_ARRAY); span = span(); jj_consume_token(LPAREN); - if (jj_2_917(2)) { + if (jj_2_937(2)) { AddExpression(elements, ExprContext.ACCEPT_NON_QUERY); - label_65: + label_66: while (true) { - if (jj_2_916(2)) { + if (jj_2_936(2)) { ; } else { - break label_65; + break label_66; } jj_consume_token(COMMA); AddExpression(elements, ExprContext.ACCEPT_NON_QUERY); @@ -8771,7 +8996,7 @@ final public SqlCall JsonArrayFunctionCall() throws ParseException { } else { ; } - if (jj_2_918(2)) { + if (jj_2_938(2)) { e = JsonConstructorNullClause(); otherArgs[0] = e; } else { @@ -8804,12 +9029,12 @@ final public SqlCall JsonArrayAggFunctionCall() throws ParseException { jj_consume_token(LPAREN); e = Expression(ExprContext.ACCEPT_NON_QUERY); valueExpr = e; - if (jj_2_919(2)) { + if (jj_2_939(2)) { orderList = JsonArrayAggOrderByClause(); } else { orderList = null; } - if (jj_2_920(2)) { + if (jj_2_940(2)) { e = JsonConstructorNullClause(); nullClause = (SqlJsonConstructorNullClause) ((SqlLiteral) e).getValue(); } else { @@ -8818,7 +9043,7 @@ final public SqlCall JsonArrayAggFunctionCall() throws ParseException { jj_consume_token(RPAREN); aggCall = SqlStdOperatorTable.JSON_ARRAYAGG.with(nullClause) .createCall(span.end(this), valueExpr, orderList); - if (jj_2_921(2)) { + if (jj_2_941(2)) { e = withinGroup(aggCall); if (orderList != null) { {if (true) throw SqlUtil.newContextException(span.pos().plus(e.getParserPosition()), @@ -8851,9 +9076,9 @@ final public SqlCall ContainsSubstrFunctionCall() throws ParseException { AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(COMMA); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_922(2)) { + if (jj_2_942(2)) { jj_consume_token(RPAREN); - } else if (jj_2_923(2)) { + } else if (jj_2_943(2)) { jj_consume_token(COMMA); jj_consume_token(JSON_SCOPE); jj_consume_token(NAMED_ARGUMENT_ASSIGNMENT); @@ -8992,10 +9217,10 @@ final public SqlCall DateTruncFunctionCall() throws ParseException { jj_consume_token(LPAREN); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); jj_consume_token(COMMA); - if (jj_2_924(2)) { + if (jj_2_944(2)) { unit = TimeUnit(); args.add(unit); - } else if (jj_2_925(2)) { + } else if (jj_2_945(2)) { AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); } else { jj_consume_token(-1); @@ -9093,13 +9318,13 @@ final public SqlCall GroupByWindowingCall() throws ParseException { final Span s; final List args; final SqlOperator op; - if (jj_2_926(2)) { + if (jj_2_946(2)) { jj_consume_token(TUMBLE); op = SqlStdOperatorTable.TUMBLE_OLD; - } else if (jj_2_927(2)) { + } else if (jj_2_947(2)) { jj_consume_token(HOP); op = SqlStdOperatorTable.HOP_OLD; - } else if (jj_2_928(2)) { + } else if (jj_2_948(2)) { jj_consume_token(SESSION); op = SqlStdOperatorTable.SESSION_OLD; } else { @@ -9115,23 +9340,23 @@ final public SqlCall GroupByWindowingCall() throws ParseException { final public SqlCall MatchRecognizeFunctionCall() throws ParseException { final SqlCall func; final Span s; - if (jj_2_929(2)) { + if (jj_2_949(2)) { jj_consume_token(CLASSIFIER); s = span(); jj_consume_token(LPAREN); jj_consume_token(RPAREN); func = SqlStdOperatorTable.CLASSIFIER.createCall(s.end(this)); - } else if (jj_2_930(2)) { + } else if (jj_2_950(2)) { jj_consume_token(MATCH_NUMBER); s = span(); jj_consume_token(LPAREN); jj_consume_token(RPAREN); func = SqlStdOperatorTable.MATCH_NUMBER.createCall(s.end(this)); - } else if (jj_2_931(3)) { + } else if (jj_2_951(3)) { func = MatchRecognizeNavigationLogical(); - } else if (jj_2_932(2)) { + } else if (jj_2_952(2)) { func = MatchRecognizeNavigationPhysical(); - } else if (jj_2_933(2)) { + } else if (jj_2_953(2)) { func = MatchRecognizeCallWithModifier(); } else { jj_consume_token(-1); @@ -9144,11 +9369,11 @@ final public SqlCall MatchRecognizeFunctionCall() throws ParseException { final public SqlCall MatchRecognizeCallWithModifier() throws ParseException { final Span s; final SqlOperator runningOp; - final SqlNode func; - if (jj_2_934(2)) { + final SqlNode e; + if (jj_2_954(2)) { jj_consume_token(RUNNING); runningOp = SqlStdOperatorTable.RUNNING; - } else if (jj_2_935(2)) { + } else if (jj_2_955(2)) { jj_consume_token(FINAL); runningOp = SqlStdOperatorTable.FINAL; } else { @@ -9156,8 +9381,8 @@ final public SqlCall MatchRecognizeCallWithModifier() throws ParseException { throw new ParseException(); } s = span(); - func = NamedFunctionCall(); - {if (true) return runningOp.createCall(s.end(func), func);} + e = Expression3(ExprContext.ACCEPT_NON_QUERY); + {if (true) return runningOp.createCall(s.end(e), e);} throw new Error("Missing return statement in function"); } @@ -9168,19 +9393,19 @@ final public SqlCall MatchRecognizeNavigationLogical() throws ParseException { final SqlOperator runningOp; final List args = new ArrayList(); SqlNode e; - if (jj_2_936(2)) { + if (jj_2_956(2)) { jj_consume_token(RUNNING); runningOp = SqlStdOperatorTable.RUNNING; s.add(this); - } else if (jj_2_937(2)) { + } else if (jj_2_957(2)) { jj_consume_token(FINAL); runningOp = SqlStdOperatorTable.FINAL; s.add(this); } else { runningOp = null; } - if (jj_2_938(2)) { + if (jj_2_958(2)) { jj_consume_token(FIRST); funcOp = SqlStdOperatorTable.FIRST; - } else if (jj_2_939(2)) { + } else if (jj_2_959(2)) { jj_consume_token(LAST); funcOp = SqlStdOperatorTable.LAST; } else { @@ -9190,7 +9415,7 @@ final public SqlCall MatchRecognizeNavigationLogical() throws ParseException { s.add(this); jj_consume_token(LPAREN); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_940(2)) { + if (jj_2_960(2)) { jj_consume_token(COMMA); e = NumericLiteral(); args.add(e); @@ -9212,10 +9437,10 @@ final public SqlCall MatchRecognizeNavigationPhysical() throws ParseException { final SqlOperator funcOp; final List args = new ArrayList(); SqlNode e; - if (jj_2_941(2)) { + if (jj_2_961(2)) { jj_consume_token(PREV); funcOp = SqlStdOperatorTable.PREV; - } else if (jj_2_942(2)) { + } else if (jj_2_962(2)) { jj_consume_token(NEXT); funcOp = SqlStdOperatorTable.NEXT; } else { @@ -9225,7 +9450,7 @@ final public SqlCall MatchRecognizeNavigationPhysical() throws ParseException { s = span(); jj_consume_token(LPAREN); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_943(2)) { + if (jj_2_963(2)) { jj_consume_token(COMMA); e = NumericLiteral(); args.add(e); @@ -9267,12 +9492,12 @@ final public SqlCall withinGroup(SqlNode arg) throws ParseException { final public Pair NullTreatment() throws ParseException { final Span span; - if (jj_2_944(2)) { + if (jj_2_964(2)) { jj_consume_token(IGNORE); span = span(); jj_consume_token(NULLS); {if (true) return Pair.of(span.end(this), SqlStdOperatorTable.IGNORE_NULLS);} - } else if (jj_2_945(2)) { + } else if (jj_2_965(2)) { jj_consume_token(RESPECT); span = span(); jj_consume_token(NULLS); @@ -9312,7 +9537,7 @@ final public SqlNode NamedFunctionCall() throws ParseException { final SqlNode filter; final Span overSpan; final SqlNode over; - if (jj_2_946(2)) { + if (jj_2_966(2)) { call = StringAggFunctionCall(); } else { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -9321,8 +9546,8 @@ final public SqlNode NamedFunctionCall() throws ParseException { call = PercentileFunctionCall(); break; default: - jj_la1[7] = jj_gen; - if (jj_2_947(2)) { + jj_la1[8] = jj_gen; + if (jj_2_967(2)) { call = NamedCall(); } else { jj_consume_token(-1); @@ -9330,23 +9555,23 @@ final public SqlNode NamedFunctionCall() throws ParseException { } } } - if (jj_2_948(2)) { + if (jj_2_968(2)) { call = nullTreatment(call); } else { ; } - if (jj_2_949(2)) { + if (jj_2_969(2)) { // decide between WITHIN DISTINCT and WITHIN GROUP call = withinDistinct(call); } else { ; } - if (jj_2_950(2)) { + if (jj_2_970(2)) { call = withinGroup(call); } else { ; } - if (jj_2_951(2)) { + if (jj_2_971(2)) { jj_consume_token(FILTER); filterSpan = span(); jj_consume_token(LPAREN); @@ -9358,12 +9583,12 @@ final public SqlNode NamedFunctionCall() throws ParseException { } else { ; } - if (jj_2_954(2)) { + if (jj_2_974(2)) { jj_consume_token(OVER); overSpan = span(); - if (jj_2_952(2)) { + if (jj_2_972(2)) { over = SimpleIdentifier(); - } else if (jj_2_953(2)) { + } else if (jj_2_973(2)) { over = WindowSpecification(); } else { jj_consume_token(-1); @@ -9383,7 +9608,7 @@ final public SqlCall NamedCall() throws ParseException { final Span s; final List args; SqlLiteral quantifier = null; - if (jj_2_955(2)) { + if (jj_2_975(2)) { jj_consume_token(SPECIFIC); funcType = SqlFunctionCategory.USER_DEFINED_SPECIFIC_FUNCTION; } else { @@ -9391,16 +9616,16 @@ final public SqlCall NamedCall() throws ParseException { } qualifiedName = FunctionName(); s = span(); - if (jj_2_956(2)) { + if (jj_2_976(2)) { jj_consume_token(LPAREN); jj_consume_token(STAR); args = ImmutableList.of(SqlIdentifier.star(getPos())); jj_consume_token(RPAREN); - } else if (jj_2_957(2)) { + } else if (jj_2_977(2)) { jj_consume_token(LPAREN); jj_consume_token(RPAREN); args = ImmutableList.of(); - } else if (jj_2_958(2)) { + } else if (jj_2_978(2)) { args = FunctionParameterList(ExprContext.ACCEPT_SUB_QUERY); quantifier = (SqlLiteral) args.get(0); args.remove(0); @@ -9423,7 +9648,7 @@ final public SqlNode StandardFloorCeilOptions(Span s, boolean floorFlag) throws final Span s1; jj_consume_token(LPAREN); AddExpression(args, ExprContext.ACCEPT_SUB_QUERY); - if (jj_2_959(2)) { + if (jj_2_979(2)) { jj_consume_token(TO); unit = TimeUnitOrName(); args.add(unit); @@ -9433,12 +9658,12 @@ final public SqlNode StandardFloorCeilOptions(Span s, boolean floorFlag) throws jj_consume_token(RPAREN); SqlOperator op = SqlStdOperatorTable.floorCeil(floorFlag, this.conformance); function = op.createCall(s.end(this), args); - if (jj_2_962(2)) { + if (jj_2_982(2)) { jj_consume_token(OVER); s1 = span(); - if (jj_2_960(2)) { + if (jj_2_980(2)) { e = SimpleIdentifier(); - } else if (jj_2_961(2)) { + } else if (jj_2_981(2)) { e = WindowSpecification(); } else { jj_consume_token(-1); @@ -9466,9 +9691,9 @@ final public String NonReservedJdbcFunctionName() throws ParseException { */ final public SqlIdentifier FunctionName() throws ParseException { SqlIdentifier qualifiedName; - if (jj_2_963(2)) { + if (jj_2_983(2)) { qualifiedName = CompoundIdentifier(); - } else if (jj_2_964(2)) { + } else if (jj_2_984(2)) { qualifiedName = ReservedFunctionName(); } else { jj_consume_token(-1); @@ -9482,135 +9707,135 @@ final public SqlIdentifier FunctionName() throws ParseException { * Parses a reserved word which is used as the name of a function. */ final public SqlIdentifier ReservedFunctionName() throws ParseException { - if (jj_2_965(2)) { + if (jj_2_985(2)) { jj_consume_token(ABS); - } else if (jj_2_966(2)) { + } else if (jj_2_986(2)) { jj_consume_token(AVG); - } else if (jj_2_967(2)) { + } else if (jj_2_987(2)) { jj_consume_token(CARDINALITY); - } else if (jj_2_968(2)) { + } else if (jj_2_988(2)) { jj_consume_token(CEILING); - } else if (jj_2_969(2)) { + } else if (jj_2_989(2)) { jj_consume_token(CHAR); - } else if (jj_2_970(2)) { + } else if (jj_2_990(2)) { jj_consume_token(CHAR_LENGTH); - } else if (jj_2_971(2)) { + } else if (jj_2_991(2)) { jj_consume_token(CHARACTER_LENGTH); - } else if (jj_2_972(2)) { + } else if (jj_2_992(2)) { jj_consume_token(COALESCE); - } else if (jj_2_973(2)) { + } else if (jj_2_993(2)) { jj_consume_token(COLLECT); - } else if (jj_2_974(2)) { + } else if (jj_2_994(2)) { jj_consume_token(COVAR_POP); - } else if (jj_2_975(2)) { + } else if (jj_2_995(2)) { jj_consume_token(COVAR_SAMP); - } else if (jj_2_976(2)) { + } else if (jj_2_996(2)) { jj_consume_token(CUME_DIST); - } else if (jj_2_977(2)) { + } else if (jj_2_997(2)) { jj_consume_token(COUNT); - } else if (jj_2_978(2)) { + } else if (jj_2_998(2)) { jj_consume_token(CURRENT_DATE); - } else if (jj_2_979(2)) { + } else if (jj_2_999(2)) { jj_consume_token(CURRENT_TIME); - } else if (jj_2_980(2)) { + } else if (jj_2_1000(2)) { jj_consume_token(CURRENT_TIMESTAMP); - } else if (jj_2_981(2)) { + } else if (jj_2_1001(2)) { jj_consume_token(DENSE_RANK); - } else if (jj_2_982(2)) { + } else if (jj_2_1002(2)) { jj_consume_token(ELEMENT); - } else if (jj_2_983(2)) { + } else if (jj_2_1003(2)) { jj_consume_token(EVERY); - } else if (jj_2_984(2)) { + } else if (jj_2_1004(2)) { jj_consume_token(EXP); - } else if (jj_2_985(2)) { + } else if (jj_2_1005(2)) { jj_consume_token(FIRST_VALUE); - } else if (jj_2_986(2)) { + } else if (jj_2_1006(2)) { jj_consume_token(FLOOR); - } else if (jj_2_987(2)) { + } else if (jj_2_1007(2)) { jj_consume_token(FUSION); - } else if (jj_2_988(2)) { + } else if (jj_2_1008(2)) { jj_consume_token(INTERSECTION); - } else if (jj_2_989(2)) { + } else if (jj_2_1009(2)) { jj_consume_token(GROUPING); - } else if (jj_2_990(2)) { + } else if (jj_2_1010(2)) { jj_consume_token(HOUR); - } else if (jj_2_991(2)) { + } else if (jj_2_1011(2)) { jj_consume_token(LAG); - } else if (jj_2_992(2)) { + } else if (jj_2_1012(2)) { jj_consume_token(LEAD); - } else if (jj_2_993(2)) { + } else if (jj_2_1013(2)) { jj_consume_token(LEFT); - } else if (jj_2_994(2)) { + } else if (jj_2_1014(2)) { jj_consume_token(LAST_VALUE); - } else if (jj_2_995(2)) { + } else if (jj_2_1015(2)) { jj_consume_token(LN); - } else if (jj_2_996(2)) { + } else if (jj_2_1016(2)) { jj_consume_token(LOCALTIME); - } else if (jj_2_997(2)) { + } else if (jj_2_1017(2)) { jj_consume_token(LOCALTIMESTAMP); - } else if (jj_2_998(2)) { + } else if (jj_2_1018(2)) { jj_consume_token(LOWER); - } else if (jj_2_999(2)) { + } else if (jj_2_1019(2)) { jj_consume_token(MAX); - } else if (jj_2_1000(2)) { + } else if (jj_2_1020(2)) { jj_consume_token(MIN); - } else if (jj_2_1001(2)) { + } else if (jj_2_1021(2)) { jj_consume_token(MINUTE); - } else if (jj_2_1002(2)) { + } else if (jj_2_1022(2)) { jj_consume_token(MOD); - } else if (jj_2_1003(2)) { + } else if (jj_2_1023(2)) { jj_consume_token(MONTH); - } else if (jj_2_1004(2)) { + } else if (jj_2_1024(2)) { jj_consume_token(NTH_VALUE); - } else if (jj_2_1005(2)) { + } else if (jj_2_1025(2)) { jj_consume_token(NTILE); - } else if (jj_2_1006(2)) { + } else if (jj_2_1026(2)) { jj_consume_token(NULLIF); - } else if (jj_2_1007(2)) { + } else if (jj_2_1027(2)) { jj_consume_token(OCTET_LENGTH); - } else if (jj_2_1008(2)) { + } else if (jj_2_1028(2)) { jj_consume_token(PERCENTILE_CONT); - } else if (jj_2_1009(2)) { + } else if (jj_2_1029(2)) { jj_consume_token(PERCENTILE_DISC); - } else if (jj_2_1010(2)) { + } else if (jj_2_1030(2)) { jj_consume_token(PERCENT_RANK); - } else if (jj_2_1011(2)) { + } else if (jj_2_1031(2)) { jj_consume_token(POWER); - } else if (jj_2_1012(2)) { + } else if (jj_2_1032(2)) { jj_consume_token(RANK); - } else if (jj_2_1013(2)) { + } else if (jj_2_1033(2)) { jj_consume_token(REGR_COUNT); - } else if (jj_2_1014(2)) { + } else if (jj_2_1034(2)) { jj_consume_token(REGR_SXX); - } else if (jj_2_1015(2)) { + } else if (jj_2_1035(2)) { jj_consume_token(REGR_SYY); - } else if (jj_2_1016(2)) { + } else if (jj_2_1036(2)) { jj_consume_token(RIGHT); - } else if (jj_2_1017(2)) { + } else if (jj_2_1037(2)) { jj_consume_token(ROW_NUMBER); - } else if (jj_2_1018(2)) { + } else if (jj_2_1038(2)) { jj_consume_token(SECOND); - } else if (jj_2_1019(2)) { + } else if (jj_2_1039(2)) { jj_consume_token(SOME); - } else if (jj_2_1020(2)) { + } else if (jj_2_1040(2)) { jj_consume_token(SQRT); - } else if (jj_2_1021(2)) { + } else if (jj_2_1041(2)) { jj_consume_token(STDDEV_POP); - } else if (jj_2_1022(2)) { + } else if (jj_2_1042(2)) { jj_consume_token(STDDEV_SAMP); - } else if (jj_2_1023(2)) { + } else if (jj_2_1043(2)) { jj_consume_token(SUM); - } else if (jj_2_1024(2)) { + } else if (jj_2_1044(2)) { jj_consume_token(UPPER); - } else if (jj_2_1025(2)) { + } else if (jj_2_1045(2)) { jj_consume_token(TRUNCATE); - } else if (jj_2_1026(2)) { + } else if (jj_2_1046(2)) { jj_consume_token(USER); - } else if (jj_2_1027(2)) { + } else if (jj_2_1047(2)) { jj_consume_token(VAR_POP); - } else if (jj_2_1028(2)) { + } else if (jj_2_1048(2)) { jj_consume_token(VAR_SAMP); - } else if (jj_2_1029(2)) { + } else if (jj_2_1049(2)) { jj_consume_token(YEAR); } else { jj_consume_token(-1); @@ -9621,33 +9846,33 @@ final public SqlIdentifier ReservedFunctionName() throws ParseException { } final public SqlIdentifier ContextVariable() throws ParseException { - if (jj_2_1030(2)) { + if (jj_2_1050(2)) { jj_consume_token(CURRENT_CATALOG); - } else if (jj_2_1031(2)) { + } else if (jj_2_1051(2)) { jj_consume_token(CURRENT_DATE); - } else if (jj_2_1032(2)) { + } else if (jj_2_1052(2)) { jj_consume_token(CURRENT_DEFAULT_TRANSFORM_GROUP); - } else if (jj_2_1033(2)) { + } else if (jj_2_1053(2)) { jj_consume_token(CURRENT_PATH); - } else if (jj_2_1034(2)) { + } else if (jj_2_1054(2)) { jj_consume_token(CURRENT_ROLE); - } else if (jj_2_1035(2)) { + } else if (jj_2_1055(2)) { jj_consume_token(CURRENT_SCHEMA); - } else if (jj_2_1036(2)) { + } else if (jj_2_1056(2)) { jj_consume_token(CURRENT_TIME); - } else if (jj_2_1037(2)) { + } else if (jj_2_1057(2)) { jj_consume_token(CURRENT_TIMESTAMP); - } else if (jj_2_1038(2)) { + } else if (jj_2_1058(2)) { jj_consume_token(CURRENT_USER); - } else if (jj_2_1039(2)) { + } else if (jj_2_1059(2)) { jj_consume_token(LOCALTIME); - } else if (jj_2_1040(2)) { + } else if (jj_2_1060(2)) { jj_consume_token(LOCALTIMESTAMP); - } else if (jj_2_1041(2)) { + } else if (jj_2_1061(2)) { jj_consume_token(SESSION_USER); - } else if (jj_2_1042(2)) { + } else if (jj_2_1062(2)) { jj_consume_token(SYSTEM_USER); - } else if (jj_2_1043(2)) { + } else if (jj_2_1063(2)) { jj_consume_token(USER); } else { jj_consume_token(-1); @@ -9717,12 +9942,12 @@ final public SqlNode JdbcFunctionCall() throws ParseException { args = new SqlNodeList(call.getOperandList(), getPos()); break; default: - jj_la1[9] = jj_gen; - if (jj_2_1054(3)) { + jj_la1[10] = jj_gen; + if (jj_2_1074(3)) { call = TimestampDiffFunctionCall(); name = call.getOperator().getName(); args = new SqlNodeList(call.getOperandList(), getPos()); - } else if (jj_2_1055(2)) { + } else if (jj_2_1075(2)) { jj_consume_token(CONVERT); name = unquotedIdentifier(); jj_consume_token(LPAREN); @@ -9733,19 +9958,19 @@ final public SqlNode JdbcFunctionCall() throws ParseException { tl = JdbcOdbcDataType(); args.add(tl); jj_consume_token(RPAREN); - } else if (jj_2_1056(2)) { + } else if (jj_2_1076(2)) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case INSERT: case LEFT: case RIGHT: case TRUNCATE: - if (jj_2_1044(2)) { + if (jj_2_1064(2)) { jj_consume_token(INSERT); - } else if (jj_2_1045(2)) { + } else if (jj_2_1065(2)) { jj_consume_token(LEFT); - } else if (jj_2_1046(2)) { + } else if (jj_2_1066(2)) { jj_consume_token(RIGHT); - } else if (jj_2_1047(2)) { + } else if (jj_2_1067(2)) { jj_consume_token(TRUNCATE); } else { jj_consume_token(-1); @@ -9754,33 +9979,33 @@ final public SqlNode JdbcFunctionCall() throws ParseException { name = unquotedIdentifier(); break; default: - jj_la1[8] = jj_gen; - if (jj_2_1048(2)) { + jj_la1[9] = jj_gen; + if (jj_2_1068(2)) { // For cases like {fn power(1,2)} and {fn lower('a')} id = ReservedFunctionName(); name = id.getSimple(); - } else if (jj_2_1049(2)) { + } else if (jj_2_1069(2)) { // For cases like {fn substring('foo', 1,2)} name = NonReservedJdbcFunctionName(); - } else if (jj_2_1050(2)) { + } else if (jj_2_1070(2)) { name = Identifier(); } else { jj_consume_token(-1); throw new ParseException(); } } - if (jj_2_1051(2)) { + if (jj_2_1071(2)) { jj_consume_token(LPAREN); jj_consume_token(STAR); s1 = span(); jj_consume_token(RPAREN); args = new SqlNodeList(s1.pos()); args.add(SqlIdentifier.star(s1.pos())); - } else if (jj_2_1052(2)) { + } else if (jj_2_1072(2)) { jj_consume_token(LPAREN); jj_consume_token(RPAREN); args = SqlNodeList.EMPTY; - } else if (jj_2_1053(2)) { + } else if (jj_2_1073(2)) { args = ParenthesizedQueryOrCommaList(ExprContext.ACCEPT_SUB_QUERY); } else { jj_consume_token(-1); @@ -9801,32 +10026,32 @@ final public SqlNode JdbcFunctionCall() throws ParseException { * Parses a binary query operator like UNION. */ final public SqlBinaryOperator BinaryQueryOperator() throws ParseException { - if (jj_2_1065(2)) { + if (jj_2_1085(2)) { jj_consume_token(UNION); - if (jj_2_1057(2)) { + if (jj_2_1077(2)) { jj_consume_token(ALL); {if (true) return SqlStdOperatorTable.UNION_ALL;} - } else if (jj_2_1058(2)) { + } else if (jj_2_1078(2)) { jj_consume_token(DISTINCT); {if (true) return SqlStdOperatorTable.UNION;} } else { {if (true) return SqlStdOperatorTable.UNION;} } - } else if (jj_2_1066(2)) { + } else if (jj_2_1086(2)) { jj_consume_token(INTERSECT); - if (jj_2_1059(2)) { + if (jj_2_1079(2)) { jj_consume_token(ALL); {if (true) return SqlStdOperatorTable.INTERSECT_ALL;} - } else if (jj_2_1060(2)) { + } else if (jj_2_1080(2)) { jj_consume_token(DISTINCT); {if (true) return SqlStdOperatorTable.INTERSECT;} } else { {if (true) return SqlStdOperatorTable.INTERSECT;} } - } else if (jj_2_1067(2)) { - if (jj_2_1061(2)) { + } else if (jj_2_1087(2)) { + if (jj_2_1081(2)) { jj_consume_token(EXCEPT); - } else if (jj_2_1062(2)) { + } else if (jj_2_1082(2)) { jj_consume_token(SET_MINUS); if (!this.conformance.isMinusAllowed()) { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.minusNotAllowed());} @@ -9835,10 +10060,10 @@ final public SqlBinaryOperator BinaryQueryOperator() throws ParseException { jj_consume_token(-1); throw new ParseException(); } - if (jj_2_1063(2)) { + if (jj_2_1083(2)) { jj_consume_token(ALL); {if (true) return SqlStdOperatorTable.EXCEPT_ALL;} - } else if (jj_2_1064(2)) { + } else if (jj_2_1084(2)) { jj_consume_token(DISTINCT); {if (true) return SqlStdOperatorTable.EXCEPT;} } else { @@ -9856,12 +10081,12 @@ final public SqlBinaryOperator BinaryQueryOperator() throws ParseException { */ final public SqlBinaryOperator BinaryMultisetOperator() throws ParseException { jj_consume_token(MULTISET); - if (jj_2_1077(2)) { + if (jj_2_1097(2)) { jj_consume_token(UNION); - if (jj_2_1070(2)) { - if (jj_2_1068(2)) { + if (jj_2_1090(2)) { + if (jj_2_1088(2)) { jj_consume_token(ALL); - } else if (jj_2_1069(2)) { + } else if (jj_2_1089(2)) { jj_consume_token(DISTINCT); {if (true) return SqlStdOperatorTable.MULTISET_UNION_DISTINCT;} } else { @@ -9872,12 +10097,12 @@ final public SqlBinaryOperator BinaryMultisetOperator() throws ParseException { ; } {if (true) return SqlStdOperatorTable.MULTISET_UNION;} - } else if (jj_2_1078(2)) { + } else if (jj_2_1098(2)) { jj_consume_token(INTERSECT); - if (jj_2_1073(2)) { - if (jj_2_1071(2)) { + if (jj_2_1093(2)) { + if (jj_2_1091(2)) { jj_consume_token(ALL); - } else if (jj_2_1072(2)) { + } else if (jj_2_1092(2)) { jj_consume_token(DISTINCT); {if (true) return SqlStdOperatorTable.MULTISET_INTERSECT_DISTINCT;} } else { @@ -9888,12 +10113,12 @@ final public SqlBinaryOperator BinaryMultisetOperator() throws ParseException { ; } {if (true) return SqlStdOperatorTable.MULTISET_INTERSECT;} - } else if (jj_2_1079(2)) { + } else if (jj_2_1099(2)) { jj_consume_token(EXCEPT); - if (jj_2_1076(2)) { - if (jj_2_1074(2)) { + if (jj_2_1096(2)) { + if (jj_2_1094(2)) { jj_consume_token(ALL); - } else if (jj_2_1075(2)) { + } else if (jj_2_1095(2)) { jj_consume_token(DISTINCT); {if (true) return SqlStdOperatorTable.MULTISET_EXCEPT_DISTINCT;} } else { @@ -9916,105 +10141,114 @@ final public SqlBinaryOperator BinaryMultisetOperator() throws ParseException { */ final public SqlBinaryOperator BinaryRowOperator() throws ParseException { SqlBinaryOperator op; - if (jj_2_1080(2)) { + if (jj_2_1100(2)) { jj_consume_token(EQ); {if (true) return SqlStdOperatorTable.EQUALS;} - } else if (jj_2_1081(2)) { + } else if (jj_2_1101(2)) { + jj_consume_token(LEFTSHIFT); + {if (true) return SqlStdOperatorTable.BIT_LEFT_SHIFT;} + } else if (jj_2_1102(2)) { jj_consume_token(GT); {if (true) return SqlStdOperatorTable.GREATER_THAN;} - } else if (jj_2_1082(2)) { + } else if (jj_2_1103(2)) { jj_consume_token(LT); {if (true) return SqlStdOperatorTable.LESS_THAN;} - } else if (jj_2_1083(2)) { + } else if (jj_2_1104(2)) { jj_consume_token(LE); {if (true) return SqlStdOperatorTable.LESS_THAN_OR_EQUAL;} - } else if (jj_2_1084(2)) { + } else if (jj_2_1105(2)) { jj_consume_token(GE); {if (true) return SqlStdOperatorTable.GREATER_THAN_OR_EQUAL;} - } else if (jj_2_1085(2)) { + } else if (jj_2_1106(2)) { jj_consume_token(NE); {if (true) return SqlStdOperatorTable.NOT_EQUALS;} - } else if (jj_2_1086(2)) { + } else if (jj_2_1107(2)) { jj_consume_token(NE2); if (!this.conformance.isBangEqualAllowed()) { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.bangEqualNotAllowed());} } {if (true) return SqlStdOperatorTable.NOT_EQUALS;} - } else if (jj_2_1087(2)) { + } else if (jj_2_1108(2)) { jj_consume_token(PLUS); {if (true) return SqlStdOperatorTable.PLUS;} - } else if (jj_2_1088(2)) { + } else if (jj_2_1109(2)) { jj_consume_token(MINUS); {if (true) return SqlStdOperatorTable.MINUS;} - } else if (jj_2_1089(2)) { + } else if (jj_2_1110(2)) { jj_consume_token(STAR); {if (true) return SqlStdOperatorTable.MULTIPLY;} - } else if (jj_2_1090(2)) { + } else if (jj_2_1111(2)) { jj_consume_token(SLASH); {if (true) return SqlStdOperatorTable.DIVIDE;} - } else if (jj_2_1091(2)) { + } else if (jj_2_1112(2)) { jj_consume_token(PERCENT_REMAINDER); if (!this.conformance.isPercentRemainderAllowed()) { {if (true) throw SqlUtil.newContextException(getPos(), RESOURCE.percentRemainderNotAllowed());} } {if (true) return SqlStdOperatorTable.PERCENT_REMAINDER;} - } else if (jj_2_1092(2)) { + } else if (jj_2_1113(2)) { jj_consume_token(CONCAT); {if (true) return SqlStdOperatorTable.CONCAT;} - } else if (jj_2_1093(2)) { + } else if (jj_2_1114(2)) { jj_consume_token(AND); {if (true) return SqlStdOperatorTable.AND;} - } else if (jj_2_1094(2)) { + } else if (jj_2_1115(2)) { jj_consume_token(OR); {if (true) return SqlStdOperatorTable.OR;} - } else if (jj_2_1095(2)) { + } else if (jj_2_1116(2)) { jj_consume_token(IS); jj_consume_token(DISTINCT); jj_consume_token(FROM); {if (true) return SqlStdOperatorTable.IS_DISTINCT_FROM;} - } else if (jj_2_1096(2)) { + } else if (jj_2_1117(2)) { jj_consume_token(IS); jj_consume_token(NOT); jj_consume_token(DISTINCT); jj_consume_token(FROM); {if (true) return SqlStdOperatorTable.IS_NOT_DISTINCT_FROM;} - } else if (jj_2_1097(2)) { + } else if (jj_2_1118(2)) { jj_consume_token(MEMBER); jj_consume_token(OF); {if (true) return SqlStdOperatorTable.MEMBER_OF;} - } else if (jj_2_1098(2)) { + } else if (jj_2_1119(2)) { jj_consume_token(SUBMULTISET); jj_consume_token(OF); {if (true) return SqlStdOperatorTable.SUBMULTISET_OF;} - } else if (jj_2_1099(2)) { + } else if (jj_2_1120(2)) { jj_consume_token(NOT); jj_consume_token(SUBMULTISET); jj_consume_token(OF); {if (true) return SqlStdOperatorTable.NOT_SUBMULTISET_OF;} - } else if (jj_2_1100(2)) { + } else if (jj_2_1121(2)) { jj_consume_token(CONTAINS); {if (true) return SqlStdOperatorTable.CONTAINS;} - } else if (jj_2_1101(2)) { + } else if (jj_2_1122(2)) { jj_consume_token(OVERLAPS); {if (true) return SqlStdOperatorTable.OVERLAPS;} - } else if (jj_2_1102(2)) { + } else if (jj_2_1123(2)) { + jj_consume_token(CARET); + {if (true) return SqlStdOperatorTable.BITXOR_OPERATOR;} + } else if (jj_2_1124(2)) { jj_consume_token(EQUALS); {if (true) return SqlStdOperatorTable.PERIOD_EQUALS;} - } else if (jj_2_1103(2)) { + } else if (jj_2_1125(2)) { + jj_consume_token(AMPERSAND); + {if (true) return SqlStdOperatorTable.BITAND_OPERATOR;} + } else if (jj_2_1126(2)) { jj_consume_token(PRECEDES); {if (true) return SqlStdOperatorTable.PRECEDES;} - } else if (jj_2_1104(2)) { + } else if (jj_2_1127(2)) { jj_consume_token(SUCCEEDS); {if (true) return SqlStdOperatorTable.SUCCEEDS;} - } else if (jj_2_1105(2)) { + } else if (jj_2_1128(2)) { jj_consume_token(IMMEDIATELY); jj_consume_token(PRECEDES); {if (true) return SqlStdOperatorTable.IMMEDIATELY_PRECEDES;} - } else if (jj_2_1106(2)) { + } else if (jj_2_1129(2)) { jj_consume_token(IMMEDIATELY); jj_consume_token(SUCCEEDS); {if (true) return SqlStdOperatorTable.IMMEDIATELY_SUCCEEDS;} - } else if (jj_2_1107(2)) { + } else if (jj_2_1130(2)) { op = BinaryMultisetOperator(); {if (true) return op;} } else { @@ -10028,19 +10262,19 @@ final public SqlBinaryOperator BinaryRowOperator() throws ParseException { * Parses a prefix row operator like NOT. */ final public SqlPrefixOperator PrefixRowOperator() throws ParseException { - if (jj_2_1108(2)) { + if (jj_2_1131(2)) { jj_consume_token(PLUS); {if (true) return SqlStdOperatorTable.UNARY_PLUS;} - } else if (jj_2_1109(2)) { + } else if (jj_2_1132(2)) { jj_consume_token(MINUS); {if (true) return SqlStdOperatorTable.UNARY_MINUS;} - } else if (jj_2_1110(2)) { + } else if (jj_2_1133(2)) { jj_consume_token(NOT); {if (true) return SqlStdOperatorTable.NOT;} - } else if (jj_2_1111(2)) { + } else if (jj_2_1134(2)) { jj_consume_token(EXISTS); {if (true) return SqlStdOperatorTable.EXISTS;} - } else if (jj_2_1112(2)) { + } else if (jj_2_1135(2)) { jj_consume_token(UNIQUE); {if (true) return SqlStdOperatorTable.UNIQUE;} } else { @@ -10054,89 +10288,89 @@ final public SqlPrefixOperator PrefixRowOperator() throws ParseException { * Parses a postfix row operator like IS NOT NULL. */ final public SqlPostfixOperator PostfixRowOperator() throws ParseException { - if (jj_2_1137(2)) { + if (jj_2_1160(2)) { jj_consume_token(IS); - if (jj_2_1134(2)) { + if (jj_2_1157(2)) { jj_consume_token(A); jj_consume_token(SET); {if (true) return SqlStdOperatorTable.IS_A_SET;} - } else if (jj_2_1135(2)) { + } else if (jj_2_1158(2)) { jj_consume_token(NOT); - if (jj_2_1113(2)) { + if (jj_2_1136(2)) { jj_consume_token(NULL); {if (true) return SqlStdOperatorTable.IS_NOT_NULL;} - } else if (jj_2_1114(2)) { + } else if (jj_2_1137(2)) { jj_consume_token(TRUE); {if (true) return SqlStdOperatorTable.IS_NOT_TRUE;} - } else if (jj_2_1115(2)) { + } else if (jj_2_1138(2)) { jj_consume_token(FALSE); {if (true) return SqlStdOperatorTable.IS_NOT_FALSE;} - } else if (jj_2_1116(2)) { + } else if (jj_2_1139(2)) { jj_consume_token(UNKNOWN); {if (true) return SqlStdOperatorTable.IS_NOT_UNKNOWN;} - } else if (jj_2_1117(2)) { + } else if (jj_2_1140(2)) { jj_consume_token(A); jj_consume_token(SET); {if (true) return SqlStdOperatorTable.IS_NOT_A_SET;} - } else if (jj_2_1118(2)) { + } else if (jj_2_1141(2)) { jj_consume_token(EMPTY); {if (true) return SqlStdOperatorTable.IS_NOT_EMPTY;} - } else if (jj_2_1119(2)) { + } else if (jj_2_1142(2)) { jj_consume_token(JSON); jj_consume_token(VALUE); {if (true) return SqlStdOperatorTable.IS_NOT_JSON_VALUE;} - } else if (jj_2_1120(2)) { + } else if (jj_2_1143(2)) { jj_consume_token(JSON); jj_consume_token(OBJECT); {if (true) return SqlStdOperatorTable.IS_NOT_JSON_OBJECT;} - } else if (jj_2_1121(2)) { + } else if (jj_2_1144(2)) { jj_consume_token(JSON); jj_consume_token(ARRAY); {if (true) return SqlStdOperatorTable.IS_NOT_JSON_ARRAY;} - } else if (jj_2_1122(2)) { + } else if (jj_2_1145(2)) { jj_consume_token(JSON); jj_consume_token(SCALAR); {if (true) return SqlStdOperatorTable.IS_NOT_JSON_SCALAR;} - } else if (jj_2_1123(2)) { + } else if (jj_2_1146(2)) { jj_consume_token(JSON); {if (true) return SqlStdOperatorTable.IS_NOT_JSON_VALUE;} } else { jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_1136(2)) { - if (jj_2_1124(2)) { + } else if (jj_2_1159(2)) { + if (jj_2_1147(2)) { jj_consume_token(NULL); {if (true) return SqlStdOperatorTable.IS_NULL;} - } else if (jj_2_1125(2)) { + } else if (jj_2_1148(2)) { jj_consume_token(TRUE); {if (true) return SqlStdOperatorTable.IS_TRUE;} - } else if (jj_2_1126(2)) { + } else if (jj_2_1149(2)) { jj_consume_token(FALSE); {if (true) return SqlStdOperatorTable.IS_FALSE;} - } else if (jj_2_1127(2)) { + } else if (jj_2_1150(2)) { jj_consume_token(UNKNOWN); {if (true) return SqlStdOperatorTable.IS_UNKNOWN;} - } else if (jj_2_1128(2)) { + } else if (jj_2_1151(2)) { jj_consume_token(EMPTY); {if (true) return SqlStdOperatorTable.IS_EMPTY;} - } else if (jj_2_1129(2)) { + } else if (jj_2_1152(2)) { jj_consume_token(JSON); jj_consume_token(VALUE); {if (true) return SqlStdOperatorTable.IS_JSON_VALUE;} - } else if (jj_2_1130(2)) { + } else if (jj_2_1153(2)) { jj_consume_token(JSON); jj_consume_token(OBJECT); {if (true) return SqlStdOperatorTable.IS_JSON_OBJECT;} - } else if (jj_2_1131(2)) { + } else if (jj_2_1154(2)) { jj_consume_token(JSON); jj_consume_token(ARRAY); {if (true) return SqlStdOperatorTable.IS_JSON_ARRAY;} - } else if (jj_2_1132(2)) { + } else if (jj_2_1155(2)) { jj_consume_token(JSON); jj_consume_token(SCALAR); {if (true) return SqlStdOperatorTable.IS_JSON_SCALAR;} - } else if (jj_2_1133(2)) { + } else if (jj_2_1156(2)) { jj_consume_token(JSON); {if (true) return SqlStdOperatorTable.IS_JSON_VALUE;} } else { @@ -10147,7 +10381,7 @@ final public SqlPostfixOperator PostfixRowOperator() throws ParseException { jj_consume_token(-1); throw new ParseException(); } - } else if (jj_2_1138(2)) { + } else if (jj_2_1161(2)) { jj_consume_token(FORMAT); JsonRepresentation(); {if (true) return SqlStdOperatorTable.JSON_VALUE_EXPRESSION;} @@ -10173,11 +10407,11 @@ final public SqlPostfixOperator PostfixRowOperator() throws ParseException { * @see Glossary#SQL2003 SQL:2003 Part 2 Section 5.2 */ final public String NonReservedKeyWord() throws ParseException { - if (jj_2_1139(2)) { + if (jj_2_1162(2)) { NonReservedKeyWord0of3(); - } else if (jj_2_1140(2)) { + } else if (jj_2_1163(2)) { NonReservedKeyWord1of3(); - } else if (jj_2_1141(2)) { + } else if (jj_2_1164(2)) { NonReservedKeyWord2of3(); } else { jj_consume_token(-1); @@ -10189,450 +10423,450 @@ final public String NonReservedKeyWord() throws ParseException { /** @see #NonReservedKeyWord */ final public void NonReservedKeyWord0of3() throws ParseException { - if (jj_2_1142(2)) { + if (jj_2_1165(2)) { jj_consume_token(A); - } else if (jj_2_1143(2)) { + } else if (jj_2_1166(2)) { jj_consume_token(ACTION); - } else if (jj_2_1144(2)) { + } else if (jj_2_1167(2)) { jj_consume_token(ADMIN); - } else if (jj_2_1145(2)) { + } else if (jj_2_1168(2)) { jj_consume_token(APPLY); - } else if (jj_2_1146(2)) { + } else if (jj_2_1169(2)) { jj_consume_token(ASC); - } else if (jj_2_1147(2)) { + } else if (jj_2_1170(2)) { jj_consume_token(ATTRIBUTE); - } else if (jj_2_1148(2)) { + } else if (jj_2_1171(2)) { jj_consume_token(BERNOULLI); - } else if (jj_2_1149(2)) { + } else if (jj_2_1172(2)) { jj_consume_token(CASCADE); - } else if (jj_2_1150(2)) { + } else if (jj_2_1173(2)) { jj_consume_token(CENTURY); - } else if (jj_2_1151(2)) { + } else if (jj_2_1174(2)) { jj_consume_token(CHARACTERS); - } else if (jj_2_1152(2)) { + } else if (jj_2_1175(2)) { jj_consume_token(CHARACTER_SET_SCHEMA); - } else if (jj_2_1153(2)) { + } else if (jj_2_1176(2)) { jj_consume_token(COLLATION); - } else if (jj_2_1154(2)) { + } else if (jj_2_1177(2)) { jj_consume_token(COLLATION_SCHEMA); - } else if (jj_2_1155(2)) { + } else if (jj_2_1178(2)) { jj_consume_token(COMMAND_FUNCTION_CODE); - } else if (jj_2_1156(2)) { + } else if (jj_2_1179(2)) { jj_consume_token(CONDITION_NUMBER); - } else if (jj_2_1157(2)) { + } else if (jj_2_1180(2)) { jj_consume_token(CONSTRAINT_CATALOG); - } else if (jj_2_1158(2)) { + } else if (jj_2_1181(2)) { jj_consume_token(CONSTRAINT_SCHEMA); - } else if (jj_2_1159(2)) { + } else if (jj_2_1182(2)) { jj_consume_token(CONTINUE); - } else if (jj_2_1160(2)) { + } else if (jj_2_1183(2)) { jj_consume_token(DATABASE); - } else if (jj_2_1161(2)) { + } else if (jj_2_1184(2)) { jj_consume_token(DATETIME_DIFF); - } else if (jj_2_1162(2)) { + } else if (jj_2_1185(2)) { jj_consume_token(DATETIME_TRUNC); - } else if (jj_2_1163(2)) { + } else if (jj_2_1186(2)) { jj_consume_token(DAYS); - } else if (jj_2_1164(2)) { + } else if (jj_2_1187(2)) { jj_consume_token(DEFERRABLE); - } else if (jj_2_1165(2)) { + } else if (jj_2_1188(2)) { jj_consume_token(DEFINER); - } else if (jj_2_1166(2)) { + } else if (jj_2_1189(2)) { jj_consume_token(DERIVED); - } else if (jj_2_1167(2)) { + } else if (jj_2_1190(2)) { jj_consume_token(DESCRIPTOR); - } else if (jj_2_1168(2)) { + } else if (jj_2_1191(2)) { jj_consume_token(DOMAIN); - } else if (jj_2_1169(2)) { + } else if (jj_2_1192(2)) { jj_consume_token(DOT_FORMAT); - } else if (jj_2_1170(2)) { + } else if (jj_2_1193(2)) { jj_consume_token(ENCODING); - } else if (jj_2_1171(2)) { + } else if (jj_2_1194(2)) { jj_consume_token(EXCEPTION); - } else if (jj_2_1172(2)) { + } else if (jj_2_1195(2)) { jj_consume_token(FINAL); - } else if (jj_2_1173(2)) { + } else if (jj_2_1196(2)) { jj_consume_token(FORMAT); - } else if (jj_2_1174(2)) { + } else if (jj_2_1197(2)) { jj_consume_token(FRAC_SECOND); - } else if (jj_2_1175(2)) { + } else if (jj_2_1198(2)) { jj_consume_token(GENERATED); - } else if (jj_2_1176(2)) { + } else if (jj_2_1199(2)) { jj_consume_token(GOTO); - } else if (jj_2_1177(2)) { + } else if (jj_2_1200(2)) { jj_consume_token(HIERARCHY); - } else if (jj_2_1178(2)) { + } else if (jj_2_1201(2)) { jj_consume_token(IGNORE); - } else if (jj_2_1179(2)) { + } else if (jj_2_1202(2)) { jj_consume_token(IMMEDIATELY); - } else if (jj_2_1180(2)) { + } else if (jj_2_1203(2)) { jj_consume_token(INCLUDING); - } else if (jj_2_1181(2)) { + } else if (jj_2_1204(2)) { jj_consume_token(INPUT); - } else if (jj_2_1182(2)) { + } else if (jj_2_1205(2)) { jj_consume_token(INVOKER); - } else if (jj_2_1183(2)) { + } else if (jj_2_1206(2)) { jj_consume_token(ISOYEAR); - } else if (jj_2_1184(2)) { + } else if (jj_2_1207(2)) { jj_consume_token(K); - } else if (jj_2_1185(2)) { + } else if (jj_2_1208(2)) { jj_consume_token(KEY_TYPE); - } else if (jj_2_1186(2)) { + } else if (jj_2_1209(2)) { jj_consume_token(LENGTH); - } else if (jj_2_1187(2)) { + } else if (jj_2_1210(2)) { jj_consume_token(LOCATOR); - } else if (jj_2_1188(2)) { + } else if (jj_2_1211(2)) { jj_consume_token(MATCHED); - } else if (jj_2_1189(2)) { + } else if (jj_2_1212(2)) { jj_consume_token(MESSAGE_OCTET_LENGTH); - } else if (jj_2_1190(2)) { + } else if (jj_2_1213(2)) { jj_consume_token(MILLENNIUM); - } else if (jj_2_1191(2)) { + } else if (jj_2_1214(2)) { jj_consume_token(MINVALUE); - } else if (jj_2_1192(2)) { + } else if (jj_2_1215(2)) { jj_consume_token(MUMPS); - } else if (jj_2_1193(2)) { + } else if (jj_2_1216(2)) { jj_consume_token(NANOSECOND); - } else if (jj_2_1194(2)) { + } else if (jj_2_1217(2)) { jj_consume_token(NULLABLE); - } else if (jj_2_1195(2)) { + } else if (jj_2_1218(2)) { jj_consume_token(OBJECT); - } else if (jj_2_1196(2)) { + } else if (jj_2_1219(2)) { jj_consume_token(OPTIONS); - } else if (jj_2_1197(2)) { + } else if (jj_2_1220(2)) { jj_consume_token(OTHERS); - } else if (jj_2_1198(2)) { + } else if (jj_2_1221(2)) { jj_consume_token(PAD); - } else if (jj_2_1199(2)) { + } else if (jj_2_1222(2)) { jj_consume_token(PARAMETER_ORDINAL_POSITION); - } else if (jj_2_1200(2)) { + } else if (jj_2_1223(2)) { jj_consume_token(PARAMETER_SPECIFIC_SCHEMA); - } else if (jj_2_1201(2)) { + } else if (jj_2_1224(2)) { jj_consume_token(PASSING); - } else if (jj_2_1202(2)) { + } else if (jj_2_1225(2)) { jj_consume_token(PATH); - } else if (jj_2_1203(2)) { + } else if (jj_2_1226(2)) { jj_consume_token(PLAN); - } else if (jj_2_1204(2)) { + } else if (jj_2_1227(2)) { jj_consume_token(PRESERVE); - } else if (jj_2_1205(2)) { + } else if (jj_2_1228(2)) { jj_consume_token(PUBLIC); - } else if (jj_2_1206(2)) { + } else if (jj_2_1229(2)) { jj_consume_token(READ); - } else if (jj_2_1207(2)) { + } else if (jj_2_1230(2)) { jj_consume_token(REPLACE); - } else if (jj_2_1208(2)) { + } else if (jj_2_1231(2)) { jj_consume_token(RESTRICT); - } else if (jj_2_1209(2)) { + } else if (jj_2_1232(2)) { jj_consume_token(RETURNED_OCTET_LENGTH); - } else if (jj_2_1210(2)) { + } else if (jj_2_1233(2)) { jj_consume_token(RLIKE); - } else if (jj_2_1211(2)) { + } else if (jj_2_1234(2)) { jj_consume_token(ROUTINE_CATALOG); - } else if (jj_2_1212(2)) { + } else if (jj_2_1235(2)) { jj_consume_token(ROW_COUNT); - } else if (jj_2_1213(2)) { + } else if (jj_2_1236(2)) { jj_consume_token(SCHEMA); - } else if (jj_2_1214(2)) { + } else if (jj_2_1237(2)) { jj_consume_token(SCOPE_NAME); - } else if (jj_2_1215(2)) { + } else if (jj_2_1238(2)) { jj_consume_token(SECTION); - } else if (jj_2_1216(2)) { + } else if (jj_2_1239(2)) { jj_consume_token(SEPARATOR); - } else if (jj_2_1217(2)) { + } else if (jj_2_1240(2)) { jj_consume_token(SERVER); - } else if (jj_2_1218(2)) { + } else if (jj_2_1241(2)) { jj_consume_token(SETS); - } else if (jj_2_1219(2)) { + } else if (jj_2_1242(2)) { jj_consume_token(SOURCE); - } else if (jj_2_1220(2)) { + } else if (jj_2_1243(2)) { jj_consume_token(SQL_BIGINT); - } else if (jj_2_1221(2)) { + } else if (jj_2_1244(2)) { jj_consume_token(SQL_BLOB); - } else if (jj_2_1222(2)) { + } else if (jj_2_1245(2)) { jj_consume_token(SQL_CLOB); - } else if (jj_2_1223(2)) { + } else if (jj_2_1246(2)) { jj_consume_token(SQL_DOUBLE); - } else if (jj_2_1224(2)) { + } else if (jj_2_1247(2)) { jj_consume_token(SQL_INTERVAL_DAY); - } else if (jj_2_1225(2)) { + } else if (jj_2_1248(2)) { jj_consume_token(SQL_INTERVAL_DAY_TO_SECOND); - } else if (jj_2_1226(2)) { + } else if (jj_2_1249(2)) { jj_consume_token(SQL_INTERVAL_HOUR_TO_SECOND); - } else if (jj_2_1227(2)) { + } else if (jj_2_1250(2)) { jj_consume_token(SQL_INTERVAL_MONTH); - } else if (jj_2_1228(2)) { + } else if (jj_2_1251(2)) { jj_consume_token(SQL_INTERVAL_YEAR_TO_MONTH); - } else if (jj_2_1229(2)) { + } else if (jj_2_1252(2)) { jj_consume_token(SQL_LONGVARNCHAR); - } else if (jj_2_1230(2)) { + } else if (jj_2_1253(2)) { jj_consume_token(SQL_NUMERIC); - } else if (jj_2_1231(2)) { + } else if (jj_2_1254(2)) { jj_consume_token(SQL_SMALLINT); - } else if (jj_2_1232(2)) { + } else if (jj_2_1255(2)) { jj_consume_token(SQL_TINYINT); - } else if (jj_2_1233(2)) { + } else if (jj_2_1256(2)) { jj_consume_token(SQL_TSI_HOUR); - } else if (jj_2_1234(2)) { + } else if (jj_2_1257(2)) { jj_consume_token(SQL_TSI_MONTH); - } else if (jj_2_1235(2)) { + } else if (jj_2_1258(2)) { jj_consume_token(SQL_TSI_WEEK); - } else if (jj_2_1236(2)) { + } else if (jj_2_1259(2)) { jj_consume_token(SQL_VARCHAR); - } else if (jj_2_1237(2)) { + } else if (jj_2_1260(2)) { jj_consume_token(STRING_AGG); - } else if (jj_2_1238(2)) { + } else if (jj_2_1261(2)) { jj_consume_token(SUBCLASS_ORIGIN); - } else if (jj_2_1239(2)) { + } else if (jj_2_1262(2)) { jj_consume_token(TEMPORARY); - } else if (jj_2_1240(2)) { + } else if (jj_2_1263(2)) { jj_consume_token(TIME_TRUNC); - } else if (jj_2_1241(2)) { + } else if (jj_2_1264(2)) { jj_consume_token(TIMESTAMP_DIFF); - } else if (jj_2_1242(2)) { + } else if (jj_2_1265(2)) { jj_consume_token(TRANSACTION); - } else if (jj_2_1243(2)) { + } else if (jj_2_1266(2)) { jj_consume_token(TRANSACTIONS_ROLLED_BACK); - } else if (jj_2_1244(2)) { + } else if (jj_2_1267(2)) { jj_consume_token(TRIGGER_CATALOG); - } else if (jj_2_1245(2)) { + } else if (jj_2_1268(2)) { jj_consume_token(TUMBLE); - } else if (jj_2_1246(2)) { + } else if (jj_2_1269(2)) { jj_consume_token(UNCOMMITTED); - } else if (jj_2_1247(2)) { + } else if (jj_2_1270(2)) { jj_consume_token(UNPIVOT); - } else if (jj_2_1248(2)) { + } else if (jj_2_1271(2)) { jj_consume_token(USER_DEFINED_TYPE_CATALOG); - } else if (jj_2_1249(2)) { + } else if (jj_2_1272(2)) { jj_consume_token(USER_DEFINED_TYPE_SCHEMA); - } else if (jj_2_1250(2)) { + } else if (jj_2_1273(2)) { jj_consume_token(UTF8); - } else if (jj_2_1251(2)) { + } else if (jj_2_1274(2)) { jj_consume_token(WEEK); - } else if (jj_2_1252(2)) { + } else if (jj_2_1275(2)) { jj_consume_token(WRAPPER); - } else if (jj_2_1253(2)) { + } else if (jj_2_1276(2)) { jj_consume_token(YEARS); - } else if (jj_2_1254(2)) { + } else if (jj_2_1277(2)) { jj_consume_token(BACKUPS); - } else if (jj_2_1255(2)) { + } else if (jj_2_1278(2)) { jj_consume_token(WRITE_SYNCHRONIZATION_MODE); - } else if (jj_2_1256(2)) { + } else if (jj_2_1279(2)) { jj_consume_token(DATA_REGION); - } else if (jj_2_1257(2)) { + } else if (jj_2_1280(2)) { jj_consume_token(WRAP_VALUE); - } else if (jj_2_1258(2)) { + } else if (jj_2_1281(2)) { jj_consume_token(INLINE_SIZE); - } else if (jj_2_1259(2)) { + } else if (jj_2_1282(2)) { jj_consume_token(PASSWORD); - } else if (jj_2_1260(2)) { + } else if (jj_2_1283(2)) { jj_consume_token(CONTINUOUS); - } else if (jj_2_1261(2)) { + } else if (jj_2_1284(2)) { jj_consume_token(ASYNC); - } else if (jj_2_1262(2)) { + } else if (jj_2_1285(2)) { jj_consume_token(REFRESH); - } else if (jj_2_1263(2)) { + } else if (jj_2_1286(2)) { jj_consume_token(TOTAL); - } else if (jj_2_1264(2)) { + } else if (jj_2_1287(2)) { jj_consume_token(ALLOW); - } else if (jj_2_1265(2)) { + } else if (jj_2_1288(2)) { jj_consume_token(ASENSITIVE); - } else if (jj_2_1266(2)) { + } else if (jj_2_1289(2)) { jj_consume_token(ATOMIC); - } else if (jj_2_1267(2)) { + } else if (jj_2_1290(2)) { jj_consume_token(BEGIN); - } else if (jj_2_1268(2)) { + } else if (jj_2_1291(2)) { jj_consume_token(BIGINT); - } else if (jj_2_1269(2)) { + } else if (jj_2_1292(2)) { jj_consume_token(BLOB); - } else if (jj_2_1270(2)) { + } else if (jj_2_1293(2)) { jj_consume_token(CALLED); - } else if (jj_2_1271(2)) { + } else if (jj_2_1294(2)) { jj_consume_token(CEIL); - } else if (jj_2_1272(2)) { + } else if (jj_2_1295(2)) { jj_consume_token(CHARACTER); - } else if (jj_2_1273(2)) { + } else if (jj_2_1296(2)) { jj_consume_token(CHECK); - } else if (jj_2_1274(2)) { + } else if (jj_2_1297(2)) { jj_consume_token(CLOSE); - } else if (jj_2_1275(2)) { + } else if (jj_2_1298(2)) { jj_consume_token(COLLECT); - } else if (jj_2_1276(2)) { + } else if (jj_2_1299(2)) { jj_consume_token(CONNECT); - } else if (jj_2_1277(2)) { + } else if (jj_2_1300(2)) { jj_consume_token(CORR); - } else if (jj_2_1278(2)) { + } else if (jj_2_1301(2)) { jj_consume_token(COVAR_POP); - } else if (jj_2_1279(2)) { + } else if (jj_2_1302(2)) { jj_consume_token(CUME_DIST); - } else if (jj_2_1280(2)) { + } else if (jj_2_1303(2)) { jj_consume_token(CURRENT_DEFAULT_TRANSFORM_GROUP); - } else if (jj_2_1281(2)) { + } else if (jj_2_1304(2)) { jj_consume_token(CURRENT_ROW); - } else if (jj_2_1282(2)) { + } else if (jj_2_1305(2)) { jj_consume_token(CYCLE); - } else if (jj_2_1283(2)) { + } else if (jj_2_1306(2)) { jj_consume_token(DAY); - } else if (jj_2_1284(2)) { + } else if (jj_2_1307(2)) { jj_consume_token(DECIMAL); - } else if (jj_2_1285(2)) { + } else if (jj_2_1308(2)) { jj_consume_token(DENSE_RANK); - } else if (jj_2_1286(2)) { + } else if (jj_2_1309(2)) { jj_consume_token(DETERMINISTIC); - } else if (jj_2_1287(2)) { + } else if (jj_2_1310(2)) { jj_consume_token(DOUBLE); - } else if (jj_2_1288(2)) { + } else if (jj_2_1311(2)) { jj_consume_token(ELEMENT); - } else if (jj_2_1289(2)) { + } else if (jj_2_1312(2)) { jj_consume_token(END_EXEC); - } else if (jj_2_1290(2)) { + } else if (jj_2_1313(2)) { jj_consume_token(EQUALS); - } else if (jj_2_1291(2)) { + } else if (jj_2_1314(2)) { jj_consume_token(EXEC); - } else if (jj_2_1292(2)) { + } else if (jj_2_1315(2)) { jj_consume_token(EXTEND); - } else if (jj_2_1293(2)) { + } else if (jj_2_1316(2)) { jj_consume_token(FILTER); - } else if (jj_2_1294(2)) { + } else if (jj_2_1317(2)) { jj_consume_token(FLOOR); - } else if (jj_2_1295(2)) { + } else if (jj_2_1318(2)) { jj_consume_token(FREE); - } else if (jj_2_1296(2)) { + } else if (jj_2_1319(2)) { jj_consume_token(GET); - } else if (jj_2_1297(2)) { + } else if (jj_2_1320(2)) { jj_consume_token(GROUPING); - } else if (jj_2_1298(2)) { + } else if (jj_2_1321(2)) { jj_consume_token(HOUR); - } else if (jj_2_1299(2)) { + } else if (jj_2_1322(2)) { jj_consume_token(INDICATOR); - } else if (jj_2_1300(2)) { + } else if (jj_2_1323(2)) { jj_consume_token(INSENSITIVE); - } else if (jj_2_1301(2)) { + } else if (jj_2_1324(2)) { jj_consume_token(INTERSECTION); - } else if (jj_2_1302(2)) { + } else if (jj_2_1325(2)) { jj_consume_token(JSON_EXISTS); - } else if (jj_2_1303(2)) { + } else if (jj_2_1326(2)) { jj_consume_token(JSON_QUERY); - } else if (jj_2_1304(2)) { + } else if (jj_2_1327(2)) { jj_consume_token(LAG); - } else if (jj_2_1305(2)) { + } else if (jj_2_1328(2)) { jj_consume_token(LAST_VALUE); - } else if (jj_2_1306(2)) { + } else if (jj_2_1329(2)) { jj_consume_token(LIKE_REGEX); - } else if (jj_2_1307(2)) { + } else if (jj_2_1330(2)) { jj_consume_token(LOWER); - } else if (jj_2_1308(2)) { + } else if (jj_2_1331(2)) { jj_consume_token(MATCH_CONDITION); - } else if (jj_2_1309(2)) { + } else if (jj_2_1332(2)) { jj_consume_token(MAX); - } else if (jj_2_1310(2)) { + } else if (jj_2_1333(2)) { jj_consume_token(MEMBER); - } else if (jj_2_1311(2)) { + } else if (jj_2_1334(2)) { jj_consume_token(MINUTE); - } else if (jj_2_1312(2)) { + } else if (jj_2_1335(2)) { jj_consume_token(MODULE); - } else if (jj_2_1313(2)) { + } else if (jj_2_1336(2)) { jj_consume_token(NATIONAL); - } else if (jj_2_1314(2)) { + } else if (jj_2_1337(2)) { jj_consume_token(NEW); - } else if (jj_2_1315(2)) { + } else if (jj_2_1338(2)) { jj_consume_token(NONE); - } else if (jj_2_1316(2)) { + } else if (jj_2_1339(2)) { jj_consume_token(NTILE); - } else if (jj_2_1317(2)) { + } else if (jj_2_1340(2)) { jj_consume_token(OCCURRENCES_REGEX); - } else if (jj_2_1318(2)) { + } else if (jj_2_1341(2)) { jj_consume_token(OLD); - } else if (jj_2_1319(2)) { + } else if (jj_2_1342(2)) { jj_consume_token(ONLY); - } else if (jj_2_1320(2)) { + } else if (jj_2_1343(2)) { jj_consume_token(OUT); - } else if (jj_2_1321(2)) { + } else if (jj_2_1344(2)) { jj_consume_token(OVERLAY); - } else if (jj_2_1322(2)) { + } else if (jj_2_1345(2)) { jj_consume_token(PER); - } else if (jj_2_1323(2)) { + } else if (jj_2_1346(2)) { jj_consume_token(PERCENTILE_DISC); - } else if (jj_2_1324(2)) { + } else if (jj_2_1347(2)) { jj_consume_token(PERMUTE); - } else if (jj_2_1325(2)) { + } else if (jj_2_1348(2)) { jj_consume_token(POSITION_REGEX); - } else if (jj_2_1326(2)) { + } else if (jj_2_1349(2)) { jj_consume_token(PRECISION); - } else if (jj_2_1327(2)) { + } else if (jj_2_1350(2)) { jj_consume_token(PROCEDURE); - } else if (jj_2_1328(2)) { + } else if (jj_2_1351(2)) { jj_consume_token(RANK); - } else if (jj_2_1329(2)) { + } else if (jj_2_1352(2)) { jj_consume_token(RECURSIVE); - } else if (jj_2_1330(2)) { + } else if (jj_2_1353(2)) { jj_consume_token(REFERENCING); - } else if (jj_2_1331(2)) { + } else if (jj_2_1354(2)) { jj_consume_token(REGR_COUNT); - } else if (jj_2_1332(2)) { + } else if (jj_2_1355(2)) { jj_consume_token(REGR_SLOPE); - } else if (jj_2_1333(2)) { + } else if (jj_2_1356(2)) { jj_consume_token(REGR_SYY); - } else if (jj_2_1334(2)) { + } else if (jj_2_1357(2)) { jj_consume_token(RESULT); - } else if (jj_2_1335(2)) { + } else if (jj_2_1358(2)) { jj_consume_token(REVOKE); - } else if (jj_2_1336(2)) { + } else if (jj_2_1359(2)) { jj_consume_token(ROWS); - } else if (jj_2_1337(2)) { + } else if (jj_2_1360(2)) { jj_consume_token(SAFE_CAST); - } else if (jj_2_1338(2)) { + } else if (jj_2_1361(2)) { jj_consume_token(SAVEPOINT); - } else if (jj_2_1339(2)) { + } else if (jj_2_1362(2)) { jj_consume_token(SEARCH); - } else if (jj_2_1340(2)) { + } else if (jj_2_1363(2)) { jj_consume_token(SENSITIVE); - } else if (jj_2_1341(2)) { + } else if (jj_2_1364(2)) { jj_consume_token(SIMILAR); - } else if (jj_2_1342(2)) { + } else if (jj_2_1365(2)) { jj_consume_token(SPECIFIC); - } else if (jj_2_1343(2)) { + } else if (jj_2_1366(2)) { jj_consume_token(SQLEXCEPTION); - } else if (jj_2_1344(2)) { + } else if (jj_2_1367(2)) { jj_consume_token(SQRT); - } else if (jj_2_1345(2)) { + } else if (jj_2_1368(2)) { jj_consume_token(STDDEV_POP); - } else if (jj_2_1346(2)) { + } else if (jj_2_1369(2)) { jj_consume_token(SUBMULTISET); - } else if (jj_2_1347(2)) { + } else if (jj_2_1370(2)) { jj_consume_token(SUBSTRING_REGEX); - } else if (jj_2_1348(2)) { + } else if (jj_2_1371(2)) { jj_consume_token(SYSTEM); - } else if (jj_2_1349(2)) { + } else if (jj_2_1372(2)) { jj_consume_token(TABLESAMPLE); - } else if (jj_2_1350(2)) { + } else if (jj_2_1373(2)) { jj_consume_token(TIMEZONE_HOUR); - } else if (jj_2_1351(2)) { + } else if (jj_2_1374(2)) { jj_consume_token(TRANSLATE); - } else if (jj_2_1352(2)) { + } else if (jj_2_1375(2)) { jj_consume_token(TREAT); - } else if (jj_2_1353(2)) { + } else if (jj_2_1376(2)) { jj_consume_token(TRIM_ARRAY); - } else if (jj_2_1354(2)) { + } else if (jj_2_1377(2)) { jj_consume_token(UESCAPE); - } else if (jj_2_1355(2)) { - jj_consume_token(UPPER); - } else if (jj_2_1356(2)) { - jj_consume_token(VALUE); - } else if (jj_2_1357(2)) { - jj_consume_token(VARIANT); - } else if (jj_2_1358(2)) { - jj_consume_token(VAR_POP); - } else if (jj_2_1359(2)) { - jj_consume_token(WHENEVER); - } else if (jj_2_1360(2)) { - jj_consume_token(WITHIN); - } else if (jj_2_1361(2)) { - jj_consume_token(MONDAY); - } else if (jj_2_1362(2)) { - jj_consume_token(THURSDAY); - } else if (jj_2_1363(2)) { - jj_consume_token(SUNDAY); + } else if (jj_2_1378(2)) { + jj_consume_token(UNSIGNED); + } else if (jj_2_1379(2)) { + jj_consume_token(UUID); + } else if (jj_2_1380(2)) { + jj_consume_token(VARBINARY); + } else if (jj_2_1381(2)) { + jj_consume_token(VARYING); + } else if (jj_2_1382(2)) { + jj_consume_token(VERSIONING); + } else if (jj_2_1383(2)) { + jj_consume_token(WINDOW); + } else if (jj_2_1384(2)) { + jj_consume_token(YEAR); + } else if (jj_2_1385(2)) { + jj_consume_token(WEDNESDAY); + } else if (jj_2_1386(2)) { + jj_consume_token(SATURDAY); } else { jj_consume_token(-1); throw new ParseException(); @@ -10641,448 +10875,450 @@ final public void NonReservedKeyWord0of3() throws ParseException { /** @see #NonReservedKeyWord */ final public void NonReservedKeyWord1of3() throws ParseException { - if (jj_2_1364(2)) { + if (jj_2_1387(2)) { jj_consume_token(ABSENT); - } else if (jj_2_1365(2)) { + } else if (jj_2_1388(2)) { jj_consume_token(ADA); - } else if (jj_2_1366(2)) { + } else if (jj_2_1389(2)) { jj_consume_token(AFTER); - } else if (jj_2_1367(2)) { + } else if (jj_2_1390(2)) { jj_consume_token(ARRAY_AGG); - } else if (jj_2_1368(2)) { + } else if (jj_2_1391(2)) { jj_consume_token(ASSERTION); - } else if (jj_2_1369(2)) { + } else if (jj_2_1392(2)) { jj_consume_token(ATTRIBUTES); - } else if (jj_2_1370(2)) { + } else if (jj_2_1393(2)) { jj_consume_token(BREADTH); - } else if (jj_2_1371(2)) { + } else if (jj_2_1394(2)) { jj_consume_token(CATALOG); - } else if (jj_2_1372(2)) { + } else if (jj_2_1395(2)) { jj_consume_token(CHAIN); - } else if (jj_2_1373(2)) { + } else if (jj_2_1396(2)) { jj_consume_token(CHARACTER_SET_CATALOG); - } else if (jj_2_1374(2)) { + } else if (jj_2_1397(2)) { jj_consume_token(CLASS_ORIGIN); - } else if (jj_2_1375(2)) { + } else if (jj_2_1398(2)) { jj_consume_token(COLLATION_CATALOG); - } else if (jj_2_1376(2)) { + } else if (jj_2_1399(2)) { jj_consume_token(COLUMN_NAME); - } else if (jj_2_1377(2)) { + } else if (jj_2_1400(2)) { jj_consume_token(COMMITTED); - } else if (jj_2_1378(2)) { + } else if (jj_2_1401(2)) { jj_consume_token(CONNECTION); - } else if (jj_2_1379(2)) { + } else if (jj_2_1402(2)) { jj_consume_token(CONSTRAINT_NAME); - } else if (jj_2_1380(2)) { + } else if (jj_2_1403(2)) { jj_consume_token(CONSTRUCTOR); - } else if (jj_2_1381(2)) { + } else if (jj_2_1404(2)) { jj_consume_token(CURSOR_NAME); - } else if (jj_2_1382(2)) { + } else if (jj_2_1405(2)) { jj_consume_token(DATE_DIFF); - } else if (jj_2_1383(2)) { + } else if (jj_2_1406(2)) { jj_consume_token(DATETIME_INTERVAL_CODE); - } else if (jj_2_1384(2)) { + } else if (jj_2_1407(2)) { jj_consume_token(DAYOFWEEK); - } else if (jj_2_1385(2)) { + } else if (jj_2_1408(2)) { jj_consume_token(DECADE); - } else if (jj_2_1386(2)) { + } else if (jj_2_1409(2)) { jj_consume_token(DEFERRED); - } else if (jj_2_1387(2)) { + } else if (jj_2_1410(2)) { jj_consume_token(DEGREE); - } else if (jj_2_1388(2)) { + } else if (jj_2_1411(2)) { jj_consume_token(DESC); - } else if (jj_2_1389(2)) { + } else if (jj_2_1412(2)) { jj_consume_token(DIAGNOSTICS); - } else if (jj_2_1390(2)) { + } else if (jj_2_1413(2)) { jj_consume_token(DOW); - } else if (jj_2_1391(2)) { + } else if (jj_2_1414(2)) { jj_consume_token(DYNAMIC_FUNCTION); - } else if (jj_2_1392(2)) { + } else if (jj_2_1415(2)) { jj_consume_token(EPOCH); - } else if (jj_2_1393(2)) { + } else if (jj_2_1416(2)) { jj_consume_token(EXCLUDE); - } else if (jj_2_1394(2)) { + } else if (jj_2_1417(2)) { jj_consume_token(FIRST); - } else if (jj_2_1395(2)) { + } else if (jj_2_1418(2)) { jj_consume_token(FORTRAN); - } else if (jj_2_1396(2)) { + } else if (jj_2_1419(2)) { jj_consume_token(G); - } else if (jj_2_1397(2)) { + } else if (jj_2_1420(2)) { jj_consume_token(GEOMETRY); - } else if (jj_2_1398(2)) { + } else if (jj_2_1421(2)) { jj_consume_token(GRANTED); - } else if (jj_2_1399(2)) { + } else if (jj_2_1422(2)) { jj_consume_token(HOP); - } else if (jj_2_1400(2)) { + } else if (jj_2_1423(2)) { jj_consume_token(ILIKE); - } else if (jj_2_1401(2)) { + } else if (jj_2_1424(2)) { jj_consume_token(IMPLEMENTATION); - } else if (jj_2_1402(2)) { + } else if (jj_2_1425(2)) { jj_consume_token(INCREMENT); - } else if (jj_2_1403(2)) { + } else if (jj_2_1426(2)) { jj_consume_token(INSTANCE); - } else if (jj_2_1404(2)) { + } else if (jj_2_1427(2)) { jj_consume_token(ISODOW); - } else if (jj_2_1405(2)) { + } else if (jj_2_1428(2)) { jj_consume_token(JAVA); - } else if (jj_2_1406(2)) { + } else if (jj_2_1429(2)) { jj_consume_token(KEY); - } else if (jj_2_1407(2)) { + } else if (jj_2_1430(2)) { jj_consume_token(LABEL); - } else if (jj_2_1408(2)) { + } else if (jj_2_1431(2)) { jj_consume_token(LEVEL); - } else if (jj_2_1409(2)) { + } else if (jj_2_1432(2)) { jj_consume_token(M); - } else if (jj_2_1410(2)) { + } else if (jj_2_1433(2)) { jj_consume_token(MAXVALUE); - } else if (jj_2_1411(2)) { + } else if (jj_2_1434(2)) { jj_consume_token(MESSAGE_TEXT); - } else if (jj_2_1412(2)) { + } else if (jj_2_1435(2)) { jj_consume_token(MILLISECOND); - } else if (jj_2_1413(2)) { + } else if (jj_2_1436(2)) { jj_consume_token(MONTHS); - } else if (jj_2_1414(2)) { + } else if (jj_2_1437(2)) { jj_consume_token(NAME); - } else if (jj_2_1415(2)) { + } else if (jj_2_1438(2)) { jj_consume_token(NESTING); - } else if (jj_2_1416(2)) { + } else if (jj_2_1439(2)) { jj_consume_token(NULLS); - } else if (jj_2_1417(2)) { + } else if (jj_2_1440(2)) { jj_consume_token(OCTETS); - } else if (jj_2_1418(2)) { + } else if (jj_2_1441(2)) { jj_consume_token(ORDERING); - } else if (jj_2_1419(2)) { + } else if (jj_2_1442(2)) { jj_consume_token(OUTPUT); - } else if (jj_2_1420(2)) { + } else if (jj_2_1443(2)) { jj_consume_token(PARAMETER_MODE); - } else if (jj_2_1421(2)) { + } else if (jj_2_1444(2)) { jj_consume_token(PARAMETER_SPECIFIC_CATALOG); - } else if (jj_2_1422(2)) { + } else if (jj_2_1445(2)) { jj_consume_token(PARTIAL); - } else if (jj_2_1423(2)) { + } else if (jj_2_1446(2)) { jj_consume_token(PASSTHROUGH); - } else if (jj_2_1424(2)) { + } else if (jj_2_1447(2)) { jj_consume_token(PIVOT); - } else if (jj_2_1425(2)) { + } else if (jj_2_1448(2)) { jj_consume_token(PLI); - } else if (jj_2_1426(2)) { + } else if (jj_2_1449(2)) { jj_consume_token(PRIOR); - } else if (jj_2_1427(2)) { + } else if (jj_2_1450(2)) { jj_consume_token(QUARTER); - } else if (jj_2_1428(2)) { + } else if (jj_2_1451(2)) { jj_consume_token(RELATIVE); - } else if (jj_2_1429(2)) { + } else if (jj_2_1452(2)) { jj_consume_token(RESPECT); - } else if (jj_2_1430(2)) { + } else if (jj_2_1453(2)) { jj_consume_token(RETURNED_CARDINALITY); - } else if (jj_2_1431(2)) { + } else if (jj_2_1454(2)) { jj_consume_token(RETURNED_SQLSTATE); - } else if (jj_2_1432(2)) { + } else if (jj_2_1455(2)) { jj_consume_token(ROLE); - } else if (jj_2_1433(2)) { + } else if (jj_2_1456(2)) { jj_consume_token(ROUTINE_NAME); - } else if (jj_2_1434(2)) { + } else if (jj_2_1457(2)) { jj_consume_token(SCALAR); - } else if (jj_2_1435(2)) { + } else if (jj_2_1458(2)) { jj_consume_token(SCHEMA_NAME); - } else if (jj_2_1436(2)) { + } else if (jj_2_1459(2)) { jj_consume_token(SCOPE_SCHEMA); - } else if (jj_2_1437(2)) { + } else if (jj_2_1460(2)) { jj_consume_token(SECURITY); - } else if (jj_2_1438(2)) { + } else if (jj_2_1461(2)) { jj_consume_token(SEQUENCE); - } else if (jj_2_1439(2)) { + } else if (jj_2_1462(2)) { jj_consume_token(SERVER_NAME); - } else if (jj_2_1440(2)) { + } else if (jj_2_1463(2)) { jj_consume_token(SIMPLE); - } else if (jj_2_1441(2)) { + } else if (jj_2_1464(2)) { jj_consume_token(SPACE); - } else if (jj_2_1442(2)) { + } else if (jj_2_1465(2)) { jj_consume_token(SQL_BINARY); - } else if (jj_2_1443(2)) { + } else if (jj_2_1466(2)) { jj_consume_token(SQL_BOOLEAN); - } else if (jj_2_1444(2)) { + } else if (jj_2_1467(2)) { jj_consume_token(SQL_DATE); - } else if (jj_2_1445(2)) { + } else if (jj_2_1468(2)) { jj_consume_token(SQL_FLOAT); - } else if (jj_2_1446(2)) { + } else if (jj_2_1469(2)) { jj_consume_token(SQL_INTERVAL_DAY_TO_HOUR); - } else if (jj_2_1447(2)) { + } else if (jj_2_1470(2)) { jj_consume_token(SQL_INTERVAL_HOUR); - } else if (jj_2_1448(2)) { + } else if (jj_2_1471(2)) { jj_consume_token(SQL_INTERVAL_MINUTE); - } else if (jj_2_1449(2)) { + } else if (jj_2_1472(2)) { jj_consume_token(SQL_INTERVAL_SECOND); - } else if (jj_2_1450(2)) { + } else if (jj_2_1473(2)) { jj_consume_token(SQL_LONGVARBINARY); - } else if (jj_2_1451(2)) { + } else if (jj_2_1474(2)) { jj_consume_token(SQL_NCHAR); - } else if (jj_2_1452(2)) { + } else if (jj_2_1475(2)) { jj_consume_token(SQL_NVARCHAR); - } else if (jj_2_1453(2)) { + } else if (jj_2_1476(2)) { jj_consume_token(SQL_TIME); - } else if (jj_2_1454(2)) { + } else if (jj_2_1477(2)) { jj_consume_token(SQL_TSI_DAY); - } else if (jj_2_1455(2)) { + } else if (jj_2_1478(2)) { jj_consume_token(SQL_TSI_MICROSECOND); - } else if (jj_2_1456(2)) { + } else if (jj_2_1479(2)) { jj_consume_token(SQL_TSI_QUARTER); - } else if (jj_2_1457(2)) { + } else if (jj_2_1480(2)) { jj_consume_token(SQL_TSI_YEAR); - } else if (jj_2_1458(2)) { + } else if (jj_2_1481(2)) { jj_consume_token(STATE); - } else if (jj_2_1459(2)) { + } else if (jj_2_1482(2)) { jj_consume_token(STRUCTURE); - } else if (jj_2_1460(2)) { + } else if (jj_2_1483(2)) { jj_consume_token(SUBSTITUTE); - } else if (jj_2_1461(2)) { + } else if (jj_2_1484(2)) { jj_consume_token(TIES); - } else if (jj_2_1462(2)) { + } else if (jj_2_1485(2)) { jj_consume_token(TIMESTAMPADD); - } else if (jj_2_1463(2)) { + } else if (jj_2_1486(2)) { jj_consume_token(TIMESTAMP_TRUNC); - } else if (jj_2_1464(2)) { + } else if (jj_2_1487(2)) { jj_consume_token(TRANSACTIONS_ACTIVE); - } else if (jj_2_1465(2)) { + } else if (jj_2_1488(2)) { jj_consume_token(TRANSFORM); - } else if (jj_2_1466(2)) { + } else if (jj_2_1489(2)) { jj_consume_token(TRIGGER_NAME); - } else if (jj_2_1467(2)) { + } else if (jj_2_1490(2)) { jj_consume_token(TYPE); - } else if (jj_2_1468(2)) { + } else if (jj_2_1491(2)) { jj_consume_token(UNCONDITIONAL); - } else if (jj_2_1469(2)) { + } else if (jj_2_1492(2)) { jj_consume_token(UNNAMED); - } else if (jj_2_1470(2)) { + } else if (jj_2_1493(2)) { jj_consume_token(USER_DEFINED_TYPE_CODE); - } else if (jj_2_1471(2)) { + } else if (jj_2_1494(2)) { jj_consume_token(UTF16); - } else if (jj_2_1472(2)) { + } else if (jj_2_1495(2)) { jj_consume_token(VERSION); - } else if (jj_2_1473(2)) { + } else if (jj_2_1496(2)) { jj_consume_token(WEEKS); - } else if (jj_2_1474(2)) { + } else if (jj_2_1497(2)) { jj_consume_token(WRITE); - } else if (jj_2_1475(2)) { + } else if (jj_2_1498(2)) { jj_consume_token(ZONE); - } else if (jj_2_1476(2)) { + } else if (jj_2_1499(2)) { jj_consume_token(AFFINITY_KEY); - } else if (jj_2_1477(2)) { + } else if (jj_2_1500(2)) { jj_consume_token(CACHE_GROUP); - } else if (jj_2_1478(2)) { + } else if (jj_2_1501(2)) { jj_consume_token(VALUE_TYPE); - } else if (jj_2_1479(2)) { + } else if (jj_2_1502(2)) { jj_consume_token(ENCRYPTED); - } else if (jj_2_1480(2)) { + } else if (jj_2_1503(2)) { jj_consume_token(LOGGING); - } else if (jj_2_1481(2)) { + } else if (jj_2_1504(2)) { jj_consume_token(KILL); - } else if (jj_2_1482(2)) { + } else if (jj_2_1505(2)) { jj_consume_token(SERVICE); - } else if (jj_2_1483(2)) { + } else if (jj_2_1506(2)) { jj_consume_token(QUERY); - } else if (jj_2_1484(2)) { + } else if (jj_2_1507(2)) { jj_consume_token(ANALYZE); - } else if (jj_2_1485(2)) { + } else if (jj_2_1508(2)) { jj_consume_token(ABS); - } else if (jj_2_1486(2)) { + } else if (jj_2_1509(2)) { jj_consume_token(ARE); - } else if (jj_2_1487(2)) { + } else if (jj_2_1510(2)) { jj_consume_token(ASOF); - } else if (jj_2_1488(2)) { + } else if (jj_2_1511(2)) { jj_consume_token(AUTHORIZATION); - } else if (jj_2_1489(2)) { + } else if (jj_2_1512(2)) { jj_consume_token(BEGIN_FRAME); - } else if (jj_2_1490(2)) { + } else if (jj_2_1513(2)) { jj_consume_token(BINARY); - } else if (jj_2_1491(2)) { + } else if (jj_2_1514(2)) { jj_consume_token(BOOLEAN); - } else if (jj_2_1492(2)) { + } else if (jj_2_1515(2)) { jj_consume_token(CARDINALITY); - } else if (jj_2_1493(2)) { + } else if (jj_2_1516(2)) { jj_consume_token(CEILING); - } else if (jj_2_1494(2)) { + } else if (jj_2_1517(2)) { jj_consume_token(CHARACTER_LENGTH); - } else if (jj_2_1495(2)) { + } else if (jj_2_1518(2)) { jj_consume_token(CLASSIFIER); - } else if (jj_2_1496(2)) { + } else if (jj_2_1519(2)) { jj_consume_token(COALESCE); - } else if (jj_2_1497(2)) { + } else if (jj_2_1520(2)) { jj_consume_token(COMMIT); - } else if (jj_2_1498(2)) { + } else if (jj_2_1521(2)) { jj_consume_token(CONTAINS); - } else if (jj_2_1499(2)) { + } else if (jj_2_1522(2)) { jj_consume_token(CORRESPONDING); - } else if (jj_2_1500(2)) { + } else if (jj_2_1523(2)) { jj_consume_token(COVAR_SAMP); - } else if (jj_2_1501(2)) { + } else if (jj_2_1524(2)) { jj_consume_token(CURRENT); - } else if (jj_2_1502(2)) { + } else if (jj_2_1525(2)) { jj_consume_token(CURRENT_PATH); - } else if (jj_2_1503(2)) { + } else if (jj_2_1526(2)) { jj_consume_token(CURRENT_TRANSFORM_GROUP_FOR_TYPE); - } else if (jj_2_1504(2)) { + } else if (jj_2_1527(2)) { jj_consume_token(DATE); - } else if (jj_2_1505(2)) { + } else if (jj_2_1528(2)) { jj_consume_token(DEALLOCATE); - } else if (jj_2_1506(2)) { + } else if (jj_2_1529(2)) { jj_consume_token(DECLARE); - } else if (jj_2_1507(2)) { + } else if (jj_2_1530(2)) { jj_consume_token(DEREF); - } else if (jj_2_1508(2)) { + } else if (jj_2_1531(2)) { jj_consume_token(DISALLOW); - } else if (jj_2_1509(2)) { + } else if (jj_2_1532(2)) { jj_consume_token(DYNAMIC); - } else if (jj_2_1510(2)) { + } else if (jj_2_1533(2)) { jj_consume_token(EMPTY); - } else if (jj_2_1511(2)) { + } else if (jj_2_1534(2)) { jj_consume_token(END_FRAME); - } else if (jj_2_1512(2)) { + } else if (jj_2_1535(2)) { jj_consume_token(ESCAPE); - } else if (jj_2_1513(2)) { + } else if (jj_2_1536(2)) { jj_consume_token(EXECUTE); - } else if (jj_2_1514(2)) { + } else if (jj_2_1537(2)) { jj_consume_token(EXTERNAL); - } else if (jj_2_1515(2)) { + } else if (jj_2_1538(2)) { jj_consume_token(FIRST_VALUE); - } else if (jj_2_1516(2)) { + } else if (jj_2_1539(2)) { jj_consume_token(FOREIGN); - } else if (jj_2_1517(2)) { + } else if (jj_2_1540(2)) { jj_consume_token(FUNCTION); - } else if (jj_2_1518(2)) { + } else if (jj_2_1541(2)) { jj_consume_token(GLOBAL); - } else if (jj_2_1519(2)) { + } else if (jj_2_1542(2)) { jj_consume_token(GROUPS); - } else if (jj_2_1520(2)) { + } else if (jj_2_1543(2)) { jj_consume_token(IDENTITY); - } else if (jj_2_1521(2)) { + } else if (jj_2_1544(2)) { jj_consume_token(INITIAL); - } else if (jj_2_1522(2)) { + } else if (jj_2_1545(2)) { jj_consume_token(INT); - } else if (jj_2_1523(2)) { + } else if (jj_2_1546(2)) { jj_consume_token(JSON_ARRAY); - } else if (jj_2_1524(2)) { + } else if (jj_2_1547(2)) { jj_consume_token(JSON_OBJECT); - } else if (jj_2_1525(2)) { + } else if (jj_2_1548(2)) { jj_consume_token(JSON_SCOPE); - } else if (jj_2_1526(2)) { + } else if (jj_2_1549(2)) { jj_consume_token(LANGUAGE); - } else if (jj_2_1527(2)) { + } else if (jj_2_1550(2)) { jj_consume_token(LATERAL); - } else if (jj_2_1528(2)) { + } else if (jj_2_1551(2)) { jj_consume_token(LN); - } else if (jj_2_1529(2)) { + } else if (jj_2_1552(2)) { jj_consume_token(MATCH); - } else if (jj_2_1530(2)) { + } else if (jj_2_1553(2)) { jj_consume_token(MATCH_NUMBER); - } else if (jj_2_1531(2)) { + } else if (jj_2_1554(2)) { jj_consume_token(MEASURE); - } else if (jj_2_1532(2)) { + } else if (jj_2_1555(2)) { jj_consume_token(METHOD); - } else if (jj_2_1533(2)) { + } else if (jj_2_1556(2)) { jj_consume_token(MOD); - } else if (jj_2_1534(2)) { + } else if (jj_2_1557(2)) { jj_consume_token(MONTH); - } else if (jj_2_1535(2)) { + } else if (jj_2_1558(2)) { jj_consume_token(NCHAR); - } else if (jj_2_1536(2)) { + } else if (jj_2_1559(2)) { jj_consume_token(NEXT); - } else if (jj_2_1537(2)) { + } else if (jj_2_1560(2)) { jj_consume_token(NORMALIZE); - } else if (jj_2_1538(2)) { + } else if (jj_2_1561(2)) { jj_consume_token(NULLIF); - } else if (jj_2_1539(2)) { + } else if (jj_2_1562(2)) { jj_consume_token(OCTET_LENGTH); - } else if (jj_2_1540(2)) { + } else if (jj_2_1563(2)) { jj_consume_token(OMIT); - } else if (jj_2_1541(2)) { + } else if (jj_2_1564(2)) { jj_consume_token(OPEN); - } else if (jj_2_1542(2)) { + } else if (jj_2_1565(2)) { jj_consume_token(OVER); - } else if (jj_2_1543(2)) { + } else if (jj_2_1566(2)) { jj_consume_token(PARAMETER); - } else if (jj_2_1544(2)) { + } else if (jj_2_1567(2)) { jj_consume_token(PERCENT); - } else if (jj_2_1545(2)) { + } else if (jj_2_1568(2)) { jj_consume_token(PERCENT_RANK); - } else if (jj_2_1546(2)) { + } else if (jj_2_1569(2)) { jj_consume_token(PORTION); - } else if (jj_2_1547(2)) { + } else if (jj_2_1570(2)) { jj_consume_token(POWER); - } else if (jj_2_1548(2)) { + } else if (jj_2_1571(2)) { jj_consume_token(PREPARE); - } else if (jj_2_1549(2)) { + } else if (jj_2_1572(2)) { jj_consume_token(QUALIFY); - } else if (jj_2_1550(2)) { + } else if (jj_2_1573(2)) { jj_consume_token(READS); - } else if (jj_2_1551(2)) { + } else if (jj_2_1574(2)) { jj_consume_token(REF); - } else if (jj_2_1552(2)) { + } else if (jj_2_1575(2)) { jj_consume_token(REGR_AVGX); - } else if (jj_2_1553(2)) { + } else if (jj_2_1576(2)) { jj_consume_token(REGR_INTERCEPT); - } else if (jj_2_1554(2)) { + } else if (jj_2_1577(2)) { jj_consume_token(REGR_SXX); - } else if (jj_2_1555(2)) { + } else if (jj_2_1578(2)) { jj_consume_token(RELEASE); - } else if (jj_2_1556(2)) { + } else if (jj_2_1579(2)) { jj_consume_token(RETURN); - } else if (jj_2_1557(2)) { + } else if (jj_2_1580(2)) { jj_consume_token(ROLLBACK); - } else if (jj_2_1558(2)) { + } else if (jj_2_1581(2)) { jj_consume_token(ROW_NUMBER); - } else if (jj_2_1559(2)) { + } else if (jj_2_1582(2)) { jj_consume_token(SAFE_OFFSET); - } else if (jj_2_1560(2)) { + } else if (jj_2_1583(2)) { jj_consume_token(SCOPE); - } else if (jj_2_1561(2)) { + } else if (jj_2_1584(2)) { jj_consume_token(SECOND); - } else if (jj_2_1562(2)) { + } else if (jj_2_1585(2)) { jj_consume_token(SESSION_USER); - } else if (jj_2_1563(2)) { + } else if (jj_2_1586(2)) { jj_consume_token(SKIP_); - } else if (jj_2_1564(2)) { + } else if (jj_2_1587(2)) { jj_consume_token(SPECIFICTYPE); - } else if (jj_2_1565(2)) { + } else if (jj_2_1588(2)) { jj_consume_token(SQLSTATE); - } else if (jj_2_1566(2)) { + } else if (jj_2_1589(2)) { jj_consume_token(START); - } else if (jj_2_1567(2)) { + } else if (jj_2_1590(2)) { jj_consume_token(STDDEV_SAMP); - } else if (jj_2_1568(2)) { + } else if (jj_2_1591(2)) { jj_consume_token(SUBSET); - } else if (jj_2_1569(2)) { + } else if (jj_2_1592(2)) { jj_consume_token(SUCCEEDS); - } else if (jj_2_1570(2)) { + } else if (jj_2_1593(2)) { jj_consume_token(SYSTEM_TIME); - } else if (jj_2_1571(2)) { + } else if (jj_2_1594(2)) { jj_consume_token(TIME); - } else if (jj_2_1572(2)) { + } else if (jj_2_1595(2)) { jj_consume_token(TIMEZONE_MINUTE); - } else if (jj_2_1573(2)) { + } else if (jj_2_1596(2)) { jj_consume_token(TRANSLATE_REGEX); - } else if (jj_2_1574(2)) { + } else if (jj_2_1597(2)) { jj_consume_token(TRIGGER); - } else if (jj_2_1575(2)) { + } else if (jj_2_1598(2)) { jj_consume_token(TRUNCATE); - } else if (jj_2_1576(2)) { + } else if (jj_2_1599(2)) { jj_consume_token(UNIQUE); - } else if (jj_2_1577(2)) { - jj_consume_token(UPSERT); - } else if (jj_2_1578(2)) { - jj_consume_token(VALUE_OF); - } else if (jj_2_1579(2)) { - jj_consume_token(VARCHAR); - } else if (jj_2_1580(2)) { - jj_consume_token(VAR_SAMP); - } else if (jj_2_1581(2)) { - jj_consume_token(WIDTH_BUCKET); - } else if (jj_2_1582(2)) { - jj_consume_token(WITHOUT); - } else if (jj_2_1583(2)) { - jj_consume_token(TUESDAY); - } else if (jj_2_1584(2)) { - jj_consume_token(FRIDAY); + } else if (jj_2_1600(2)) { + jj_consume_token(UPPER); + } else if (jj_2_1601(2)) { + jj_consume_token(VALUE); + } else if (jj_2_1602(2)) { + jj_consume_token(VARIANT); + } else if (jj_2_1603(2)) { + jj_consume_token(VAR_POP); + } else if (jj_2_1604(2)) { + jj_consume_token(WHENEVER); + } else if (jj_2_1605(2)) { + jj_consume_token(WITHIN); + } else if (jj_2_1606(2)) { + jj_consume_token(MONDAY); + } else if (jj_2_1607(2)) { + jj_consume_token(THURSDAY); + } else if (jj_2_1608(2)) { + jj_consume_token(SUNDAY); } else { jj_consume_token(-1); throw new ParseException(); @@ -11091,448 +11327,448 @@ final public void NonReservedKeyWord1of3() throws ParseException { /** @see #NonReservedKeyWord */ final public void NonReservedKeyWord2of3() throws ParseException { - if (jj_2_1585(2)) { + if (jj_2_1609(2)) { jj_consume_token(ABSOLUTE); - } else if (jj_2_1586(2)) { + } else if (jj_2_1610(2)) { jj_consume_token(ADD); - } else if (jj_2_1587(2)) { + } else if (jj_2_1611(2)) { jj_consume_token(ALWAYS); - } else if (jj_2_1588(2)) { + } else if (jj_2_1612(2)) { jj_consume_token(ARRAY_CONCAT_AGG); - } else if (jj_2_1589(2)) { + } else if (jj_2_1613(2)) { jj_consume_token(ASSIGNMENT); - } else if (jj_2_1590(2)) { + } else if (jj_2_1614(2)) { jj_consume_token(BEFORE); - } else if (jj_2_1591(2)) { + } else if (jj_2_1615(2)) { jj_consume_token(C); - } else if (jj_2_1592(2)) { + } else if (jj_2_1616(2)) { jj_consume_token(CATALOG_NAME); - } else if (jj_2_1593(2)) { + } else if (jj_2_1617(2)) { jj_consume_token(CHARACTERISTICS); - } else if (jj_2_1594(2)) { + } else if (jj_2_1618(2)) { jj_consume_token(CHARACTER_SET_NAME); - } else if (jj_2_1595(2)) { + } else if (jj_2_1619(2)) { jj_consume_token(COBOL); - } else if (jj_2_1596(2)) { + } else if (jj_2_1620(2)) { jj_consume_token(COLLATION_NAME); - } else if (jj_2_1597(2)) { + } else if (jj_2_1621(2)) { jj_consume_token(COMMAND_FUNCTION); - } else if (jj_2_1598(2)) { + } else if (jj_2_1622(2)) { jj_consume_token(CONDITIONAL); - } else if (jj_2_1599(2)) { + } else if (jj_2_1623(2)) { jj_consume_token(CONNECTION_NAME); - } else if (jj_2_1600(2)) { + } else if (jj_2_1624(2)) { jj_consume_token(CONSTRAINTS); - } else if (jj_2_1601(2)) { + } else if (jj_2_1625(2)) { jj_consume_token(CONTAINS_SUBSTR); - } else if (jj_2_1602(2)) { + } else if (jj_2_1626(2)) { jj_consume_token(DATA); - } else if (jj_2_1603(2)) { + } else if (jj_2_1627(2)) { jj_consume_token(DATE_TRUNC); - } else if (jj_2_1604(2)) { + } else if (jj_2_1628(2)) { jj_consume_token(DATETIME_INTERVAL_PRECISION); - } else if (jj_2_1605(2)) { + } else if (jj_2_1629(2)) { jj_consume_token(DAYOFYEAR); - } else if (jj_2_1606(2)) { + } else if (jj_2_1630(2)) { jj_consume_token(DEFAULTS); - } else if (jj_2_1607(2)) { + } else if (jj_2_1631(2)) { jj_consume_token(DEFINED); - } else if (jj_2_1608(2)) { + } else if (jj_2_1632(2)) { jj_consume_token(DEPTH); - } else if (jj_2_1609(2)) { + } else if (jj_2_1633(2)) { jj_consume_token(DESCRIPTION); - } else if (jj_2_1610(2)) { + } else if (jj_2_1634(2)) { jj_consume_token(DISPATCH); - } else if (jj_2_1611(2)) { + } else if (jj_2_1635(2)) { jj_consume_token(DOY); - } else if (jj_2_1612(2)) { + } else if (jj_2_1636(2)) { jj_consume_token(DYNAMIC_FUNCTION_CODE); - } else if (jj_2_1613(2)) { + } else if (jj_2_1637(2)) { jj_consume_token(ERROR); - } else if (jj_2_1614(2)) { + } else if (jj_2_1638(2)) { jj_consume_token(EXCLUDING); - } else if (jj_2_1615(2)) { + } else if (jj_2_1639(2)) { jj_consume_token(FOLLOWING); - } else if (jj_2_1616(2)) { + } else if (jj_2_1640(2)) { jj_consume_token(FOUND); - } else if (jj_2_1617(2)) { + } else if (jj_2_1641(2)) { jj_consume_token(GENERAL); - } else if (jj_2_1618(2)) { + } else if (jj_2_1642(2)) { jj_consume_token(GO); - } else if (jj_2_1619(2)) { + } else if (jj_2_1643(2)) { jj_consume_token(GROUP_CONCAT); - } else if (jj_2_1620(2)) { + } else if (jj_2_1644(2)) { jj_consume_token(HOURS); - } else if (jj_2_1621(2)) { + } else if (jj_2_1645(2)) { jj_consume_token(IMMEDIATE); - } else if (jj_2_1622(2)) { + } else if (jj_2_1646(2)) { jj_consume_token(INCLUDE); - } else if (jj_2_1623(2)) { + } else if (jj_2_1647(2)) { jj_consume_token(INITIALLY); - } else if (jj_2_1624(2)) { + } else if (jj_2_1648(2)) { jj_consume_token(INSTANTIABLE); - } else if (jj_2_1625(2)) { + } else if (jj_2_1649(2)) { jj_consume_token(ISOLATION); - } else if (jj_2_1626(2)) { + } else if (jj_2_1650(2)) { jj_consume_token(JSON); - } else if (jj_2_1627(2)) { + } else if (jj_2_1651(2)) { jj_consume_token(KEY_MEMBER); - } else if (jj_2_1628(2)) { + } else if (jj_2_1652(2)) { jj_consume_token(LAST); - } else if (jj_2_1629(2)) { + } else if (jj_2_1653(2)) { jj_consume_token(LIBRARY); - } else if (jj_2_1630(2)) { + } else if (jj_2_1654(2)) { jj_consume_token(MAP); - } else if (jj_2_1631(2)) { + } else if (jj_2_1655(2)) { jj_consume_token(MESSAGE_LENGTH); - } else if (jj_2_1632(2)) { + } else if (jj_2_1656(2)) { jj_consume_token(MICROSECOND); - } else if (jj_2_1633(2)) { + } else if (jj_2_1657(2)) { jj_consume_token(MINUTES); - } else if (jj_2_1634(2)) { + } else if (jj_2_1658(2)) { jj_consume_token(MORE_); - } else if (jj_2_1635(2)) { + } else if (jj_2_1659(2)) { jj_consume_token(NAMES); - } else if (jj_2_1636(2)) { + } else if (jj_2_1660(2)) { jj_consume_token(NORMALIZED); - } else if (jj_2_1637(2)) { + } else if (jj_2_1661(2)) { jj_consume_token(NUMBER); - } else if (jj_2_1638(2)) { + } else if (jj_2_1662(2)) { jj_consume_token(OPTION); - } else if (jj_2_1639(2)) { + } else if (jj_2_1663(2)) { jj_consume_token(ORDINALITY); - } else if (jj_2_1640(2)) { + } else if (jj_2_1664(2)) { jj_consume_token(OVERRIDING); - } else if (jj_2_1641(2)) { + } else if (jj_2_1665(2)) { jj_consume_token(PARAMETER_NAME); - } else if (jj_2_1642(2)) { + } else if (jj_2_1666(2)) { jj_consume_token(PARAMETER_SPECIFIC_NAME); - } else if (jj_2_1643(2)) { + } else if (jj_2_1667(2)) { jj_consume_token(PASCAL); - } else if (jj_2_1644(2)) { + } else if (jj_2_1668(2)) { jj_consume_token(PAST); - } else if (jj_2_1645(2)) { + } else if (jj_2_1669(2)) { jj_consume_token(PLACING); - } else if (jj_2_1646(2)) { + } else if (jj_2_1670(2)) { jj_consume_token(PRECEDING); - } else if (jj_2_1647(2)) { + } else if (jj_2_1671(2)) { jj_consume_token(PRIVILEGES); - } else if (jj_2_1648(2)) { + } else if (jj_2_1672(2)) { jj_consume_token(QUARTERS); - } else if (jj_2_1649(2)) { + } else if (jj_2_1673(2)) { jj_consume_token(REPEATABLE); - } else if (jj_2_1650(2)) { + } else if (jj_2_1674(2)) { jj_consume_token(RESTART); - } else if (jj_2_1651(2)) { + } else if (jj_2_1675(2)) { jj_consume_token(RETURNED_LENGTH); - } else if (jj_2_1652(2)) { + } else if (jj_2_1676(2)) { jj_consume_token(RETURNING); - } else if (jj_2_1653(2)) { + } else if (jj_2_1677(2)) { jj_consume_token(ROUTINE); - } else if (jj_2_1654(2)) { + } else if (jj_2_1678(2)) { jj_consume_token(ROUTINE_SCHEMA); - } else if (jj_2_1655(2)) { + } else if (jj_2_1679(2)) { jj_consume_token(SCALE); - } else if (jj_2_1656(2)) { + } else if (jj_2_1680(2)) { jj_consume_token(SCOPE_CATALOGS); - } else if (jj_2_1657(2)) { + } else if (jj_2_1681(2)) { jj_consume_token(SECONDS); - } else if (jj_2_1658(2)) { + } else if (jj_2_1682(2)) { jj_consume_token(SELF); - } else if (jj_2_1659(2)) { + } else if (jj_2_1683(2)) { jj_consume_token(SERIALIZABLE); - } else if (jj_2_1660(2)) { + } else if (jj_2_1684(2)) { jj_consume_token(SESSION); - } else if (jj_2_1661(2)) { + } else if (jj_2_1685(2)) { jj_consume_token(SIZE); - } else if (jj_2_1662(2)) { + } else if (jj_2_1686(2)) { jj_consume_token(SPECIFIC_NAME); - } else if (jj_2_1663(2)) { + } else if (jj_2_1687(2)) { jj_consume_token(SQL_BIT); - } else if (jj_2_1664(2)) { + } else if (jj_2_1688(2)) { jj_consume_token(SQL_CHAR); - } else if (jj_2_1665(2)) { + } else if (jj_2_1689(2)) { jj_consume_token(SQL_DECIMAL); - } else if (jj_2_1666(2)) { + } else if (jj_2_1690(2)) { jj_consume_token(SQL_INTEGER); - } else if (jj_2_1667(2)) { + } else if (jj_2_1691(2)) { jj_consume_token(SQL_INTERVAL_DAY_TO_MINUTE); - } else if (jj_2_1668(2)) { + } else if (jj_2_1692(2)) { jj_consume_token(SQL_INTERVAL_HOUR_TO_MINUTE); - } else if (jj_2_1669(2)) { + } else if (jj_2_1693(2)) { jj_consume_token(SQL_INTERVAL_MINUTE_TO_SECOND); - } else if (jj_2_1670(2)) { + } else if (jj_2_1694(2)) { jj_consume_token(SQL_INTERVAL_YEAR); - } else if (jj_2_1671(2)) { + } else if (jj_2_1695(2)) { jj_consume_token(SQL_LONGVARCHAR); - } else if (jj_2_1672(2)) { + } else if (jj_2_1696(2)) { jj_consume_token(SQL_NCLOB); - } else if (jj_2_1673(2)) { + } else if (jj_2_1697(2)) { jj_consume_token(SQL_REAL); - } else if (jj_2_1674(2)) { + } else if (jj_2_1698(2)) { jj_consume_token(SQL_TIMESTAMP); - } else if (jj_2_1675(2)) { + } else if (jj_2_1699(2)) { jj_consume_token(SQL_TSI_FRAC_SECOND); - } else if (jj_2_1676(2)) { + } else if (jj_2_1700(2)) { jj_consume_token(SQL_TSI_MINUTE); - } else if (jj_2_1677(2)) { + } else if (jj_2_1701(2)) { jj_consume_token(SQL_TSI_SECOND); - } else if (jj_2_1678(2)) { + } else if (jj_2_1702(2)) { jj_consume_token(SQL_VARBINARY); - } else if (jj_2_1679(2)) { + } else if (jj_2_1703(2)) { jj_consume_token(STATEMENT); - } else if (jj_2_1680(2)) { + } else if (jj_2_1704(2)) { jj_consume_token(STYLE); - } else if (jj_2_1681(2)) { + } else if (jj_2_1705(2)) { jj_consume_token(TABLE_NAME); - } else if (jj_2_1682(2)) { + } else if (jj_2_1706(2)) { jj_consume_token(TIME_DIFF); - } else if (jj_2_1683(2)) { + } else if (jj_2_1707(2)) { jj_consume_token(TIMESTAMPDIFF); - } else if (jj_2_1684(2)) { + } else if (jj_2_1708(2)) { jj_consume_token(TOP_LEVEL_COUNT); - } else if (jj_2_1685(2)) { + } else if (jj_2_1709(2)) { jj_consume_token(TRANSACTIONS_COMMITTED); - } else if (jj_2_1686(2)) { + } else if (jj_2_1710(2)) { jj_consume_token(TRANSFORMS); - } else if (jj_2_1687(2)) { + } else if (jj_2_1711(2)) { jj_consume_token(TRIGGER_SCHEMA); - } else if (jj_2_1688(2)) { + } else if (jj_2_1712(2)) { jj_consume_token(UNBOUNDED); - } else if (jj_2_1689(2)) { + } else if (jj_2_1713(2)) { jj_consume_token(UNDER); - } else if (jj_2_1690(2)) { + } else if (jj_2_1714(2)) { jj_consume_token(USAGE); - } else if (jj_2_1691(2)) { + } else if (jj_2_1715(2)) { jj_consume_token(USER_DEFINED_TYPE_NAME); - } else if (jj_2_1692(2)) { + } else if (jj_2_1716(2)) { jj_consume_token(UTF32); - } else if (jj_2_1693(2)) { + } else if (jj_2_1717(2)) { jj_consume_token(VIEW); - } else if (jj_2_1694(2)) { + } else if (jj_2_1718(2)) { jj_consume_token(WORK); - } else if (jj_2_1695(2)) { + } else if (jj_2_1719(2)) { jj_consume_token(XML); - } else if (jj_2_1696(2)) { + } else if (jj_2_1720(2)) { jj_consume_token(TEMPLATE); - } else if (jj_2_1697(2)) { + } else if (jj_2_1721(2)) { jj_consume_token(ATOMICITY); - } else if (jj_2_1698(2)) { + } else if (jj_2_1722(2)) { jj_consume_token(CACHE_NAME); - } else if (jj_2_1699(2)) { + } else if (jj_2_1723(2)) { jj_consume_token(WRAP_KEY); - } else if (jj_2_1700(2)) { + } else if (jj_2_1724(2)) { jj_consume_token(PARALLEL); - } else if (jj_2_1701(2)) { + } else if (jj_2_1725(2)) { jj_consume_token(NOLOGGING); - } else if (jj_2_1702(2)) { + } else if (jj_2_1726(2)) { jj_consume_token(SCAN); - } else if (jj_2_1703(2)) { + } else if (jj_2_1727(2)) { jj_consume_token(COMPUTE); - } else if (jj_2_1704(2)) { + } else if (jj_2_1728(2)) { jj_consume_token(STATISTICS); - } else if (jj_2_1705(2)) { + } else if (jj_2_1729(2)) { jj_consume_token(MAX_CHANGED_PARTITION_ROWS_PERCENT); - } else if (jj_2_1706(2)) { + } else if (jj_2_1730(2)) { jj_consume_token(ALLOCATE); - } else if (jj_2_1707(2)) { + } else if (jj_2_1731(2)) { jj_consume_token(ARRAY_MAX_CARDINALITY); - } else if (jj_2_1708(2)) { + } else if (jj_2_1732(2)) { jj_consume_token(AT); - } else if (jj_2_1709(2)) { + } else if (jj_2_1733(2)) { jj_consume_token(AVG); - } else if (jj_2_1710(2)) { + } else if (jj_2_1734(2)) { jj_consume_token(BEGIN_PARTITION); - } else if (jj_2_1711(2)) { + } else if (jj_2_1735(2)) { jj_consume_token(BIT); - } else if (jj_2_1712(2)) { + } else if (jj_2_1736(2)) { jj_consume_token(CALL); - } else if (jj_2_1713(2)) { + } else if (jj_2_1737(2)) { jj_consume_token(CASCADED); - } else if (jj_2_1714(2)) { + } else if (jj_2_1738(2)) { jj_consume_token(CHAR); - } else if (jj_2_1715(2)) { + } else if (jj_2_1739(2)) { jj_consume_token(CHAR_LENGTH); - } else if (jj_2_1716(2)) { + } else if (jj_2_1740(2)) { jj_consume_token(CLOB); - } else if (jj_2_1717(2)) { + } else if (jj_2_1741(2)) { jj_consume_token(COLLATE); - } else if (jj_2_1718(2)) { + } else if (jj_2_1742(2)) { jj_consume_token(CONDITION); - } else if (jj_2_1719(2)) { + } else if (jj_2_1743(2)) { jj_consume_token(CONVERT); - } else if (jj_2_1720(2)) { + } else if (jj_2_1744(2)) { jj_consume_token(COUNT); - } else if (jj_2_1721(2)) { + } else if (jj_2_1745(2)) { jj_consume_token(CUBE); - } else if (jj_2_1722(2)) { + } else if (jj_2_1746(2)) { jj_consume_token(CURRENT_CATALOG); - } else if (jj_2_1723(2)) { + } else if (jj_2_1747(2)) { jj_consume_token(CURRENT_ROLE); - } else if (jj_2_1724(2)) { + } else if (jj_2_1748(2)) { jj_consume_token(CURSOR); - } else if (jj_2_1725(2)) { + } else if (jj_2_1749(2)) { jj_consume_token(DATETIME); - } else if (jj_2_1726(2)) { + } else if (jj_2_1750(2)) { jj_consume_token(DEC); - } else if (jj_2_1727(2)) { + } else if (jj_2_1751(2)) { jj_consume_token(DEFINE); - } else if (jj_2_1728(2)) { + } else if (jj_2_1752(2)) { jj_consume_token(DESCRIBE); - } else if (jj_2_1729(2)) { + } else if (jj_2_1753(2)) { jj_consume_token(DISCONNECT); - } else if (jj_2_1730(2)) { + } else if (jj_2_1754(2)) { jj_consume_token(EACH); - } else if (jj_2_1731(2)) { + } else if (jj_2_1755(2)) { jj_consume_token(END); - } else if (jj_2_1732(2)) { + } else if (jj_2_1756(2)) { jj_consume_token(END_PARTITION); - } else if (jj_2_1733(2)) { + } else if (jj_2_1757(2)) { jj_consume_token(EVERY); - } else if (jj_2_1734(2)) { + } else if (jj_2_1758(2)) { jj_consume_token(EXP); - } else if (jj_2_1735(2)) { + } else if (jj_2_1759(2)) { jj_consume_token(EXTRACT); - } else if (jj_2_1736(2)) { + } else if (jj_2_1760(2)) { jj_consume_token(FLOAT); - } else if (jj_2_1737(2)) { + } else if (jj_2_1761(2)) { jj_consume_token(FRAME_ROW); - } else if (jj_2_1738(2)) { + } else if (jj_2_1762(2)) { jj_consume_token(FUSION); - } else if (jj_2_1739(2)) { + } else if (jj_2_1763(2)) { jj_consume_token(GRANT); - } else if (jj_2_1740(2)) { + } else if (jj_2_1764(2)) { jj_consume_token(HOLD); - } else if (jj_2_1741(2)) { + } else if (jj_2_1765(2)) { jj_consume_token(IMPORT); - } else if (jj_2_1742(2)) { + } else if (jj_2_1766(2)) { jj_consume_token(INOUT); - } else if (jj_2_1743(2)) { + } else if (jj_2_1767(2)) { jj_consume_token(INTEGER); - } else if (jj_2_1744(2)) { + } else if (jj_2_1768(2)) { jj_consume_token(JSON_ARRAYAGG); - } else if (jj_2_1745(2)) { + } else if (jj_2_1769(2)) { jj_consume_token(JSON_OBJECTAGG); - } else if (jj_2_1746(2)) { + } else if (jj_2_1770(2)) { jj_consume_token(JSON_VALUE); - } else if (jj_2_1747(2)) { + } else if (jj_2_1771(2)) { jj_consume_token(LARGE); - } else if (jj_2_1748(2)) { + } else if (jj_2_1772(2)) { jj_consume_token(LEAD); - } else if (jj_2_1749(2)) { + } else if (jj_2_1773(2)) { jj_consume_token(LOCAL); - } else if (jj_2_1750(2)) { + } else if (jj_2_1774(2)) { jj_consume_token(MATCHES); - } else if (jj_2_1751(2)) { + } else if (jj_2_1775(2)) { jj_consume_token(MATCH_RECOGNIZE); - } else if (jj_2_1752(2)) { + } else if (jj_2_1776(2)) { jj_consume_token(MEASURES); - } else if (jj_2_1753(2)) { + } else if (jj_2_1777(2)) { jj_consume_token(MIN); - } else if (jj_2_1754(2)) { + } else if (jj_2_1778(2)) { jj_consume_token(MODIFIES); - } else if (jj_2_1755(2)) { + } else if (jj_2_1779(2)) { jj_consume_token(MULTISET); - } else if (jj_2_1756(2)) { + } else if (jj_2_1780(2)) { jj_consume_token(NCLOB); - } else if (jj_2_1757(2)) { + } else if (jj_2_1781(2)) { jj_consume_token(NO); - } else if (jj_2_1758(2)) { + } else if (jj_2_1782(2)) { jj_consume_token(NTH_VALUE); - } else if (jj_2_1759(2)) { + } else if (jj_2_1783(2)) { jj_consume_token(NUMERIC); - } else if (jj_2_1760(2)) { + } else if (jj_2_1784(2)) { jj_consume_token(OF); - } else if (jj_2_1761(2)) { + } else if (jj_2_1785(2)) { jj_consume_token(ONE); - } else if (jj_2_1762(2)) { + } else if (jj_2_1786(2)) { jj_consume_token(ORDINAL); - } else if (jj_2_1763(2)) { + } else if (jj_2_1787(2)) { jj_consume_token(OVERLAPS); - } else if (jj_2_1764(2)) { + } else if (jj_2_1788(2)) { jj_consume_token(PATTERN); - } else if (jj_2_1765(2)) { + } else if (jj_2_1789(2)) { jj_consume_token(PERCENTILE_CONT); - } else if (jj_2_1766(2)) { + } else if (jj_2_1790(2)) { jj_consume_token(PERIOD); - } else if (jj_2_1767(2)) { + } else if (jj_2_1791(2)) { jj_consume_token(POSITION); - } else if (jj_2_1768(2)) { + } else if (jj_2_1792(2)) { jj_consume_token(PRECEDES); - } else if (jj_2_1769(2)) { + } else if (jj_2_1793(2)) { jj_consume_token(PREV); - } else if (jj_2_1770(2)) { + } else if (jj_2_1794(2)) { jj_consume_token(RANGE); - } else if (jj_2_1771(2)) { + } else if (jj_2_1795(2)) { jj_consume_token(REAL); - } else if (jj_2_1772(2)) { + } else if (jj_2_1796(2)) { jj_consume_token(REFERENCES); - } else if (jj_2_1773(2)) { + } else if (jj_2_1797(2)) { jj_consume_token(REGR_AVGY); - } else if (jj_2_1774(2)) { + } else if (jj_2_1798(2)) { jj_consume_token(REGR_R2); - } else if (jj_2_1775(2)) { + } else if (jj_2_1799(2)) { jj_consume_token(REGR_SXY); - } else if (jj_2_1776(2)) { + } else if (jj_2_1800(2)) { jj_consume_token(RESET); - } else if (jj_2_1777(2)) { + } else if (jj_2_1801(2)) { jj_consume_token(RETURNS); - } else if (jj_2_1778(2)) { + } else if (jj_2_1802(2)) { jj_consume_token(ROLLUP); - } else if (jj_2_1779(2)) { + } else if (jj_2_1803(2)) { jj_consume_token(RUNNING); - } else if (jj_2_1780(2)) { + } else if (jj_2_1804(2)) { jj_consume_token(SAFE_ORDINAL); - } else if (jj_2_1781(2)) { + } else if (jj_2_1805(2)) { jj_consume_token(SCROLL); - } else if (jj_2_1782(2)) { + } else if (jj_2_1806(2)) { jj_consume_token(SEEK); - } else if (jj_2_1783(2)) { + } else if (jj_2_1807(2)) { jj_consume_token(SHOW); - } else if (jj_2_1784(2)) { + } else if (jj_2_1808(2)) { jj_consume_token(SMALLINT); - } else if (jj_2_1785(2)) { + } else if (jj_2_1809(2)) { jj_consume_token(SQL); - } else if (jj_2_1786(2)) { + } else if (jj_2_1810(2)) { jj_consume_token(SQLWARNING); - } else if (jj_2_1787(2)) { + } else if (jj_2_1811(2)) { jj_consume_token(STATIC); - } else if (jj_2_1788(2)) { + } else if (jj_2_1812(2)) { jj_consume_token(STREAM); - } else if (jj_2_1789(2)) { + } else if (jj_2_1813(2)) { jj_consume_token(SUBSTRING); - } else if (jj_2_1790(2)) { + } else if (jj_2_1814(2)) { jj_consume_token(SUM); - } else if (jj_2_1791(2)) { + } else if (jj_2_1815(2)) { jj_consume_token(SYSTEM_USER); - } else if (jj_2_1792(2)) { + } else if (jj_2_1816(2)) { jj_consume_token(TIMESTAMP); - } else if (jj_2_1793(2)) { + } else if (jj_2_1817(2)) { jj_consume_token(TINYINT); - } else if (jj_2_1794(2)) { + } else if (jj_2_1818(2)) { jj_consume_token(TRANSLATION); - } else if (jj_2_1795(2)) { + } else if (jj_2_1819(2)) { jj_consume_token(TRIM); - } else if (jj_2_1796(2)) { + } else if (jj_2_1820(2)) { jj_consume_token(TRY_CAST); - } else if (jj_2_1797(2)) { + } else if (jj_2_1821(2)) { jj_consume_token(UNKNOWN); - } else if (jj_2_1798(2)) { - jj_consume_token(UUID); - } else if (jj_2_1799(2)) { - jj_consume_token(VARBINARY); - } else if (jj_2_1800(2)) { - jj_consume_token(VARYING); - } else if (jj_2_1801(2)) { - jj_consume_token(VERSIONING); - } else if (jj_2_1802(2)) { - jj_consume_token(WINDOW); - } else if (jj_2_1803(2)) { - jj_consume_token(YEAR); - } else if (jj_2_1804(2)) { - jj_consume_token(WEDNESDAY); - } else if (jj_2_1805(2)) { - jj_consume_token(SATURDAY); + } else if (jj_2_1822(2)) { + jj_consume_token(UPSERT); + } else if (jj_2_1823(2)) { + jj_consume_token(VALUE_OF); + } else if (jj_2_1824(2)) { + jj_consume_token(VARCHAR); + } else if (jj_2_1825(2)) { + jj_consume_token(VAR_SAMP); + } else if (jj_2_1826(2)) { + jj_consume_token(WIDTH_BUCKET); + } else if (jj_2_1827(2)) { + jj_consume_token(WITHOUT); + } else if (jj_2_1828(2)) { + jj_consume_token(TUESDAY); + } else if (jj_2_1829(2)) { + jj_consume_token(FRIDAY); } else { jj_consume_token(-1); throw new ParseException(); @@ -24191,760 +24427,590 @@ final private boolean jj_2_1805(int xla) { finally { jj_save(1804, xla); } } - final private boolean jj_3_642() { - if (jj_scan_token(HOUR)) return true; - return false; + final private boolean jj_2_1806(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1806(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1805, xla); } } - final private boolean jj_3_641() { - if (jj_scan_token(MINUTE)) return true; - return false; + final private boolean jj_2_1807(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1807(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1806, xla); } } - final private boolean jj_3_264() { - if (jj_scan_token(WITH)) return true; - if (jj_scan_token(ORDINALITY)) return true; - return false; + final private boolean jj_2_1808(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1808(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1807, xla); } } - final private boolean jj_3_640() { - if (jj_scan_token(SECOND)) return true; - return false; + final private boolean jj_2_1809(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1809(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1808, xla); } } - final private boolean jj_3_639() { - if (jj_scan_token(MILLISECOND)) return true; - return false; + final private boolean jj_2_1810(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1810(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1809, xla); } } - final private boolean jj_3_638() { - if (jj_scan_token(MICROSECOND)) return true; - return false; + final private boolean jj_2_1811(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1811(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1810, xla); } } - final private boolean jj_3R_270() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_637()) { - jj_scanpos = xsp; - if (jj_3_638()) { - jj_scanpos = xsp; - if (jj_3_639()) { - jj_scanpos = xsp; - if (jj_3_640()) { - jj_scanpos = xsp; - if (jj_3_641()) { - jj_scanpos = xsp; - if (jj_3_642()) { - jj_scanpos = xsp; - if (jj_3_643()) { - jj_scanpos = xsp; - if (jj_3_644()) { - jj_scanpos = xsp; - if (jj_3_645()) { - jj_scanpos = xsp; - if (jj_3_646()) { - jj_scanpos = xsp; - if (jj_3_647()) { - jj_scanpos = xsp; - if (jj_3_648()) { - jj_scanpos = xsp; - if (jj_3_649()) { - jj_scanpos = xsp; - if (jj_3_650()) { - jj_scanpos = xsp; - if (jj_3_651()) { - jj_scanpos = xsp; - if (jj_3_652()) { - jj_scanpos = xsp; - if (jj_3_653()) { - jj_scanpos = xsp; - if (jj_3_654()) { - jj_scanpos = xsp; - if (jj_3_655()) { - jj_scanpos = xsp; - if (jj_3_656()) { - jj_scanpos = xsp; - if (jj_3_657()) return true; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - return false; + final private boolean jj_2_1812(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1812(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1811, xla); } } - final private boolean jj_3_637() { - if (jj_scan_token(NANOSECOND)) return true; - return false; + final private boolean jj_2_1813(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1813(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1812, xla); } } - final private boolean jj_3_263() { - if (jj_scan_token(LATERAL)) return true; - return false; + final private boolean jj_2_1814(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1814(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1813, xla); } } - final private boolean jj_3_262() { - if (jj_3R_168()) return true; - return false; + final private boolean jj_2_1815(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1815(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1814, xla); } } - final private boolean jj_3_268() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_263()) jj_scanpos = xsp; - if (jj_scan_token(UNNEST)) return true; - if (jj_3R_173()) return true; - return false; + final private boolean jj_2_1816(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1816(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1815, xla); } } - final private boolean jj_3_259() { - if (jj_3R_168()) return true; - return false; + final private boolean jj_2_1817(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1817(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1816, xla); } } - final private boolean jj_3_261() { - if (jj_scan_token(LATERAL)) return true; - return false; + final private boolean jj_2_1818(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1818(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1817, xla); } } - final private boolean jj_3_258() { - if (jj_3R_167()) return true; - return false; + final private boolean jj_2_1819(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1819(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1818, xla); } } - final private boolean jj_3_257() { - if (jj_3R_158()) return true; - return false; + final private boolean jj_2_1820(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1820(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1819, xla); } } - final private boolean jj_3_267() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_261()) jj_scanpos = xsp; - if (jj_3R_172()) return true; - return false; + final private boolean jj_2_1821(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1821(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1820, xla); } } - final private boolean jj_3_256() { - if (jj_3R_157()) return true; - return false; + final private boolean jj_2_1822(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1822(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1821, xla); } } - final private boolean jj_3R_171() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_256()) { - jj_scanpos = xsp; - if (jj_3R_372()) return true; - } - xsp = jj_scanpos; - if (jj_3_257()) jj_scanpos = xsp; - if (jj_3R_373()) return true; - xsp = jj_scanpos; - if (jj_3_258()) jj_scanpos = xsp; - xsp = jj_scanpos; - if (jj_3_259()) jj_scanpos = xsp; - return false; + final private boolean jj_2_1823(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1823(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1822, xla); } } - final private boolean jj_3_260() { - if (jj_3R_169()) return true; - return false; + final private boolean jj_2_1824(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1824(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1823, xla); } } - final private boolean jj_3_635() { - if (jj_3R_84()) return true; - return false; + final private boolean jj_2_1825(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1825(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1824, xla); } } - final private boolean jj_3R_332() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_634()) { - jj_scanpos = xsp; - if (jj_3_635()) return true; - } - return false; + final private boolean jj_2_1826(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1826(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1825, xla); } } - final private boolean jj_3_634() { - if (jj_3R_270()) return true; - return false; + final private boolean jj_2_1827(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1827(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1826, xla); } } - final private boolean jj_3_266() { - if (jj_3R_170()) return true; + final private boolean jj_2_1828(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1828(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1827, xla); } + } + + final private boolean jj_2_1829(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + try { return !jj_3_1829(); } + catch(LookaheadSuccess ls) { return true; } + finally { jj_save(1828, xla); } + } + + final private boolean jj_3R_262() { Token xsp; xsp = jj_scanpos; - if (jj_3_260()) { + if (jj_3_615()) { jj_scanpos = xsp; - if (jj_3R_171()) return true; + if (jj_3_616()) return true; } return false; } - final private boolean jj_3R_345() { + final private boolean jj_3_615() { + if (jj_scan_token(SECOND)) return true; + return false; + } + + final private boolean jj_3R_349() { Token xsp; xsp = jj_scanpos; - if (jj_3_266()) { - jj_scanpos = xsp; - if (jj_3_267()) { - jj_scanpos = xsp; if (jj_3_268()) { jj_scanpos = xsp; if (jj_3_269()) { jj_scanpos = xsp; - if (jj_3_270()) return true; + if (jj_3_270()) { + jj_scanpos = xsp; + if (jj_3_271()) { + jj_scanpos = xsp; + if (jj_3_272()) return true; } } } } xsp = jj_scanpos; - if (jj_3_271()) jj_scanpos = xsp; + if (jj_3_273()) jj_scanpos = xsp; xsp = jj_scanpos; - if (jj_3_272()) jj_scanpos = xsp; + if (jj_3_274()) jj_scanpos = xsp; xsp = jj_scanpos; - if (jj_3_275()) jj_scanpos = xsp; + if (jj_3_277()) jj_scanpos = xsp; xsp = jj_scanpos; - if (jj_3_276()) jj_scanpos = xsp; - return false; - } - - final private boolean jj_3_630() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_260()) return true; - return false; - } - - final private boolean jj_3_631() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_260()) return true; + if (jj_3_278()) jj_scanpos = xsp; return false; } - final private boolean jj_3R_69() { - if (jj_3R_345()) return true; + final private boolean jj_3_614() { + if (jj_scan_token(MINUTES)) return true; return false; } - final private boolean jj_3_633() { - if (jj_3R_258()) return true; + final private boolean jj_3R_261() { Token xsp; xsp = jj_scanpos; - if (jj_3_631()) jj_scanpos = xsp; - return false; - } - - final private boolean jj_3_629() { - if (jj_3R_257()) return true; - return false; - } - - final private boolean jj_3_628() { - if (jj_3R_256()) return true; - return false; - } - - final private boolean jj_3_627() { - if (jj_3R_265()) return true; + if (jj_3_613()) { + jj_scanpos = xsp; + if (jj_3_614()) return true; + } return false; } - final private boolean jj_3_626() { - if (jj_3R_264()) return true; + final private boolean jj_3_613() { + if (jj_scan_token(MINUTE)) return true; return false; } - final private boolean jj_3_625() { - if (jj_3R_255()) return true; + final private boolean jj_3_612() { + if (jj_scan_token(HOURS)) return true; return false; } - final private boolean jj_3_624() { - if (jj_3R_263()) return true; + final private boolean jj_3R_260() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_611()) { + jj_scanpos = xsp; + if (jj_3_612()) return true; + } return false; } - final private boolean jj_3_623() { - if (jj_3R_261()) return true; + final private boolean jj_3_611() { + if (jj_scan_token(HOUR)) return true; return false; } - final private boolean jj_3_632() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_623()) { - jj_scanpos = xsp; - if (jj_3_624()) { - jj_scanpos = xsp; - if (jj_3_625()) { - jj_scanpos = xsp; - if (jj_3_626()) { - jj_scanpos = xsp; - if (jj_3_627()) { - jj_scanpos = xsp; - if (jj_3_628()) { - jj_scanpos = xsp; - if (jj_3_629()) return true; - } - } - } - } - } - } - if (jj_3R_259()) return true; + final private boolean jj_3_610() { + if (jj_scan_token(DAYS)) return true; return false; } - final private boolean jj_3R_254() { + final private boolean jj_3R_269() { Token xsp; xsp = jj_scanpos; - if (jj_3_632()) { + if (jj_3_609()) { jj_scanpos = xsp; - if (jj_3_633()) return true; + if (jj_3_610()) return true; } return false; } - final private boolean jj_3R_269() { + final private boolean jj_3_609() { + if (jj_scan_token(DAY)) return true; return false; } - final private boolean jj_3_613() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_260()) return true; + final private boolean jj_3R_70() { + if (jj_3R_349()) return true; return false; } - final private boolean jj_3_255() { - if (jj_scan_token(OUTER)) return true; - if (jj_scan_token(APPLY)) return true; + final private boolean jj_3_608() { + if (jj_scan_token(WEEKS)) return true; return false; } - final private boolean jj_3_614() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_260()) return true; + final private boolean jj_3R_268() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_607()) { + jj_scanpos = xsp; + if (jj_3_608()) return true; + } return false; } - final private boolean jj_3_611() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_260()) return true; + final private boolean jj_3_607() { + if (jj_scan_token(WEEK)) return true; return false; } - final private boolean jj_3R_268() { + final private boolean jj_3_606() { + if (jj_scan_token(MONTHS)) return true; return false; } - final private boolean jj_3_622() { - if (jj_3R_258()) return true; + final private boolean jj_3R_259() { Token xsp; xsp = jj_scanpos; - if (jj_3_614()) { + if (jj_3_605()) { jj_scanpos = xsp; - if (jj_3R_269()) return true; + if (jj_3_606()) return true; } return false; } - final private boolean jj_3_612() { - if (jj_scan_token(TO)) return true; - if (jj_3R_258()) return true; + final private boolean jj_3_605() { + if (jj_scan_token(MONTH)) return true; return false; } - final private boolean jj_3_607() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_260()) return true; + final private boolean jj_3_604() { + if (jj_scan_token(QUARTERS)) return true; return false; } - final private boolean jj_3_609() { - if (jj_3R_258()) return true; + final private boolean jj_3R_267() { Token xsp; xsp = jj_scanpos; - if (jj_3_607()) jj_scanpos = xsp; + if (jj_3_603()) { + jj_scanpos = xsp; + if (jj_3_604()) return true; + } return false; } - final private boolean jj_3R_267() { + final private boolean jj_3_603() { + if (jj_scan_token(QUARTER)) return true; return false; } - final private boolean jj_3_254() { - if (jj_scan_token(CROSS)) return true; + final private boolean jj_3_257() { + if (jj_scan_token(OUTER)) return true; if (jj_scan_token(APPLY)) return true; return false; } - final private boolean jj_3_608() { - if (jj_3R_257()) return true; + final private boolean jj_3_602() { + if (jj_scan_token(YEARS)) return true; return false; } - final private boolean jj_3_621() { - if (jj_3R_257()) return true; - if (jj_3R_259()) return true; + final private boolean jj_3R_265() { Token xsp; xsp = jj_scanpos; - if (jj_3_612()) { + if (jj_3_601()) { jj_scanpos = xsp; - if (jj_3R_268()) return true; + if (jj_3_602()) return true; } return false; } - final private boolean jj_3R_166() { + final private boolean jj_3_601() { + if (jj_scan_token(YEAR)) return true; return false; } - final private boolean jj_3_610() { - if (jj_scan_token(TO)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_608()) { - jj_scanpos = xsp; - if (jj_3_609()) return true; - } + final private boolean jj_3_598() { + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_605() { - if (jj_3R_258()) return true; - if (jj_3R_259()) return true; + final private boolean jj_3_597() { + if (jj_3R_200()) return true; return false; } - final private boolean jj_3R_266() { + final private boolean jj_3_256() { + if (jj_scan_token(CROSS)) return true; + if (jj_scan_token(APPLY)) return true; return false; } - final private boolean jj_3_604() { - if (jj_3R_257()) return true; + final private boolean jj_3_596() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_620() { - if (jj_3R_256()) return true; - if (jj_3R_259()) return true; + final private boolean jj_3R_167() { + return false; + } + + final private boolean jj_3_600() { Token xsp; xsp = jj_scanpos; - if (jj_3_610()) { + if (jj_3_596()) { jj_scanpos = xsp; - if (jj_3R_267()) return true; + if (jj_3_597()) { + jj_scanpos = xsp; + if (jj_3_598()) return true; + } } + if (jj_3R_258()) return true; return false; } - final private boolean jj_3_603() { - if (jj_3R_256()) return true; + final private boolean jj_3_599() { + if (jj_3R_251()) return true; + if (jj_3R_219()) return true; return false; } - final private boolean jj_3_252() { + final private boolean jj_3_254() { if (jj_scan_token(USING)) return true; - if (jj_3R_124()) return true; + if (jj_3R_125()) return true; return false; } - final private boolean jj_3_606() { - if (jj_scan_token(TO)) return true; + final private boolean jj_3_594() { + if (jj_scan_token(PLUS)) return true; + return false; + } + + final private boolean jj_3_593() { + if (jj_scan_token(MINUS)) return true; + return false; + } + + final private boolean jj_3_595() { Token xsp; xsp = jj_scanpos; - if (jj_3_603()) { + if (jj_3_593()) { jj_scanpos = xsp; - if (jj_3_604()) { - jj_scanpos = xsp; - if (jj_3_605()) return true; - } + if (jj_3_594()) return true; } return false; } - final private boolean jj_3_619() { - if (jj_3R_265()) return true; - if (jj_3R_259()) return true; + final private boolean jj_3R_250() { + if (jj_scan_token(INTERVAL)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_606()) { + if (jj_3_595()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_599()) { jj_scanpos = xsp; - if (jj_3R_266()) return true; + if (jj_3_600()) return true; } return false; } - final private boolean jj_3_618() { - if (jj_3R_264()) return true; - if (jj_3R_259()) return true; - return false; - } - - final private boolean jj_3_617() { - if (jj_3R_255()) return true; - if (jj_3R_259()) return true; - return false; - } - - final private boolean jj_3R_262() { + final private boolean jj_3_591() { + if (jj_scan_token(PLUS)) return true; return false; } - final private boolean jj_3_602() { - if (jj_scan_token(TO)) return true; - if (jj_3R_255()) return true; + final private boolean jj_3_252() { + if (jj_scan_token(MATCH_CONDITION)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_616() { - if (jj_3R_263()) return true; - if (jj_3R_259()) return true; + final private boolean jj_3_590() { + if (jj_scan_token(MINUS)) return true; return false; } - final private boolean jj_3_615() { - if (jj_3R_261()) return true; - if (jj_3R_259()) return true; + final private boolean jj_3_592() { Token xsp; xsp = jj_scanpos; - if (jj_3_602()) { + if (jj_3_590()) { jj_scanpos = xsp; - if (jj_3R_262()) return true; + if (jj_3_591()) return true; } return false; } - final private boolean jj_3R_215() { + final private boolean jj_3_253() { Token xsp; xsp = jj_scanpos; - if (jj_3_615()) { - jj_scanpos = xsp; - if (jj_3_616()) { - jj_scanpos = xsp; - if (jj_3_617()) { - jj_scanpos = xsp; - if (jj_3_618()) { - jj_scanpos = xsp; - if (jj_3_619()) { - jj_scanpos = xsp; - if (jj_3_620()) { - jj_scanpos = xsp; - if (jj_3_621()) { - jj_scanpos = xsp; - if (jj_3_622()) return true; - } - } - } - } - } - } - } - return false; - } - - final private boolean jj_3_250() { - if (jj_scan_token(MATCH_CONDITION)) return true; - if (jj_3R_81()) return true; + if (jj_3_252()) jj_scanpos = xsp; + if (jj_scan_token(ON)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_251() { + final private boolean jj_3R_195() { + if (jj_scan_token(INTERVAL)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_250()) jj_scanpos = xsp; - if (jj_scan_token(ON)) return true; - if (jj_3R_81()) return true; + if (jj_3_592()) jj_scanpos = xsp; + if (jj_3R_251()) return true; return false; } - final private boolean jj_3R_66() { + final private boolean jj_3R_67() { Token xsp; xsp = jj_scanpos; - if (jj_3_253()) { + if (jj_3_255()) { jj_scanpos = xsp; - if (jj_3_254()) { + if (jj_3_256()) { jj_scanpos = xsp; - if (jj_3_255()) return true; + if (jj_3_257()) return true; } } return false; } - final private boolean jj_3_253() { - if (jj_3R_164()) return true; + final private boolean jj_3_255() { if (jj_3R_165()) return true; - if (jj_3R_69()) return true; + if (jj_3R_166()) return true; + if (jj_3R_70()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_251()) { + if (jj_3_253()) { jj_scanpos = xsp; - if (jj_3_252()) { + if (jj_3_254()) { jj_scanpos = xsp; - if (jj_3R_166()) return true; + if (jj_3R_167()) return true; } } return false; } - final private boolean jj_3_601() { - if (jj_scan_token(SECONDS)) return true; - return false; - } - - final private boolean jj_3R_258() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_600()) { - jj_scanpos = xsp; - if (jj_3_601()) return true; - } - return false; - } - - final private boolean jj_3_600() { - if (jj_scan_token(SECOND)) return true; + final private boolean jj_3R_232() { + if (jj_scan_token(PERIOD)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_599() { - if (jj_scan_token(MINUTES)) return true; + final private boolean jj_3_251() { + if (jj_3R_67()) return true; return false; } final private boolean jj_3R_257() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_598()) { - jj_scanpos = xsp; - if (jj_3_599()) return true; - } - return false; - } - - final private boolean jj_3_598() { - if (jj_scan_token(MINUTE)) return true; - return false; - } - - final private boolean jj_3_597() { - if (jj_scan_token(HOURS)) return true; - return false; - } - - final private boolean jj_3R_256() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_596()) { - jj_scanpos = xsp; - if (jj_3_597()) return true; - } - return false; - } - - final private boolean jj_3_596() { - if (jj_scan_token(HOUR)) return true; - return false; - } - - final private boolean jj_3_249() { - if (jj_3R_66()) return true; return false; } - final private boolean jj_3_595() { - if (jj_scan_token(DAYS)) return true; + final private boolean jj_3_587() { + if (jj_3R_238()) return true; return false; } - final private boolean jj_3R_265() { + final private boolean jj_3_589() { + if (jj_scan_token(LBRACKET)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_594()) { + if (jj_3_587()) { jj_scanpos = xsp; - if (jj_3_595()) return true; + if (jj_3R_257()) return true; } return false; } - final private boolean jj_3_594() { - if (jj_scan_token(DAY)) return true; - return false; - } - - final private boolean jj_3_248() { + final private boolean jj_3_250() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_69()) return true; - return false; - } - - final private boolean jj_3_593() { - if (jj_scan_token(WEEKS)) return true; - return false; - } - - final private boolean jj_3R_264() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_592()) { - jj_scanpos = xsp; - if (jj_3_593()) return true; - } + if (jj_3R_70()) return true; return false; } - final private boolean jj_3_592() { - if (jj_scan_token(WEEK)) return true; + final private boolean jj_3_586() { + if (jj_3R_174()) return true; return false; } - final private boolean jj_3_591() { - if (jj_scan_token(MONTHS)) return true; + final private boolean jj_3_585() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3R_255() { + final private boolean jj_3_588() { Token xsp; xsp = jj_scanpos; - if (jj_3_590()) { + if (jj_3_585()) { jj_scanpos = xsp; - if (jj_3_591()) return true; + if (jj_3_586()) return true; } return false; } - final private boolean jj_3_590() { - if (jj_scan_token(MONTH)) return true; - return false; - } - - final private boolean jj_3R_150() { - if (jj_3R_69()) return true; - return false; - } - - final private boolean jj_3_589() { - if (jj_scan_token(QUARTERS)) return true; + final private boolean jj_3R_151() { + if (jj_3R_70()) return true; return false; } - final private boolean jj_3R_263() { + final private boolean jj_3R_231() { + if (jj_scan_token(MAP)) return true; Token xsp; xsp = jj_scanpos; if (jj_3_588()) { @@ -24954,148 +25020,134 @@ final private boolean jj_3R_263() { return false; } - final private boolean jj_3_588() { - if (jj_scan_token(QUARTER)) return true; + final private boolean jj_3_239() { + if (jj_scan_token(ASOF)) return true; return false; } - final private boolean jj_3_237() { - if (jj_scan_token(ASOF)) return true; + final private boolean jj_3_242() { + if (jj_scan_token(OUTER)) return true; return false; } - final private boolean jj_3_240() { + final private boolean jj_3_241() { if (jj_scan_token(OUTER)) return true; return false; } - final private boolean jj_3_587() { - if (jj_scan_token(YEARS)) return true; + final private boolean jj_3R_409() { return false; } - final private boolean jj_3_239() { + final private boolean jj_3_238() { if (jj_scan_token(OUTER)) return true; return false; } - final private boolean jj_3R_261() { + final private boolean jj_3_240() { Token xsp; xsp = jj_scanpos; - if (jj_3_586()) { + if (jj_3_238()) { jj_scanpos = xsp; - if (jj_3_587()) return true; + if (jj_3_239()) return true; } return false; } - final private boolean jj_3_586() { - if (jj_scan_token(YEAR)) return true; + final private boolean jj_3_582() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_256()) return true; return false; } - final private boolean jj_3_236() { - if (jj_scan_token(OUTER)) return true; + final private boolean jj_3_249() { + if (jj_scan_token(CROSS)) return true; + if (jj_scan_token(JOIN)) return true; return false; } - final private boolean jj_3_238() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_236()) { - jj_scanpos = xsp; - if (jj_3_237()) return true; - } + final private boolean jj_3_581() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_120()) return true; return false; } - final private boolean jj_3_247() { - if (jj_scan_token(CROSS)) return true; - if (jj_scan_token(JOIN)) return true; + final private boolean jj_3_584() { + if (jj_3R_256()) return true; return false; } - final private boolean jj_3_246() { + final private boolean jj_3_248() { if (jj_scan_token(FULL)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_240()) jj_scanpos = xsp; + if (jj_3_242()) jj_scanpos = xsp; if (jj_scan_token(JOIN)) return true; return false; } final private boolean jj_3_583() { - if (jj_3R_152()) return true; + if (jj_3R_120()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_581()) { jj_scanpos = xsp; break; } + } return false; } - final private boolean jj_3_245() { + final private boolean jj_3_247() { if (jj_scan_token(RIGHT)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_239()) jj_scanpos = xsp; + if (jj_3_241()) jj_scanpos = xsp; if (jj_scan_token(JOIN)) return true; return false; } - final private boolean jj_3_582() { - if (jj_3R_198()) return true; - return false; - } - - final private boolean jj_3_244() { + final private boolean jj_3_246() { if (jj_scan_token(LEFT)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_238()) jj_scanpos = xsp; + if (jj_3_240()) jj_scanpos = xsp; if (jj_scan_token(JOIN)) return true; return false; } - final private boolean jj_3_243() { + final private boolean jj_3_245() { if (jj_scan_token(ASOF)) return true; if (jj_scan_token(JOIN)) return true; return false; } - final private boolean jj_3_581() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_81()) return true; + final private boolean jj_3R_256() { + if (jj_scan_token(LBRACE)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_583()) { + jj_scanpos = xsp; + if (jj_3_584()) { + jj_scanpos = xsp; + if (jj_3R_409()) return true; + } + } return false; } - final private boolean jj_3_242() { + final private boolean jj_3_244() { if (jj_scan_token(INNER)) return true; if (jj_scan_token(JOIN)) return true; return false; } - final private boolean jj_3_241() { + final private boolean jj_3_243() { if (jj_scan_token(JOIN)) return true; return false; } - final private boolean jj_3_585() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_581()) { - jj_scanpos = xsp; - if (jj_3_582()) { - jj_scanpos = xsp; - if (jj_3_583()) return true; - } - } - if (jj_3R_254()) return true; - return false; - } - - final private boolean jj_3R_165() { + final private boolean jj_3R_166() { Token xsp; xsp = jj_scanpos; - if (jj_3_241()) { - jj_scanpos = xsp; - if (jj_3_242()) { - jj_scanpos = xsp; if (jj_3_243()) { jj_scanpos = xsp; if (jj_3_244()) { @@ -25104,7 +25156,11 @@ final private boolean jj_3R_165() { jj_scanpos = xsp; if (jj_3_246()) { jj_scanpos = xsp; - if (jj_3_247()) return true; + if (jj_3_247()) { + jj_scanpos = xsp; + if (jj_3_248()) { + jj_scanpos = xsp; + if (jj_3_249()) return true; } } } @@ -25114,695 +25170,715 @@ final private boolean jj_3R_165() { return false; } - final private boolean jj_3_584() { - if (jj_3R_247()) return true; - if (jj_3R_215()) return true; - return false; - } - - final private boolean jj_3R_371() { - return false; - } - - final private boolean jj_3_579() { - if (jj_scan_token(PLUS)) return true; - return false; - } - - final private boolean jj_3R_164() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_235()) { - jj_scanpos = xsp; - if (jj_3R_371()) return true; - } + final private boolean jj_3R_255() { return false; } - final private boolean jj_3_235() { - if (jj_scan_token(NATURAL)) return true; + final private boolean jj_3_578() { + if (jj_3R_238()) return true; return false; } - final private boolean jj_3_578() { - if (jj_scan_token(MINUS)) return true; + final private boolean jj_3R_375() { return false; } final private boolean jj_3_580() { + if (jj_scan_token(LBRACKET)) return true; Token xsp; xsp = jj_scanpos; if (jj_3_578()) { jj_scanpos = xsp; - if (jj_3_579()) return true; + if (jj_3R_255()) return true; } return false; } - final private boolean jj_3R_246() { - if (jj_scan_token(INTERVAL)) return true; + final private boolean jj_3R_165() { Token xsp; xsp = jj_scanpos; - if (jj_3_580()) jj_scanpos = xsp; - xsp = jj_scanpos; - if (jj_3_584()) { + if (jj_3_237()) { jj_scanpos = xsp; - if (jj_3_585()) return true; + if (jj_3R_375()) return true; } return false; } - final private boolean jj_3_234() { - if (jj_3R_81()) return true; + final private boolean jj_3_237() { + if (jj_scan_token(NATURAL)) return true; return false; } - final private boolean jj_3R_365() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_233()) { - jj_scanpos = xsp; - if (jj_3_234()) return true; - } + final private boolean jj_3_1156() { + if (jj_scan_token(JSON)) return true; return false; } - final private boolean jj_3_233() { - if (jj_scan_token(STAR)) return true; + final private boolean jj_3_1155() { + if (jj_scan_token(JSON)) return true; + if (jj_scan_token(SCALAR)) return true; return false; } - final private boolean jj_3R_163() { - if (jj_3R_370()) return true; + final private boolean jj_3_577() { + if (jj_3R_174()) return true; return false; } - final private boolean jj_3_576() { - if (jj_scan_token(PLUS)) return true; + final private boolean jj_3_1154() { + if (jj_scan_token(JSON)) return true; + if (jj_scan_token(ARRAY)) return true; return false; } - final private boolean jj_3_231() { - if (jj_3R_84()) return true; + final private boolean jj_3_236() { + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_575() { - if (jj_scan_token(MINUS)) return true; + final private boolean jj_3_1153() { + if (jj_scan_token(JSON)) return true; + if (jj_scan_token(OBJECT)) return true; return false; } - final private boolean jj_3_577() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_575()) { - jj_scanpos = xsp; - if (jj_3_576()) return true; - } + final private boolean jj_3_1161() { + if (jj_scan_token(FORMAT)) return true; + if (jj_3R_317()) return true; return false; } - final private boolean jj_3_229() { - if (jj_scan_token(MEASURE)) return true; + final private boolean jj_3_1152() { + if (jj_scan_token(JSON)) return true; + if (jj_scan_token(VALUE)) return true; return false; } - final private boolean jj_3R_193() { - if (jj_scan_token(INTERVAL)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_577()) jj_scanpos = xsp; - if (jj_3R_247()) return true; + final private boolean jj_3_576() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_230() { - if (jj_scan_token(AS)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_229()) jj_scanpos = xsp; + final private boolean jj_3_1151() { + if (jj_scan_token(EMPTY)) return true; return false; } - final private boolean jj_3_232() { + final private boolean jj_3R_369() { Token xsp; xsp = jj_scanpos; - if (jj_3_230()) jj_scanpos = xsp; - xsp = jj_scanpos; - if (jj_3_231()) { + if (jj_3_235()) { jj_scanpos = xsp; - if (jj_3R_163()) return true; + if (jj_3_236()) return true; } return false; } - final private boolean jj_3R_144() { - if (jj_3R_365()) return true; - return false; - } - - final private boolean jj_3R_228() { - if (jj_scan_token(PERIOD)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_235() { + if (jj_scan_token(STAR)) return true; return false; } - final private boolean jj_3R_253() { + final private boolean jj_3_1150() { + if (jj_scan_token(UNKNOWN)) return true; return false; } - final private boolean jj_3_228() { - if (jj_scan_token(VALUES)) return true; - if (jj_3R_162()) return true; + final private boolean jj_3_1149() { + if (jj_scan_token(FALSE)) return true; return false; } - final private boolean jj_3_572() { - if (jj_3R_234()) return true; + final private boolean jj_3_1148() { + if (jj_scan_token(TRUE)) return true; return false; } - final private boolean jj_3_227() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(VALUES)) return true; + final private boolean jj_3_1147() { + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_574() { - if (jj_scan_token(LBRACKET)) return true; + final private boolean jj_3_579() { Token xsp; xsp = jj_scanpos; - if (jj_3_572()) { + if (jj_3_576()) { jj_scanpos = xsp; - if (jj_3R_253()) return true; + if (jj_3_577()) return true; } return false; } - final private boolean jj_3_226() { - if (jj_3R_124()) return true; + final private boolean jj_3_1146() { + if (jj_scan_token(JSON)) return true; return false; } - final private boolean jj_3_571() { - if (jj_3R_173()) return true; + final private boolean jj_3R_164() { + if (jj_3R_374()) return true; return false; } - final private boolean jj_3R_160() { - if (jj_scan_token(WHEN)) return true; - if (jj_scan_token(NOT)) return true; + final private boolean jj_3_1159() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_1147()) { + jj_scanpos = xsp; + if (jj_3_1148()) { + jj_scanpos = xsp; + if (jj_3_1149()) { + jj_scanpos = xsp; + if (jj_3_1150()) { + jj_scanpos = xsp; + if (jj_3_1151()) { + jj_scanpos = xsp; + if (jj_3_1152()) { + jj_scanpos = xsp; + if (jj_3_1153()) { + jj_scanpos = xsp; + if (jj_3_1154()) { + jj_scanpos = xsp; + if (jj_3_1155()) { + jj_scanpos = xsp; + if (jj_3_1156()) return true; + } + } + } + } + } + } + } + } + } return false; } - final private boolean jj_3_570() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_1145() { + if (jj_scan_token(JSON)) return true; + if (jj_scan_token(SCALAR)) return true; return false; } - final private boolean jj_3_573() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_570()) { - jj_scanpos = xsp; - if (jj_3_571()) return true; - } + final private boolean jj_3_1144() { + if (jj_scan_token(JSON)) return true; + if (jj_scan_token(ARRAY)) return true; return false; } - final private boolean jj_3R_227() { - if (jj_scan_token(MAP)) return true; + final private boolean jj_3R_230() { + if (jj_scan_token(ARRAY)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_573()) { + if (jj_3_579()) { jj_scanpos = xsp; - if (jj_3_574()) return true; + if (jj_3_580()) return true; } return false; } - final private boolean jj_3_225() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_152()) return true; - return false; - } - - final private boolean jj_3R_397() { + final private boolean jj_3_1143() { + if (jj_scan_token(JSON)) return true; + if (jj_scan_token(OBJECT)) return true; return false; } - final private boolean jj_3_567() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_252()) return true; + final private boolean jj_3_1142() { + if (jj_scan_token(JSON)) return true; + if (jj_scan_token(VALUE)) return true; return false; } - final private boolean jj_3_569() { - if (jj_3R_252()) return true; + final private boolean jj_3_233() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_566() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_119()) return true; + final private boolean jj_3_1141() { + if (jj_scan_token(EMPTY)) return true; return false; } - final private boolean jj_3R_161() { - if (jj_scan_token(WHEN)) return true; - if (jj_scan_token(MATCHED)) return true; + final private boolean jj_3_1140() { + if (jj_scan_token(A)) return true; + if (jj_scan_token(SET)) return true; return false; } - final private boolean jj_3_568() { - if (jj_3R_119()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_566()) { jj_scanpos = xsp; break; } - } + final private boolean jj_3_1139() { + if (jj_scan_token(UNKNOWN)) return true; return false; } - final private boolean jj_3R_252() { - if (jj_scan_token(LBRACE)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_568()) { - jj_scanpos = xsp; - if (jj_3_569()) { - jj_scanpos = xsp; - if (jj_3R_397()) return true; - } - } + final private boolean jj_3_1138() { + if (jj_scan_token(FALSE)) return true; return false; } - final private boolean jj_3_222() { - if (jj_3R_160()) return true; + final private boolean jj_3_1137() { + if (jj_scan_token(TRUE)) return true; return false; } - final private boolean jj_3_224() { - if (jj_3R_160()) return true; + final private boolean jj_3_231() { + if (jj_scan_token(MEASURE)) return true; return false; } - final private boolean jj_3R_251() { + final private boolean jj_3_1136() { + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_563() { - if (jj_3R_234()) return true; + final private boolean jj_3_232() { + if (jj_scan_token(AS)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_231()) jj_scanpos = xsp; return false; } - final private boolean jj_3_223() { - if (jj_3R_161()) return true; + final private boolean jj_3_573() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_79()) return true; return false; } - final private boolean jj_3_220() { - if (jj_scan_token(AS)) return true; + final private boolean jj_3_1158() { + if (jj_scan_token(NOT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_1136()) { + jj_scanpos = xsp; + if (jj_3_1137()) { + jj_scanpos = xsp; + if (jj_3_1138()) { + jj_scanpos = xsp; + if (jj_3_1139()) { + jj_scanpos = xsp; + if (jj_3_1140()) { + jj_scanpos = xsp; + if (jj_3_1141()) { + jj_scanpos = xsp; + if (jj_3_1142()) { + jj_scanpos = xsp; + if (jj_3_1143()) { + jj_scanpos = xsp; + if (jj_3_1144()) { + jj_scanpos = xsp; + if (jj_3_1145()) { + jj_scanpos = xsp; + if (jj_3_1146()) return true; + } + } + } + } + } + } + } + } + } + } return false; } - final private boolean jj_3_565() { - if (jj_scan_token(LBRACKET)) return true; + final private boolean jj_3_234() { Token xsp; xsp = jj_scanpos; - if (jj_3_563()) { + if (jj_3_232()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_233()) { jj_scanpos = xsp; - if (jj_3R_251()) return true; + if (jj_3R_164()) return true; } return false; } - final private boolean jj_3_221() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_220()) jj_scanpos = xsp; - if (jj_3R_84()) return true; - return false; - } - - final private boolean jj_3_219() { - if (jj_3R_158()) return true; - return false; - } - - final private boolean jj_3_218() { - if (jj_3R_157()) return true; + final private boolean jj_3_1157() { + if (jj_scan_token(A)) return true; + if (jj_scan_token(SET)) return true; return false; } - final private boolean jj_3R_116() { - if (jj_scan_token(MERGE)) return true; - if (jj_scan_token(INTO)) return true; + final private boolean jj_3_575() { + if (jj_scan_token(LBRACKET)) return true; + if (jj_3R_79()) return true; return false; } - final private boolean jj_3_562() { - if (jj_3R_173()) return true; + final private boolean jj_3_572() { + if (jj_scan_token(TIMESTAMP)) return true; return false; } - final private boolean jj_3_561() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3R_145() { + if (jj_3R_369()) return true; return false; } - final private boolean jj_3_564() { + final private boolean jj_3R_218() { Token xsp; xsp = jj_scanpos; - if (jj_3_561()) { + if (jj_3_1160()) { jj_scanpos = xsp; - if (jj_3_562()) return true; + if (jj_3_1161()) return true; } return false; } - final private boolean jj_3R_226() { - if (jj_scan_token(ARRAY)) return true; + final private boolean jj_3_1160() { + if (jj_scan_token(IS)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_564()) { + if (jj_3_1157()) { + jj_scanpos = xsp; + if (jj_3_1158()) { jj_scanpos = xsp; - if (jj_3_565()) return true; + if (jj_3_1159()) return true; + } } return false; } - final private boolean jj_3_217() { - if (jj_3R_145()) return true; + final private boolean jj_3_574() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_254()) return true; return false; } - final private boolean jj_3_216() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_152()) return true; + final private boolean jj_3_558() { + if (jj_scan_token(LOCAL)) return true; return false; } - final private boolean jj_3_214() { - if (jj_scan_token(AS)) return true; + final private boolean jj_3_1135() { + if (jj_scan_token(UNIQUE)) return true; return false; } - final private boolean jj_3_558() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_78()) return true; + final private boolean jj_3_1134() { + if (jj_scan_token(EXISTS)) return true; return false; } - final private boolean jj_3_215() { + final private boolean jj_3R_229() { + if (jj_scan_token(MULTISET)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_214()) jj_scanpos = xsp; - if (jj_3R_84()) return true; + if (jj_3_574()) { + jj_scanpos = xsp; + if (jj_3_575()) return true; + } return false; } - final private boolean jj_3_213() { - if (jj_3R_158()) return true; + final private boolean jj_3_571() { + if (jj_scan_token(DATETIME)) return true; return false; } - final private boolean jj_3_212() { - if (jj_3R_157()) return true; + final private boolean jj_3_1133() { + if (jj_scan_token(NOT)) return true; return false; } - final private boolean jj_3_560() { - if (jj_scan_token(LBRACKET)) return true; - if (jj_3R_78()) return true; + final private boolean jj_3_1132() { + if (jj_scan_token(MINUS)) return true; + return false; + } + + final private boolean jj_3R_426() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_1131()) { + jj_scanpos = xsp; + if (jj_3_1132()) { + jj_scanpos = xsp; + if (jj_3_1133()) { + jj_scanpos = xsp; + if (jj_3_1134()) { + jj_scanpos = xsp; + if (jj_3_1135()) return true; + } + } + } + } + return false; + } + + final private boolean jj_3_1131() { + if (jj_scan_token(PLUS)) return true; + return false; + } + + final private boolean jj_3_230() { + if (jj_scan_token(VALUES)) return true; + if (jj_3R_163()) return true; return false; } final private boolean jj_3_557() { - if (jj_scan_token(TIMESTAMP)) return true; + if (jj_scan_token(LOCAL)) return true; return false; } - final private boolean jj_3R_115() { - if (jj_scan_token(UPDATE)) return true; - if (jj_3R_170()) return true; + final private boolean jj_3_570() { + if (jj_scan_token(TIME)) return true; return false; } - final private boolean jj_3_559() { + final private boolean jj_3_229() { if (jj_scan_token(LPAREN)) return true; - if (jj_3R_250()) return true; + if (jj_scan_token(VALUES)) return true; return false; } - final private boolean jj_3_1133() { - if (jj_scan_token(JSON)) return true; + final private boolean jj_3_1130() { + if (jj_3R_344()) return true; return false; } - final private boolean jj_3_543() { - if (jj_scan_token(LOCAL)) return true; + final private boolean jj_3_1129() { + if (jj_scan_token(IMMEDIATELY)) return true; + if (jj_scan_token(SUCCEEDS)) return true; return false; } - final private boolean jj_3_1132() { - if (jj_scan_token(JSON)) return true; - if (jj_scan_token(SCALAR)) return true; + final private boolean jj_3_1128() { + if (jj_scan_token(IMMEDIATELY)) return true; + if (jj_scan_token(PRECEDES)) return true; return false; } - final private boolean jj_3_1131() { - if (jj_scan_token(JSON)) return true; - if (jj_scan_token(ARRAY)) return true; + final private boolean jj_3_1127() { + if (jj_scan_token(SUCCEEDS)) return true; return false; } - final private boolean jj_3R_225() { - if (jj_scan_token(MULTISET)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_559()) { - jj_scanpos = xsp; - if (jj_3_560()) return true; - } + final private boolean jj_3_228() { + if (jj_3R_125()) return true; return false; } - final private boolean jj_3_556() { - if (jj_scan_token(DATETIME)) return true; + final private boolean jj_3_1126() { + if (jj_scan_token(PRECEDES)) return true; return false; } - final private boolean jj_3_1130() { - if (jj_scan_token(JSON)) return true; - if (jj_scan_token(OBJECT)) return true; + final private boolean jj_3_1125() { + if (jj_scan_token(AMPERSAND)) return true; return false; } - final private boolean jj_3_1129() { - if (jj_scan_token(JSON)) return true; - if (jj_scan_token(VALUE)) return true; + final private boolean jj_3_1124() { + if (jj_scan_token(EQUALS)) return true; return false; } - final private boolean jj_3_1138() { - if (jj_scan_token(FORMAT)) return true; - if (jj_3R_313()) return true; + final private boolean jj_3_569() { + if (jj_scan_token(DATE)) return true; return false; } - final private boolean jj_3_1128() { - if (jj_scan_token(EMPTY)) return true; + final private boolean jj_3_1123() { + if (jj_scan_token(CARET)) return true; return false; } - final private boolean jj_3_1127() { - if (jj_scan_token(UNKNOWN)) return true; + final private boolean jj_3R_297() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_569()) { + jj_scanpos = xsp; + if (jj_3_570()) { + jj_scanpos = xsp; + if (jj_3_571()) { + jj_scanpos = xsp; + if (jj_3_572()) return true; + } + } + } + if (jj_3R_224()) return true; return false; } - final private boolean jj_3_1126() { - if (jj_scan_token(FALSE)) return true; + final private boolean jj_3_1122() { + if (jj_scan_token(OVERLAPS)) return true; return false; } - final private boolean jj_3_1125() { - if (jj_scan_token(TRUE)) return true; + final private boolean jj_3_1121() { + if (jj_scan_token(CONTAINS)) return true; return false; } - final private boolean jj_3_1124() { - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_1120() { + if (jj_scan_token(NOT)) return true; + if (jj_scan_token(SUBMULTISET)) return true; + if (jj_scan_token(OF)) return true; return false; } - final private boolean jj_3_542() { - if (jj_scan_token(LOCAL)) return true; + final private boolean jj_3_1119() { + if (jj_scan_token(SUBMULTISET)) return true; + if (jj_scan_token(OF)) return true; return false; } - final private boolean jj_3_555() { - if (jj_scan_token(TIME)) return true; + final private boolean jj_3_1118() { + if (jj_scan_token(MEMBER)) return true; + if (jj_scan_token(OF)) return true; return false; } - final private boolean jj_3_1123() { - if (jj_scan_token(JSON)) return true; + final private boolean jj_3_1117() { + if (jj_scan_token(IS)) return true; + if (jj_scan_token(NOT)) return true; + if (jj_scan_token(DISTINCT)) return true; return false; } - final private boolean jj_3_209() { - if (jj_scan_token(AS)) return true; + final private boolean jj_3_1116() { + if (jj_scan_token(IS)) return true; + if (jj_scan_token(DISTINCT)) return true; + if (jj_scan_token(FROM)) return true; return false; } - final private boolean jj_3_1122() { - if (jj_scan_token(JSON)) return true; - if (jj_scan_token(SCALAR)) return true; + final private boolean jj_3R_161() { + if (jj_scan_token(WHEN)) return true; + if (jj_scan_token(NOT)) return true; return false; } - final private boolean jj_3_1136() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_1124()) { - jj_scanpos = xsp; - if (jj_3_1125()) { - jj_scanpos = xsp; - if (jj_3_1126()) { - jj_scanpos = xsp; - if (jj_3_1127()) { - jj_scanpos = xsp; - if (jj_3_1128()) { - jj_scanpos = xsp; - if (jj_3_1129()) { - jj_scanpos = xsp; - if (jj_3_1130()) { - jj_scanpos = xsp; - if (jj_3_1131()) { - jj_scanpos = xsp; - if (jj_3_1132()) { - jj_scanpos = xsp; - if (jj_3_1133()) return true; - } - } - } - } - } - } - } - } - } + final private boolean jj_3_1115() { + if (jj_scan_token(OR)) return true; return false; } - final private boolean jj_3_211() { - if (jj_3R_145()) return true; + final private boolean jj_3_1114() { + if (jj_scan_token(AND)) return true; return false; } - final private boolean jj_3_1121() { - if (jj_scan_token(JSON)) return true; - if (jj_scan_token(ARRAY)) return true; + final private boolean jj_3_1113() { + if (jj_scan_token(CONCAT)) return true; return false; } - final private boolean jj_3_210() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_209()) jj_scanpos = xsp; - if (jj_3R_84()) return true; + final private boolean jj_3_1112() { + if (jj_scan_token(PERCENT_REMAINDER)) return true; return false; } - final private boolean jj_3_1120() { - if (jj_scan_token(JSON)) return true; - if (jj_scan_token(OBJECT)) return true; + final private boolean jj_3_1111() { + if (jj_scan_token(SLASH)) return true; return false; } - final private boolean jj_3_208() { - if (jj_3R_158()) return true; + final private boolean jj_3_568() { + if (jj_scan_token(TIMESTAMP)) return true; + if (jj_scan_token(WITH)) return true; return false; } - final private boolean jj_3_1119() { - if (jj_scan_token(JSON)) return true; - if (jj_scan_token(VALUE)) return true; + final private boolean jj_3_1110() { + if (jj_scan_token(STAR)) return true; return false; } - final private boolean jj_3_207() { - if (jj_3R_157()) return true; + final private boolean jj_3_1109() { + if (jj_scan_token(MINUS)) return true; return false; } - final private boolean jj_3_1118() { - if (jj_scan_token(EMPTY)) return true; + final private boolean jj_3_1108() { + if (jj_scan_token(PLUS)) return true; return false; } - final private boolean jj_3_1117() { - if (jj_scan_token(A)) return true; - if (jj_scan_token(SET)) return true; + final private boolean jj_3_567() { + if (jj_scan_token(TIME)) return true; + if (jj_scan_token(WITH)) return true; return false; } - final private boolean jj_3_1116() { - if (jj_scan_token(UNKNOWN)) return true; + final private boolean jj_3_227() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_554() { - if (jj_scan_token(DATE)) return true; + final private boolean jj_3_1107() { + if (jj_scan_token(NE2)) return true; return false; } - final private boolean jj_3_1115() { - if (jj_scan_token(FALSE)) return true; + final private boolean jj_3_1106() { + if (jj_scan_token(NE)) return true; return false; } - final private boolean jj_3R_293() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_554()) { - jj_scanpos = xsp; - if (jj_3_555()) { - jj_scanpos = xsp; - if (jj_3_556()) { - jj_scanpos = xsp; - if (jj_3_557()) return true; - } - } - } - if (jj_3R_220()) return true; + final private boolean jj_3_566() { + if (jj_scan_token(TIMESTAMP)) return true; + if (jj_3R_251()) return true; return false; } - final private boolean jj_3_1114() { - if (jj_scan_token(TRUE)) return true; + final private boolean jj_3_1105() { + if (jj_scan_token(GE)) return true; return false; } - final private boolean jj_3_1113() { - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_1104() { + if (jj_scan_token(LE)) return true; return false; } - final private boolean jj_3R_114() { - if (jj_scan_token(DELETE)) return true; - if (jj_scan_token(FROM)) return true; + final private boolean jj_3_1103() { + if (jj_scan_token(LT)) return true; return false; } - final private boolean jj_3_1135() { - if (jj_scan_token(NOT)) return true; + final private boolean jj_3_1102() { + if (jj_scan_token(GT)) return true; + return false; + } + + final private boolean jj_3_1101() { + if (jj_scan_token(LEFTSHIFT)) return true; + return false; + } + + final private boolean jj_3R_217() { Token xsp; xsp = jj_scanpos; + if (jj_3_1100()) { + jj_scanpos = xsp; + if (jj_3_1101()) { + jj_scanpos = xsp; + if (jj_3_1102()) { + jj_scanpos = xsp; + if (jj_3_1103()) { + jj_scanpos = xsp; + if (jj_3_1104()) { + jj_scanpos = xsp; + if (jj_3_1105()) { + jj_scanpos = xsp; + if (jj_3_1106()) { + jj_scanpos = xsp; + if (jj_3_1107()) { + jj_scanpos = xsp; + if (jj_3_1108()) { + jj_scanpos = xsp; + if (jj_3_1109()) { + jj_scanpos = xsp; + if (jj_3_1110()) { + jj_scanpos = xsp; + if (jj_3_1111()) { + jj_scanpos = xsp; + if (jj_3_1112()) { + jj_scanpos = xsp; if (jj_3_1113()) { jj_scanpos = xsp; if (jj_3_1114()) { @@ -25823,7 +25899,41 @@ final private boolean jj_3_1135() { jj_scanpos = xsp; if (jj_3_1122()) { jj_scanpos = xsp; - if (jj_3_1123()) return true; + if (jj_3_1123()) { + jj_scanpos = xsp; + if (jj_3_1124()) { + jj_scanpos = xsp; + if (jj_3_1125()) { + jj_scanpos = xsp; + if (jj_3_1126()) { + jj_scanpos = xsp; + if (jj_3_1127()) { + jj_scanpos = xsp; + if (jj_3_1128()) { + jj_scanpos = xsp; + if (jj_3_1129()) { + jj_scanpos = xsp; + if (jj_3_1130()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } } } } @@ -25837,307 +25947,217 @@ final private boolean jj_3_1135() { return false; } - final private boolean jj_3_1134() { - if (jj_scan_token(A)) return true; - if (jj_scan_token(SET)) return true; + final private boolean jj_3_565() { + if (jj_scan_token(UUID)) return true; + if (jj_3R_251()) return true; return false; } - final private boolean jj_3R_214() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_1137()) { - jj_scanpos = xsp; - if (jj_3_1138()) return true; - } + final private boolean jj_3_1100() { + if (jj_scan_token(EQ)) return true; return false; } - final private boolean jj_3_1137() { - if (jj_scan_token(IS)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_1134()) { - jj_scanpos = xsp; - if (jj_3_1135()) { - jj_scanpos = xsp; - if (jj_3_1136()) return true; - } - } + final private boolean jj_3R_162() { + if (jj_scan_token(WHEN)) return true; + if (jj_scan_token(MATCHED)) return true; return false; } - final private boolean jj_3_553() { - if (jj_scan_token(TIMESTAMP)) return true; - if (jj_scan_token(WITH)) return true; + final private boolean jj_3_564() { + if (jj_scan_token(TIME)) return true; + if (jj_3R_251()) return true; return false; } - final private boolean jj_3_552() { - if (jj_scan_token(TIME)) return true; - if (jj_scan_token(WITH)) return true; + final private boolean jj_3_1095() { + if (jj_scan_token(DISTINCT)) return true; return false; } - final private boolean jj_3_1112() { - if (jj_scan_token(UNIQUE)) return true; + final private boolean jj_3_1094() { + if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_1111() { - if (jj_scan_token(EXISTS)) return true; + final private boolean jj_3_1096() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_1094()) { + jj_scanpos = xsp; + if (jj_3_1095()) return true; + } return false; } - final private boolean jj_3_1110() { - if (jj_scan_token(NOT)) return true; + final private boolean jj_3_563() { + if (jj_scan_token(DATETIME)) return true; + if (jj_3R_251()) return true; return false; } - final private boolean jj_3_551() { - if (jj_scan_token(TIMESTAMP)) return true; - if (jj_3R_247()) return true; + final private boolean jj_3_562() { + if (jj_scan_token(DATE)) return true; + if (jj_3R_251()) return true; return false; } - final private boolean jj_3_1109() { - if (jj_scan_token(MINUS)) return true; + final private boolean jj_3_1092() { + if (jj_scan_token(DISTINCT)) return true; return false; } - final private boolean jj_3R_414() { + final private boolean jj_3_1099() { + if (jj_scan_token(EXCEPT)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_1108()) { - jj_scanpos = xsp; - if (jj_3_1109()) { - jj_scanpos = xsp; - if (jj_3_1110()) { - jj_scanpos = xsp; - if (jj_3_1111()) { - jj_scanpos = xsp; - if (jj_3_1112()) return true; - } - } - } - } + if (jj_3_1096()) jj_scanpos = xsp; return false; } - final private boolean jj_3_1108() { - if (jj_scan_token(PLUS)) return true; + final private boolean jj_3_1091() { + if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_550() { - if (jj_scan_token(UUID)) return true; - if (jj_3R_247()) return true; + final private boolean jj_3_1093() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_1091()) { + jj_scanpos = xsp; + if (jj_3_1092()) return true; + } return false; } - final private boolean jj_3_206() { - if (jj_3R_159()) return true; + final private boolean jj_3_224() { + if (jj_3R_161()) return true; return false; } - final private boolean jj_3_549() { - if (jj_scan_token(TIME)) return true; - if (jj_3R_247()) return true; - return false; - } - - final private boolean jj_3_1107() { - if (jj_3R_340()) return true; - return false; - } - - final private boolean jj_3_1106() { - if (jj_scan_token(IMMEDIATELY)) return true; - if (jj_scan_token(SUCCEEDS)) return true; - return false; - } - - final private boolean jj_3_1105() { - if (jj_scan_token(IMMEDIATELY)) return true; - if (jj_scan_token(PRECEDES)) return true; - return false; - } - - final private boolean jj_3_1104() { - if (jj_scan_token(SUCCEEDS)) return true; - return false; - } - - final private boolean jj_3_205() { - if (jj_3R_158()) return true; - return false; - } - - final private boolean jj_3_548() { - if (jj_scan_token(DATETIME)) return true; - if (jj_3R_247()) return true; - return false; - } - - final private boolean jj_3_1103() { - if (jj_scan_token(PRECEDES)) return true; - return false; - } - - final private boolean jj_3_204() { - if (jj_3R_157()) return true; - return false; - } - - final private boolean jj_3_1102() { - if (jj_scan_token(EQUALS)) return true; - return false; - } - - final private boolean jj_3_1101() { - if (jj_scan_token(OVERLAPS)) return true; + final private boolean jj_3_226() { + if (jj_3R_161()) return true; return false; } - final private boolean jj_3_1100() { - if (jj_scan_token(CONTAINS)) return true; + final private boolean jj_3_561() { + if (jj_scan_token(LBRACE_TS)) return true; + if (jj_scan_token(QUOTED_STRING)) return true; return false; } - final private boolean jj_3_547() { - if (jj_scan_token(DATE)) return true; - if (jj_3R_247()) return true; + final private boolean jj_3_225() { + if (jj_3R_162()) return true; return false; } - final private boolean jj_3_1099() { - if (jj_scan_token(NOT)) return true; - if (jj_scan_token(SUBMULTISET)) return true; - if (jj_scan_token(OF)) return true; + final private boolean jj_3_1089() { + if (jj_scan_token(DISTINCT)) return true; return false; } final private boolean jj_3_1098() { - if (jj_scan_token(SUBMULTISET)) return true; - if (jj_scan_token(OF)) return true; + if (jj_scan_token(INTERSECT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_1093()) jj_scanpos = xsp; return false; } - final private boolean jj_3_203() { - if (jj_scan_token(UPSERT)) return true; + final private boolean jj_3_1088() { + if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_1097() { - if (jj_scan_token(MEMBER)) return true; - if (jj_scan_token(OF)) return true; + final private boolean jj_3_1090() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_1088()) { + jj_scanpos = xsp; + if (jj_3_1089()) return true; + } return false; } - final private boolean jj_3_1096() { - if (jj_scan_token(IS)) return true; - if (jj_scan_token(NOT)) return true; - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3_222() { + if (jj_scan_token(AS)) return true; return false; } - final private boolean jj_3_202() { - if (jj_scan_token(INSERT)) return true; + final private boolean jj_3_223() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_222()) jj_scanpos = xsp; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_1095() { - if (jj_scan_token(IS)) return true; - if (jj_scan_token(DISTINCT)) return true; - if (jj_scan_token(FROM)) return true; + final private boolean jj_3_560() { + if (jj_scan_token(LBRACE_T)) return true; + if (jj_scan_token(QUOTED_STRING)) return true; return false; } - final private boolean jj_3_1094() { - if (jj_scan_token(OR)) return true; + final private boolean jj_3_221() { + if (jj_3R_159()) return true; return false; } - final private boolean jj_3_1093() { - if (jj_scan_token(AND)) return true; + final private boolean jj_3_1097() { + if (jj_scan_token(UNION)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_1090()) jj_scanpos = xsp; return false; } - final private boolean jj_3_546() { - if (jj_scan_token(LBRACE_TS)) return true; - if (jj_scan_token(QUOTED_STRING)) return true; + final private boolean jj_3_220() { + if (jj_3R_158()) return true; return false; } - final private boolean jj_3_1092() { - if (jj_scan_token(CONCAT)) return true; + final private boolean jj_3R_117() { + if (jj_scan_token(MERGE)) return true; + if (jj_scan_token(INTO)) return true; return false; } - final private boolean jj_3R_113() { + final private boolean jj_3R_344() { + if (jj_scan_token(MULTISET)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_202()) { + if (jj_3_1097()) { + jj_scanpos = xsp; + if (jj_3_1098()) { jj_scanpos = xsp; - if (jj_3_203()) return true; + if (jj_3_1099()) return true; + } } - if (jj_3R_357()) return true; - return false; - } - - final private boolean jj_3_1091() { - if (jj_scan_token(PERCENT_REMAINDER)) return true; - return false; - } - - final private boolean jj_3_545() { - if (jj_scan_token(LBRACE_T)) return true; - if (jj_scan_token(QUOTED_STRING)) return true; - return false; - } - - final private boolean jj_3_1090() { - if (jj_scan_token(SLASH)) return true; - return false; - } - - final private boolean jj_3_1089() { - if (jj_scan_token(STAR)) return true; - return false; - } - - final private boolean jj_3_1088() { - if (jj_scan_token(MINUS)) return true; - return false; - } - - final private boolean jj_3_1087() { - if (jj_scan_token(PLUS)) return true; return false; } - final private boolean jj_3R_245() { + final private boolean jj_3R_249() { Token xsp; xsp = jj_scanpos; - if (jj_3_544()) { + if (jj_3_559()) { jj_scanpos = xsp; - if (jj_3_545()) { + if (jj_3_560()) { jj_scanpos = xsp; - if (jj_3_546()) { + if (jj_3_561()) { jj_scanpos = xsp; - if (jj_3_547()) { + if (jj_3_562()) { jj_scanpos = xsp; - if (jj_3_548()) { + if (jj_3_563()) { jj_scanpos = xsp; - if (jj_3_549()) { + if (jj_3_564()) { jj_scanpos = xsp; - if (jj_3_550()) { + if (jj_3_565()) { jj_scanpos = xsp; - if (jj_3_551()) { + if (jj_3_566()) { jj_scanpos = xsp; - if (jj_3_552()) { + if (jj_3_567()) { jj_scanpos = xsp; - if (jj_3_553()) return true; + if (jj_3_568()) return true; } } } @@ -26150,832 +26170,676 @@ final private boolean jj_3R_245() { return false; } - final private boolean jj_3_544() { + final private boolean jj_3_559() { if (jj_scan_token(LBRACE_D)) return true; if (jj_scan_token(QUOTED_STRING)) return true; return false; } - final private boolean jj_3_1086() { - if (jj_scan_token(NE2)) return true; - return false; - } - - final private boolean jj_3_1085() { - if (jj_scan_token(NE)) return true; + final private boolean jj_3R_343() { return false; } final private boolean jj_3_1084() { - if (jj_scan_token(GE)) return true; + if (jj_scan_token(DISTINCT)) return true; return false; } final private boolean jj_3_1083() { - if (jj_scan_token(LE)) return true; + if (jj_scan_token(ALL)) return true; return false; } final private boolean jj_3_1082() { - if (jj_scan_token(LT)) return true; + if (jj_scan_token(SET_MINUS)) return true; + return false; + } + + final private boolean jj_3_556() { + if (jj_scan_token(BIG_QUERY_DOUBLE_QUOTED_STRING)) return true; return false; } final private boolean jj_3_1081() { - if (jj_scan_token(GT)) return true; + if (jj_scan_token(EXCEPT)) return true; return false; } - final private boolean jj_3R_213() { + final private boolean jj_3_555() { + if (jj_scan_token(BIG_QUERY_QUOTED_STRING)) return true; + return false; + } + + final private boolean jj_3R_342() { + return false; + } + + final private boolean jj_3_219() { + if (jj_3R_146()) return true; + return false; + } + + final private boolean jj_3_1080() { + if (jj_scan_token(DISTINCT)) return true; + return false; + } + + final private boolean jj_3_1087() { Token xsp; xsp = jj_scanpos; - if (jj_3_1080()) { - jj_scanpos = xsp; if (jj_3_1081()) { jj_scanpos = xsp; - if (jj_3_1082()) { - jj_scanpos = xsp; + if (jj_3_1082()) return true; + } + xsp = jj_scanpos; if (jj_3_1083()) { jj_scanpos = xsp; if (jj_3_1084()) { jj_scanpos = xsp; - if (jj_3_1085()) { - jj_scanpos = xsp; - if (jj_3_1086()) { - jj_scanpos = xsp; - if (jj_3_1087()) { - jj_scanpos = xsp; - if (jj_3_1088()) { - jj_scanpos = xsp; - if (jj_3_1089()) { - jj_scanpos = xsp; - if (jj_3_1090()) { - jj_scanpos = xsp; - if (jj_3_1091()) { - jj_scanpos = xsp; - if (jj_3_1092()) { - jj_scanpos = xsp; - if (jj_3_1093()) { - jj_scanpos = xsp; - if (jj_3_1094()) { - jj_scanpos = xsp; - if (jj_3_1095()) { - jj_scanpos = xsp; - if (jj_3_1096()) { - jj_scanpos = xsp; - if (jj_3_1097()) { - jj_scanpos = xsp; - if (jj_3_1098()) { - jj_scanpos = xsp; - if (jj_3_1099()) { - jj_scanpos = xsp; - if (jj_3_1100()) { - jj_scanpos = xsp; - if (jj_3_1101()) { - jj_scanpos = xsp; - if (jj_3_1102()) { - jj_scanpos = xsp; - if (jj_3_1103()) { - jj_scanpos = xsp; - if (jj_3_1104()) { - jj_scanpos = xsp; - if (jj_3_1105()) { - jj_scanpos = xsp; - if (jj_3_1106()) { - jj_scanpos = xsp; - if (jj_3_1107()) return true; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } + if (jj_3R_343()) return true; } } return false; } - final private boolean jj_3_1080() { - if (jj_scan_token(EQ)) return true; - return false; - } - - final private boolean jj_3_541() { - if (jj_scan_token(BIG_QUERY_DOUBLE_QUOTED_STRING)) return true; - return false; - } - - final private boolean jj_3_1075() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3_218() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_1074() { + final private boolean jj_3_1079() { if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_1076() { + final private boolean jj_3R_251() { Token xsp; xsp = jj_scanpos; - if (jj_3_1074()) { + if (jj_3_554()) { + jj_scanpos = xsp; + if (jj_3_555()) { jj_scanpos = xsp; - if (jj_3_1075()) return true; + if (jj_3_556()) return true; + } } return false; } - final private boolean jj_3_540() { - if (jj_scan_token(BIG_QUERY_QUOTED_STRING)) return true; + final private boolean jj_3_554() { + if (jj_scan_token(QUOTED_STRING)) return true; return false; } - final private boolean jj_3_1072() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3R_341() { return false; } - final private boolean jj_3_1079() { - if (jj_scan_token(EXCEPT)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_1076()) jj_scanpos = xsp; + final private boolean jj_3_1078() { + if (jj_scan_token(DISTINCT)) return true; return false; } - final private boolean jj_3R_247() { + final private boolean jj_3_1086() { + if (jj_scan_token(INTERSECT)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_539()) { + if (jj_3_1079()) { jj_scanpos = xsp; - if (jj_3_540()) { + if (jj_3_1080()) { jj_scanpos = xsp; - if (jj_3_541()) return true; + if (jj_3R_342()) return true; } } return false; } - final private boolean jj_3_539() { - if (jj_scan_token(QUOTED_STRING)) return true; + final private boolean jj_3_216() { + if (jj_scan_token(AS)) return true; return false; } - final private boolean jj_3_1071() { + final private boolean jj_3_1077() { if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_1073() { + final private boolean jj_3_217() { Token xsp; xsp = jj_scanpos; - if (jj_3_1071()) { - jj_scanpos = xsp; - if (jj_3_1072()) return true; - } + if (jj_3_216()) jj_scanpos = xsp; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_201() { - if (jj_3R_156()) return true; + final private boolean jj_3_215() { + if (jj_3R_159()) return true; return false; } - final private boolean jj_3_1069() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3_214() { + if (jj_3R_158()) return true; return false; } - final private boolean jj_3_1078() { - if (jj_scan_token(INTERSECT)) return true; + final private boolean jj_3_1085() { + if (jj_scan_token(UNION)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_1073()) jj_scanpos = xsp; + if (jj_3_1077()) { + jj_scanpos = xsp; + if (jj_3_1078()) { + jj_scanpos = xsp; + if (jj_3R_341()) return true; + } + } return false; } - final private boolean jj_3_1068() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_1067() { + if (jj_scan_token(TRUNCATE)) return true; return false; } - final private boolean jj_3_1070() { + final private boolean jj_3R_348() { Token xsp; xsp = jj_scanpos; - if (jj_3_1068()) { + if (jj_3_1085()) { + jj_scanpos = xsp; + if (jj_3_1086()) { jj_scanpos = xsp; - if (jj_3_1069()) return true; + if (jj_3_1087()) return true; + } } return false; } - final private boolean jj_3_199() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_156()) return true; + final private boolean jj_3R_116() { + if (jj_scan_token(UPDATE)) return true; + if (jj_3R_171()) return true; return false; } - final private boolean jj_3_1077() { - if (jj_scan_token(UNION)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_1070()) jj_scanpos = xsp; + final private boolean jj_3_553() { + if (jj_scan_token(BIG_QUERY_QUOTED_STRING)) return true; return false; } - final private boolean jj_3_200() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_156()) return true; + final private boolean jj_3_1066() { + if (jj_scan_token(RIGHT)) return true; return false; } - final private boolean jj_3R_340() { - if (jj_scan_token(MULTISET)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_1077()) { - jj_scanpos = xsp; - if (jj_3_1078()) { - jj_scanpos = xsp; - if (jj_3_1079()) return true; - } - } + final private boolean jj_3_1073() { + if (jj_3R_174()) return true; return false; } - final private boolean jj_3_538() { - if (jj_scan_token(BIG_QUERY_QUOTED_STRING)) return true; + final private boolean jj_3_1072() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3R_339() { + final private boolean jj_3_1065() { + if (jj_scan_token(LEFT)) return true; return false; } - final private boolean jj_3R_155() { - if (jj_scan_token(ORDER)) return true; - if (jj_scan_token(BY)) return true; + final private boolean jj_3_552() { + if (jj_scan_token(BIG_QUERY_DOUBLE_QUOTED_STRING)) return true; return false; } - final private boolean jj_3_1064() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3_1071() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(STAR)) return true; return false; } - final private boolean jj_3_1063() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_211() { + if (jj_scan_token(AS)) return true; return false; } - final private boolean jj_3R_410() { + final private boolean jj_3_1070() { + if (jj_3R_339()) return true; return false; } - final private boolean jj_3_198() { - if (jj_3R_155()) return true; + final private boolean jj_3_213() { + if (jj_3R_146()) return true; return false; } - final private boolean jj_3R_409() { + final private boolean jj_3_212() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_211()) jj_scanpos = xsp; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_537() { - if (jj_scan_token(BIG_QUERY_DOUBLE_QUOTED_STRING)) return true; + final private boolean jj_3_1069() { + if (jj_3R_338()) return true; return false; } - final private boolean jj_3_1062() { - if (jj_scan_token(SET_MINUS)) return true; + final private boolean jj_3_210() { + if (jj_3R_159()) return true; return false; } - final private boolean jj_3_197() { - if (jj_scan_token(PARTITION)) return true; - if (jj_scan_token(BY)) return true; + final private boolean jj_3_209() { + if (jj_3R_158()) return true; return false; } - final private boolean jj_3_1061() { - if (jj_scan_token(EXCEPT)) return true; + final private boolean jj_3_1068() { + if (jj_3R_337()) return true; return false; } - final private boolean jj_3R_338() { + final private boolean jj_3_1064() { + if (jj_scan_token(INSERT)) return true; return false; } - final private boolean jj_3_1060() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3_551() { + if (jj_scan_token(C_STYLE_ESCAPED_STRING_LITERAL)) return true; return false; } - final private boolean jj_3_1067() { + final private boolean jj_3R_340() { Token xsp; xsp = jj_scanpos; - if (jj_3_1061()) { + if (jj_3_1064()) { jj_scanpos = xsp; - if (jj_3_1062()) return true; - } - xsp = jj_scanpos; - if (jj_3_1063()) { + if (jj_3_1065()) { jj_scanpos = xsp; - if (jj_3_1064()) { + if (jj_3_1066()) { jj_scanpos = xsp; - if (jj_3R_339()) return true; + if (jj_3_1067()) return true; + } } } return false; } - final private boolean jj_3R_353() { + final private boolean jj_3R_115() { + if (jj_scan_token(DELETE)) return true; + if (jj_scan_token(FROM)) return true; + return false; + } + + final private boolean jj_3_1076() { Token xsp; xsp = jj_scanpos; - if (jj_3_197()) { + if (jj_3R_340()) { jj_scanpos = xsp; - if (jj_3R_409()) return true; + if (jj_3_1068()) { + jj_scanpos = xsp; + if (jj_3_1069()) { + jj_scanpos = xsp; + if (jj_3_1070()) return true; + } + } } xsp = jj_scanpos; - if (jj_3_198()) { + if (jj_3_1071()) { jj_scanpos = xsp; - if (jj_3R_410()) return true; + if (jj_3_1072()) { + jj_scanpos = xsp; + if (jj_3_1073()) return true; + } } return false; } - final private boolean jj_3_1059() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_1075() { + if (jj_scan_token(CONVERT)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_536() { - if (jj_scan_token(C_STYLE_ESCAPED_STRING_LITERAL)) return true; + final private boolean jj_3_548() { + if (jj_scan_token(UESCAPE)) return true; + if (jj_scan_token(QUOTED_STRING)) return true; return false; } - final private boolean jj_3R_337() { + final private boolean jj_3_1074() { + if (jj_3R_303()) return true; return false; } - final private boolean jj_3_1058() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3R_406() { + if (jj_3R_306()) return true; return false; } - final private boolean jj_3_1066() { - if (jj_scan_token(INTERSECT)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_1059()) { - jj_scanpos = xsp; - if (jj_3_1060()) { - jj_scanpos = xsp; - if (jj_3R_338()) return true; - } - } - return false; - } - - final private boolean jj_3_1057() { - if (jj_scan_token(ALL)) return true; - return false; - } - - final private boolean jj_3R_88() { - if (jj_3R_79()) return true; - if (jj_3R_353()) return true; - return false; - } - - final private boolean jj_3_1065() { - if (jj_scan_token(UNION)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_1057()) { - jj_scanpos = xsp; - if (jj_3_1058()) { - jj_scanpos = xsp; - if (jj_3R_337()) return true; - } - } - return false; - } - - final private boolean jj_3_1047() { - if (jj_scan_token(TRUNCATE)) return true; + final private boolean jj_3R_405() { + if (jj_3R_304()) return true; return false; } - final private boolean jj_3R_344() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_1065()) { - jj_scanpos = xsp; - if (jj_3_1066()) { - jj_scanpos = xsp; - if (jj_3_1067()) return true; - } - } + final private boolean jj_3R_253() { + if (jj_scan_token(QUOTED_STRING)) return true; return false; } - final private boolean jj_3R_352() { + final private boolean jj_3_208() { + if (jj_3R_160()) return true; return false; } - final private boolean jj_3_196() { - if (jj_3R_155()) return true; + final private boolean jj_3_207() { + if (jj_3R_159()) return true; return false; } - final private boolean jj_3R_351() { + final private boolean jj_3R_404() { + if (jj_3R_307()) return true; return false; } - final private boolean jj_3_1046() { - if (jj_scan_token(RIGHT)) return true; + final private boolean jj_3_206() { + if (jj_3R_158()) return true; return false; } - final private boolean jj_3_195() { - if (jj_scan_token(PARTITION)) return true; - if (jj_scan_token(BY)) return true; + final private boolean jj_3_205() { + if (jj_scan_token(UPSERT)) return true; return false; } - final private boolean jj_3_533() { - if (jj_scan_token(UESCAPE)) return true; - if (jj_scan_token(QUOTED_STRING)) return true; + final private boolean jj_3R_403() { + if (jj_3R_305()) return true; return false; } - final private boolean jj_3_1053() { - if (jj_3R_173()) return true; + final private boolean jj_3_204() { + if (jj_scan_token(INSERT)) return true; return false; } - final private boolean jj_3_1052() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3R_402() { + if (jj_3R_299()) return true; return false; } - final private boolean jj_3R_87() { - if (jj_3R_77()) return true; + final private boolean jj_3R_114() { Token xsp; xsp = jj_scanpos; - if (jj_3_195()) { - jj_scanpos = xsp; - if (jj_3R_351()) return true; - } - xsp = jj_scanpos; - if (jj_3_196()) { + if (jj_3_204()) { jj_scanpos = xsp; - if (jj_3R_352()) return true; + if (jj_3_205()) return true; } + if (jj_3R_361()) return true; return false; } - final private boolean jj_3_1045() { - if (jj_scan_token(LEFT)) return true; - return false; - } - - final private boolean jj_3_1051() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(STAR)) return true; + final private boolean jj_3R_401() { + if (jj_3R_301()) return true; return false; } - final private boolean jj_3_1050() { - if (jj_3R_335()) return true; + final private boolean jj_3_547() { + if (jj_scan_token(UNICODE_STRING_LITERAL)) return true; return false; } - final private boolean jj_3R_249() { + final private boolean jj_3_546() { if (jj_scan_token(QUOTED_STRING)) return true; return false; } - final private boolean jj_3_1049() { - if (jj_3R_334()) return true; - return false; - } - - final private boolean jj_3_1048() { - if (jj_3R_333()) return true; + final private boolean jj_3_545() { + if (jj_scan_token(PREFIXED_STRING_LITERAL)) return true; return false; } - final private boolean jj_3_1044() { - if (jj_scan_token(INSERT)) return true; + final private boolean jj_3R_400() { + if (jj_3R_302()) return true; return false; } - final private boolean jj_3R_336() { + final private boolean jj_3_550() { Token xsp; xsp = jj_scanpos; - if (jj_3_1044()) { - jj_scanpos = xsp; - if (jj_3_1045()) { + if (jj_3_545()) { jj_scanpos = xsp; - if (jj_3_1046()) { + if (jj_3_546()) { jj_scanpos = xsp; - if (jj_3_1047()) return true; + if (jj_3_547()) return true; } } + while (true) { + xsp = jj_scanpos; + if (jj_3R_253()) { jj_scanpos = xsp; break; } } + xsp = jj_scanpos; + if (jj_3_548()) jj_scanpos = xsp; return false; } - final private boolean jj_3_193() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_83()) return true; + final private boolean jj_3R_399() { + if (jj_3R_298()) return true; return false; } - final private boolean jj_3_1056() { + final private boolean jj_3R_398() { + if (jj_3R_296()) return true; + return false; + } + + final private boolean jj_3R_252() { + if (jj_scan_token(QUOTED_STRING)) return true; + return false; + } + + final private boolean jj_3R_228() { + if (jj_scan_token(LBRACE_FN)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_336()) { + if (jj_3R_398()) { jj_scanpos = xsp; - if (jj_3_1048()) { + if (jj_3R_399()) { + jj_scanpos = xsp; + if (jj_3R_400()) { + jj_scanpos = xsp; + if (jj_3R_401()) { + jj_scanpos = xsp; + if (jj_3R_402()) { + jj_scanpos = xsp; + if (jj_3R_403()) { + jj_scanpos = xsp; + if (jj_3R_404()) { + jj_scanpos = xsp; + if (jj_3R_405()) { + jj_scanpos = xsp; + if (jj_3R_406()) { + jj_scanpos = xsp; + if (jj_3_1074()) { jj_scanpos = xsp; - if (jj_3_1049()) { + if (jj_3_1075()) { jj_scanpos = xsp; - if (jj_3_1050()) return true; + if (jj_3_1076()) return true; + } + } + } + } + } + } } } } - xsp = jj_scanpos; - if (jj_3_1051()) { - jj_scanpos = xsp; - if (jj_3_1052()) { - jj_scanpos = xsp; - if (jj_3_1053()) return true; } } return false; } - final private boolean jj_3_194() { - if (jj_3R_154()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_193()) { jj_scanpos = xsp; break; } - } + final private boolean jj_3_203() { + if (jj_3R_157()) return true; return false; } - final private boolean jj_3R_358() { - if (jj_3R_152()) return true; + final private boolean jj_3_201() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_157()) return true; return false; } - final private boolean jj_3_532() { - if (jj_scan_token(UNICODE_STRING_LITERAL)) return true; + final private boolean jj_3_1063() { + if (jj_scan_token(USER)) return true; return false; } - final private boolean jj_3_1055() { - if (jj_scan_token(CONVERT)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_1062() { + if (jj_scan_token(SYSTEM_USER)) return true; return false; } - final private boolean jj_3_531() { - if (jj_scan_token(QUOTED_STRING)) return true; + final private boolean jj_3_202() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_157()) return true; return false; } - final private boolean jj_3_530() { - if (jj_scan_token(PREFIXED_STRING_LITERAL)) return true; + final private boolean jj_3_1061() { + if (jj_scan_token(SESSION_USER)) return true; return false; } - final private boolean jj_3_1054() { - if (jj_3R_299()) return true; + final private boolean jj_3_1060() { + if (jj_scan_token(LOCALTIMESTAMP)) return true; return false; } - final private boolean jj_3_535() { + final private boolean jj_3R_139() { Token xsp; xsp = jj_scanpos; - if (jj_3_530()) { + if (jj_3_549()) { + jj_scanpos = xsp; + if (jj_3_550()) { jj_scanpos = xsp; - if (jj_3_531()) { + if (jj_3_551()) { + jj_scanpos = xsp; + if (jj_3_552()) { jj_scanpos = xsp; - if (jj_3_532()) return true; + if (jj_3_553()) return true; } } + } + } + return false; + } + + final private boolean jj_3_549() { + if (jj_scan_token(BINARY_STRING_LITERAL)) return true; + Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_249()) { jj_scanpos = xsp; break; } + if (jj_3R_252()) { jj_scanpos = xsp; break; } } - xsp = jj_scanpos; - if (jj_3_533()) jj_scanpos = xsp; return false; } - final private boolean jj_3R_394() { - if (jj_3R_302()) return true; + final private boolean jj_3_1059() { + if (jj_scan_token(LOCALTIME)) return true; return false; } - final private boolean jj_3R_393() { - if (jj_3R_300()) return true; + final private boolean jj_3_1058() { + if (jj_scan_token(CURRENT_USER)) return true; return false; } - final private boolean jj_3R_117() { - if (jj_scan_token(CALL)) return true; - if (jj_3R_358()) return true; + final private boolean jj_3_1057() { + if (jj_scan_token(CURRENT_TIMESTAMP)) return true; return false; } - final private boolean jj_3R_392() { - if (jj_3R_303()) return true; + final private boolean jj_3_1056() { + if (jj_scan_token(CURRENT_TIME)) return true; return false; } - final private boolean jj_3R_248() { - if (jj_scan_token(QUOTED_STRING)) return true; + final private boolean jj_3_1055() { + if (jj_scan_token(CURRENT_SCHEMA)) return true; return false; } - final private boolean jj_3_187() { - if (jj_scan_token(SCHEMA)) return true; + final private boolean jj_3_1054() { + if (jj_scan_token(CURRENT_ROLE)) return true; return false; } - final private boolean jj_3R_391() { - if (jj_3R_301()) return true; + final private boolean jj_3R_156() { + if (jj_scan_token(ORDER)) return true; + if (jj_scan_token(BY)) return true; return false; } - final private boolean jj_3R_390() { - if (jj_3R_295()) return true; + final private boolean jj_3_1053() { + if (jj_scan_token(CURRENT_PATH)) return true; return false; } - final private boolean jj_3_186() { - if (jj_scan_token(CATALOG)) return true; + final private boolean jj_3_1052() { + if (jj_scan_token(CURRENT_DEFAULT_TRANSFORM_GROUP)) return true; return false; } - final private boolean jj_3R_389() { - if (jj_3R_297()) return true; + final private boolean jj_3_1051() { + if (jj_scan_token(CURRENT_DATE)) return true; return false; } - final private boolean jj_3_192() { - Token xsp; - xsp = jj_scanpos; - if (jj_scan_token(601)) jj_scanpos = xsp; - if (jj_3R_153()) return true; + final private boolean jj_3_1050() { + if (jj_scan_token(CURRENT_CATALOG)) return true; return false; } - final private boolean jj_3R_138() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_534()) { - jj_scanpos = xsp; - if (jj_3_535()) { - jj_scanpos = xsp; - if (jj_3_536()) { - jj_scanpos = xsp; - if (jj_3_537()) { - jj_scanpos = xsp; - if (jj_3_538()) return true; - } - } - } - } + final private boolean jj_3R_422() { return false; } - final private boolean jj_3_189() { - if (jj_3R_84()) return true; + final private boolean jj_3_200() { + if (jj_3R_156()) return true; return false; } - final private boolean jj_3_191() { + final private boolean jj_3R_234() { Token xsp; xsp = jj_scanpos; - if (jj_scan_token(622)) { - jj_scanpos = xsp; - if (jj_scan_token(821)) { - jj_scanpos = xsp; - if (jj_scan_token(820)) { - jj_scanpos = xsp; - if (jj_scan_token(817)) { + if (jj_3_1050()) { jj_scanpos = xsp; - if (jj_scan_token(818)) { - jj_scanpos = xsp; - if (jj_scan_token(819)) { + if (jj_3_1051()) { jj_scanpos = xsp; - if (jj_scan_token(816)) return true; - } - } - } - } - } - } - return false; - } - - final private boolean jj_3_534() { - if (jj_scan_token(BINARY_STRING_LITERAL)) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3R_248()) { jj_scanpos = xsp; break; } - } - return false; - } - - final private boolean jj_3R_388() { - if (jj_3R_298()) return true; - return false; - } - - final private boolean jj_3_188() { - if (jj_scan_token(TABLE)) return true; - return false; - } - - final private boolean jj_3R_387() { - if (jj_3R_294()) return true; - return false; - } - - final private boolean jj_3_185() { - if (jj_scan_token(DATABASE)) return true; - return false; - } - - final private boolean jj_3R_356() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_188()) jj_scanpos = xsp; - if (jj_3R_152()) return true; - return false; - } - - final private boolean jj_3R_386() { - if (jj_3R_292()) return true; - return false; - } - - final private boolean jj_3R_224() { - if (jj_scan_token(LBRACE_FN)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3R_386()) { + if (jj_3_1052()) { jj_scanpos = xsp; - if (jj_3R_387()) { + if (jj_3_1053()) { jj_scanpos = xsp; - if (jj_3R_388()) { + if (jj_3_1054()) { jj_scanpos = xsp; - if (jj_3R_389()) { + if (jj_3_1055()) { jj_scanpos = xsp; - if (jj_3R_390()) { + if (jj_3_1056()) { jj_scanpos = xsp; - if (jj_3R_391()) { + if (jj_3_1057()) { jj_scanpos = xsp; - if (jj_3R_392()) { + if (jj_3_1058()) { jj_scanpos = xsp; - if (jj_3R_393()) { + if (jj_3_1059()) { jj_scanpos = xsp; - if (jj_3R_394()) { + if (jj_3_1060()) { jj_scanpos = xsp; - if (jj_3_1054()) { + if (jj_3_1061()) { jj_scanpos = xsp; - if (jj_3_1055()) { + if (jj_3_1062()) { jj_scanpos = xsp; - if (jj_3_1056()) return true; + if (jj_3_1063()) return true; } } } @@ -26987,804 +26851,539 @@ final private boolean jj_3R_224() { } } } - return false; - } - - final private boolean jj_3_190() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_185()) { - jj_scanpos = xsp; - if (jj_3_186()) { - jj_scanpos = xsp; - if (jj_3_187()) return true; } } - if (jj_3R_152()) return true; return false; } - final private boolean jj_3R_112() { - if (jj_scan_token(DESCRIBE)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_190()) { - jj_scanpos = xsp; - if (jj_3R_356()) { - jj_scanpos = xsp; - if (jj_3_192()) return true; - } - } + final private boolean jj_3R_421() { return false; } - final private boolean jj_3_529() { - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_199() { + if (jj_scan_token(PARTITION)) return true; + if (jj_scan_token(BY)) return true; return false; } - final private boolean jj_3_528() { - if (jj_scan_token(UNKNOWN)) return true; + final private boolean jj_3_1049() { + if (jj_scan_token(YEAR)) return true; return false; } - final private boolean jj_3_527() { - if (jj_scan_token(FALSE)) return true; + final private boolean jj_3_1048() { + if (jj_scan_token(VAR_SAMP)) return true; return false; } - final private boolean jj_3R_244() { + final private boolean jj_3R_357() { Token xsp; xsp = jj_scanpos; - if (jj_3_526()) { - jj_scanpos = xsp; - if (jj_3_527()) { - jj_scanpos = xsp; - if (jj_3_528()) { + if (jj_3_199()) { jj_scanpos = xsp; - if (jj_3_529()) return true; - } + if (jj_3R_421()) return true; } + xsp = jj_scanpos; + if (jj_3_200()) { + jj_scanpos = xsp; + if (jj_3R_422()) return true; } return false; } - final private boolean jj_3_526() { - if (jj_scan_token(TRUE)) return true; + final private boolean jj_3_1047() { + if (jj_scan_token(VAR_POP)) return true; return false; } - final private boolean jj_3_1043() { + final private boolean jj_3_1046() { if (jj_scan_token(USER)) return true; return false; } + final private boolean jj_3_1045() { + if (jj_scan_token(TRUNCATE)) return true; + return false; + } + + final private boolean jj_3_1044() { + if (jj_scan_token(UPPER)) return true; + return false; + } + + final private boolean jj_3_1043() { + if (jj_scan_token(SUM)) return true; + return false; + } + final private boolean jj_3_1042() { - if (jj_scan_token(SYSTEM_USER)) return true; + if (jj_scan_token(STDDEV_SAMP)) return true; + return false; + } + + final private boolean jj_3_544() { + if (jj_scan_token(NULL)) return true; return false; } final private boolean jj_3_1041() { - if (jj_scan_token(SESSION_USER)) return true; + if (jj_scan_token(STDDEV_POP)) return true; return false; } final private boolean jj_3_1040() { - if (jj_scan_token(LOCALTIMESTAMP)) return true; + if (jj_scan_token(SQRT)) return true; return false; } - final private boolean jj_3_1039() { - if (jj_scan_token(LOCALTIME)) return true; + final private boolean jj_3_543() { + if (jj_scan_token(UNKNOWN)) return true; return false; } - final private boolean jj_3_182() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_1039() { + if (jj_scan_token(SOME)) return true; return false; } final private boolean jj_3_1038() { - if (jj_scan_token(CURRENT_USER)) return true; + if (jj_scan_token(SECOND)) return true; return false; } - final private boolean jj_3_1037() { - if (jj_scan_token(CURRENT_TIMESTAMP)) return true; + final private boolean jj_3_542() { + if (jj_scan_token(FALSE)) return true; return false; } - final private boolean jj_3_525() { - if (jj_3R_198()) return true; + final private boolean jj_3_1037() { + if (jj_scan_token(ROW_NUMBER)) return true; return false; } final private boolean jj_3_1036() { - if (jj_scan_token(CURRENT_TIME)) return true; + if (jj_scan_token(RIGHT)) return true; return false; } - final private boolean jj_3_184() { - if (jj_scan_token(INCLUDING)) return true; + final private boolean jj_3R_248() { Token xsp; xsp = jj_scanpos; - if (jj_3_182()) jj_scanpos = xsp; - if (jj_scan_token(ATTRIBUTES)) return true; + if (jj_3_541()) { + jj_scanpos = xsp; + if (jj_3_542()) { + jj_scanpos = xsp; + if (jj_3_543()) { + jj_scanpos = xsp; + if (jj_3_544()) return true; + } + } + } + return false; + } + + final private boolean jj_3_541() { + if (jj_scan_token(TRUE)) return true; return false; } final private boolean jj_3_1035() { - if (jj_scan_token(CURRENT_SCHEMA)) return true; + if (jj_scan_token(REGR_SYY)) return true; return false; } - final private boolean jj_3_1034() { - if (jj_scan_token(CURRENT_ROLE)) return true; + final private boolean jj_3R_89() { + if (jj_3R_80()) return true; + if (jj_3R_357()) return true; return false; } - final private boolean jj_3_1033() { - if (jj_scan_token(CURRENT_PATH)) return true; + final private boolean jj_3_1034() { + if (jj_scan_token(REGR_SXX)) return true; return false; } - final private boolean jj_3_524() { - if (jj_scan_token(MINUS)) return true; - if (jj_3R_198()) return true; + final private boolean jj_3_1033() { + if (jj_scan_token(REGR_COUNT)) return true; return false; } final private boolean jj_3_1032() { - if (jj_scan_token(CURRENT_DEFAULT_TRANSFORM_GROUP)) return true; + if (jj_scan_token(RANK)) return true; return false; } final private boolean jj_3_1031() { - if (jj_scan_token(CURRENT_DATE)) return true; + if (jj_scan_token(POWER)) return true; return false; } - final private boolean jj_3_183() { - if (jj_scan_token(EXCLUDING)) return true; - if (jj_scan_token(ATTRIBUTES)) return true; + final private boolean jj_3_1030() { + if (jj_scan_token(PERCENT_RANK)) return true; return false; } - final private boolean jj_3_1030() { - if (jj_scan_token(CURRENT_CATALOG)) return true; + final private boolean jj_3_1029() { + if (jj_scan_token(PERCENTILE_DISC)) return true; return false; } - final private boolean jj_3R_139() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_523()) { - jj_scanpos = xsp; - if (jj_3_524()) { - jj_scanpos = xsp; - if (jj_3_525()) return true; - } - } - return false; - } - - final private boolean jj_3_523() { - if (jj_scan_token(PLUS)) return true; - if (jj_3R_198()) return true; - return false; - } - - final private boolean jj_3R_230() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_1030()) { - jj_scanpos = xsp; - if (jj_3_1031()) { - jj_scanpos = xsp; - if (jj_3_1032()) { - jj_scanpos = xsp; - if (jj_3_1033()) { - jj_scanpos = xsp; - if (jj_3_1034()) { - jj_scanpos = xsp; - if (jj_3_1035()) { - jj_scanpos = xsp; - if (jj_3_1036()) { - jj_scanpos = xsp; - if (jj_3_1037()) { - jj_scanpos = xsp; - if (jj_3_1038()) { - jj_scanpos = xsp; - if (jj_3_1039()) { - jj_scanpos = xsp; - if (jj_3_1040()) { - jj_scanpos = xsp; - if (jj_3_1041()) { - jj_scanpos = xsp; - if (jj_3_1042()) { - jj_scanpos = xsp; - if (jj_3_1043()) return true; - } - } - } - } - } - } - } - } - } - } - } - } - } + final private boolean jj_3R_356() { return false; } - final private boolean jj_3R_151() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_183()) { - jj_scanpos = xsp; - if (jj_3_184()) return true; - } + final private boolean jj_3_1028() { + if (jj_scan_token(PERCENTILE_CONT)) return true; return false; } - final private boolean jj_3_1029() { - if (jj_scan_token(YEAR)) return true; + final private boolean jj_3_198() { + if (jj_3R_156()) return true; return false; } - final private boolean jj_3_1028() { - if (jj_scan_token(VAR_SAMP)) return true; + final private boolean jj_3_1027() { + if (jj_scan_token(OCTET_LENGTH)) return true; return false; } - final private boolean jj_3_522() { - if (jj_scan_token(APPROX_NUMERIC_LITERAL)) return true; + final private boolean jj_3_1026() { + if (jj_scan_token(NULLIF)) return true; return false; } - final private boolean jj_3_1027() { - if (jj_scan_token(VAR_POP)) return true; + final private boolean jj_3_540() { + if (jj_3R_200()) return true; return false; } - final private boolean jj_3_1026() { - if (jj_scan_token(USER)) return true; + final private boolean jj_3_1025() { + if (jj_scan_token(NTILE)) return true; return false; } - final private boolean jj_3_1025() { - if (jj_scan_token(TRUNCATE)) return true; + final private boolean jj_3R_355() { return false; } final private boolean jj_3_1024() { - if (jj_scan_token(UPPER)) return true; + if (jj_scan_token(NTH_VALUE)) return true; return false; } final private boolean jj_3_1023() { - if (jj_scan_token(SUM)) return true; + if (jj_scan_token(MONTH)) return true; return false; } - final private boolean jj_3_521() { - if (jj_scan_token(DECIMAL)) return true; - if (jj_3R_247()) return true; + final private boolean jj_3_197() { + if (jj_scan_token(PARTITION)) return true; + if (jj_scan_token(BY)) return true; return false; } final private boolean jj_3_1022() { - if (jj_scan_token(STDDEV_SAMP)) return true; + if (jj_scan_token(MOD)) return true; return false; } - final private boolean jj_3_1021() { - if (jj_scan_token(STDDEV_POP)) return true; + final private boolean jj_3_539() { + if (jj_scan_token(MINUS)) return true; + if (jj_3R_200()) return true; return false; } - final private boolean jj_3_181() { - if (jj_scan_token(WITHOUT)) return true; - if (jj_scan_token(IMPLEMENTATION)) return true; + final private boolean jj_3_1021() { + if (jj_scan_token(MINUTE)) return true; return false; } final private boolean jj_3_1020() { - if (jj_scan_token(SQRT)) return true; + if (jj_scan_token(MIN)) return true; return false; } final private boolean jj_3_1019() { - if (jj_scan_token(SOME)) return true; - return false; - } - - final private boolean jj_3_520() { - if (jj_scan_token(DECIMAL_NUMERIC_LITERAL)) return true; + if (jj_scan_token(MAX)) return true; return false; } final private boolean jj_3_1018() { - if (jj_scan_token(SECOND)) return true; + if (jj_scan_token(LOWER)) return true; return false; } - final private boolean jj_3_1017() { - if (jj_scan_token(ROW_NUMBER)) return true; + final private boolean jj_3R_140() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_538()) { + jj_scanpos = xsp; + if (jj_3_539()) { + jj_scanpos = xsp; + if (jj_3_540()) return true; + } + } return false; } - final private boolean jj_3_1016() { - if (jj_scan_token(RIGHT)) return true; + final private boolean jj_3_538() { + if (jj_scan_token(PLUS)) return true; + if (jj_3R_200()) return true; return false; } - final private boolean jj_3_180() { - if (jj_scan_token(WITH)) return true; - if (jj_scan_token(IMPLEMENTATION)) return true; + final private boolean jj_3_1017() { + if (jj_scan_token(LOCALTIMESTAMP)) return true; return false; } - final private boolean jj_3_1015() { - if (jj_scan_token(REGR_SYY)) return true; + final private boolean jj_3_1016() { + if (jj_scan_token(LOCALTIME)) return true; return false; } - final private boolean jj_3R_198() { + final private boolean jj_3R_88() { + if (jj_3R_78()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_519()) { - jj_scanpos = xsp; - if (jj_3_520()) { - jj_scanpos = xsp; - if (jj_3_521()) { + if (jj_3_197()) { jj_scanpos = xsp; - if (jj_3_522()) return true; - } + if (jj_3R_355()) return true; } + xsp = jj_scanpos; + if (jj_3_198()) { + jj_scanpos = xsp; + if (jj_3R_356()) return true; } return false; } - final private boolean jj_3_519() { - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_1015() { + if (jj_scan_token(LN)) return true; return false; } final private boolean jj_3_1014() { - if (jj_scan_token(REGR_SXX)) return true; + if (jj_scan_token(LAST_VALUE)) return true; return false; } final private boolean jj_3_1013() { - if (jj_scan_token(REGR_COUNT)) return true; + if (jj_scan_token(LEFT)) return true; return false; } final private boolean jj_3_1012() { - if (jj_scan_token(RANK)) return true; + if (jj_scan_token(LEAD)) return true; return false; } final private boolean jj_3_1011() { - if (jj_scan_token(POWER)) return true; + if (jj_scan_token(LAG)) return true; return false; } final private boolean jj_3_1010() { - if (jj_scan_token(PERCENT_RANK)) return true; - return false; - } - - final private boolean jj_3_179() { - if (jj_scan_token(WITH)) return true; - if (jj_scan_token(TYPE)) return true; + if (jj_scan_token(HOUR)) return true; return false; } final private boolean jj_3_1009() { - if (jj_scan_token(PERCENTILE_DISC)) return true; + if (jj_scan_token(GROUPING)) return true; return false; } final private boolean jj_3_1008() { - if (jj_scan_token(PERCENTILE_CONT)) return true; - return false; - } - - final private boolean jj_3_518() { - if (jj_3R_243()) return true; + if (jj_scan_token(INTERSECTION)) return true; return false; } final private boolean jj_3_1007() { - if (jj_scan_token(OCTET_LENGTH)) return true; + if (jj_scan_token(FUSION)) return true; return false; } final private boolean jj_3_1006() { - if (jj_scan_token(NULLIF)) return true; + if (jj_scan_token(FLOOR)) return true; return false; } - final private boolean jj_3_517() { - if (jj_3R_246()) return true; + final private boolean jj_3_537() { + if (jj_scan_token(APPROX_NUMERIC_LITERAL)) return true; return false; } final private boolean jj_3_1005() { - if (jj_scan_token(NTILE)) return true; + if (jj_scan_token(FIRST_VALUE)) return true; return false; } final private boolean jj_3_1004() { - if (jj_scan_token(NTH_VALUE)) return true; + if (jj_scan_token(EXP)) return true; return false; } final private boolean jj_3_1003() { - if (jj_scan_token(MONTH)) return true; + if (jj_scan_token(EVERY)) return true; return false; } final private boolean jj_3_1002() { - if (jj_scan_token(MOD)) return true; + if (jj_scan_token(ELEMENT)) return true; return false; } final private boolean jj_3_1001() { - if (jj_scan_token(MINUTE)) return true; + if (jj_scan_token(DENSE_RANK)) return true; return false; } - final private boolean jj_3R_222() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_517()) { - jj_scanpos = xsp; - if (jj_3_518()) return true; - } + final private boolean jj_3_536() { + if (jj_scan_token(DECIMAL)) return true; + if (jj_3R_251()) return true; return false; } final private boolean jj_3_1000() { - if (jj_scan_token(MIN)) return true; + if (jj_scan_token(CURRENT_TIMESTAMP)) return true; return false; } final private boolean jj_3_999() { - if (jj_scan_token(MAX)) return true; + if (jj_scan_token(CURRENT_TIME)) return true; + return false; + } + + final private boolean jj_3_195() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_84()) return true; return false; } final private boolean jj_3_998() { - if (jj_scan_token(LOWER)) return true; + if (jj_scan_token(CURRENT_DATE)) return true; return false; } final private boolean jj_3_997() { - if (jj_scan_token(LOCALTIMESTAMP)) return true; + if (jj_scan_token(COUNT)) return true; return false; } - final private boolean jj_3_178() { - if (jj_3R_116()) return true; + final private boolean jj_3_535() { + if (jj_scan_token(DECIMAL_NUMERIC_LITERAL)) return true; return false; } final private boolean jj_3_996() { - if (jj_scan_token(LOCALTIME)) return true; + if (jj_scan_token(CUME_DIST)) return true; return false; } final private boolean jj_3_995() { - if (jj_scan_token(LN)) return true; - return false; - } - - final private boolean jj_3_177() { - if (jj_3R_115()) return true; + if (jj_scan_token(COVAR_SAMP)) return true; return false; } final private boolean jj_3_994() { - if (jj_scan_token(LAST_VALUE)) return true; + if (jj_scan_token(COVAR_POP)) return true; return false; } final private boolean jj_3_993() { - if (jj_scan_token(LEFT)) return true; - return false; - } - - final private boolean jj_3_176() { - if (jj_3R_114()) return true; - return false; - } - - final private boolean jj_3_992() { - if (jj_scan_token(LEAD)) return true; - return false; - } - - final private boolean jj_3_991() { - if (jj_scan_token(LAG)) return true; - return false; - } - - final private boolean jj_3_175() { - if (jj_3R_113()) return true; - return false; - } - - final private boolean jj_3_990() { - if (jj_scan_token(HOUR)) return true; - return false; - } - - final private boolean jj_3_989() { - if (jj_scan_token(GROUPING)) return true; - return false; - } - - final private boolean jj_3_174() { - if (jj_3R_79()) return true; - return false; - } - - final private boolean jj_3_988() { - if (jj_scan_token(INTERSECTION)) return true; - return false; - } - - final private boolean jj_3_987() { - if (jj_scan_token(FUSION)) return true; - return false; - } - - final private boolean jj_3_516() { - if (jj_3R_245()) return true; - return false; - } - - final private boolean jj_3_986() { - if (jj_scan_token(FLOOR)) return true; - return false; - } - - final private boolean jj_3_985() { - if (jj_scan_token(FIRST_VALUE)) return true; - return false; - } - - final private boolean jj_3_515() { - if (jj_3R_244()) return true; - return false; - } - - final private boolean jj_3_984() { - if (jj_scan_token(EXP)) return true; + if (jj_scan_token(COLLECT)) return true; return false; } - final private boolean jj_3R_153() { + final private boolean jj_3R_200() { Token xsp; xsp = jj_scanpos; - if (jj_3_174()) { - jj_scanpos = xsp; - if (jj_3_175()) { + if (jj_3_534()) { jj_scanpos = xsp; - if (jj_3_176()) { + if (jj_3_535()) { jj_scanpos = xsp; - if (jj_3_177()) { + if (jj_3_536()) { jj_scanpos = xsp; - if (jj_3_178()) return true; - } + if (jj_3_537()) return true; } } } return false; } - final private boolean jj_3_983() { - if (jj_scan_token(EVERY)) return true; - return false; - } - - final private boolean jj_3_514() { - if (jj_3R_138()) return true; - return false; - } - - final private boolean jj_3_982() { - if (jj_scan_token(ELEMENT)) return true; - return false; - } - - final private boolean jj_3_981() { - if (jj_scan_token(DENSE_RANK)) return true; - return false; - } - - final private boolean jj_3_513() { - if (jj_3R_139()) return true; - return false; - } - - final private boolean jj_3_980() { - if (jj_scan_token(CURRENT_TIMESTAMP)) return true; - return false; - } - - final private boolean jj_3_979() { - if (jj_scan_token(CURRENT_TIME)) return true; - return false; - } - - final private boolean jj_3_978() { - if (jj_scan_token(CURRENT_DATE)) return true; - return false; - } - - final private boolean jj_3_977() { - if (jj_scan_token(COUNT)) return true; - return false; - } - - final private boolean jj_3_976() { - if (jj_scan_token(CUME_DIST)) return true; - return false; - } - - final private boolean jj_3R_243() { + final private boolean jj_3_196() { + if (jj_3R_155()) return true; Token xsp; - xsp = jj_scanpos; - if (jj_3_513()) { - jj_scanpos = xsp; - if (jj_3_514()) { - jj_scanpos = xsp; - if (jj_3_515()) { - jj_scanpos = xsp; - if (jj_3_516()) return true; - } - } + while (true) { + xsp = jj_scanpos; + if (jj_3_195()) { jj_scanpos = xsp; break; } } return false; } - final private boolean jj_3_975() { - if (jj_scan_token(COVAR_SAMP)) return true; - return false; - } - - final private boolean jj_3_974() { - if (jj_scan_token(COVAR_POP)) return true; - return false; - } - - final private boolean jj_3_973() { - if (jj_scan_token(COLLECT)) return true; + final private boolean jj_3_534() { + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } - final private boolean jj_3_972() { + final private boolean jj_3_992() { if (jj_scan_token(COALESCE)) return true; return false; } - final private boolean jj_3_971() { + final private boolean jj_3_991() { if (jj_scan_token(CHARACTER_LENGTH)) return true; return false; } - final private boolean jj_3_970() { + final private boolean jj_3_990() { if (jj_scan_token(CHAR_LENGTH)) return true; return false; } - final private boolean jj_3_969() { + final private boolean jj_3_989() { if (jj_scan_token(CHAR)) return true; return false; } - final private boolean jj_3_512() { - if (jj_3R_193()) return true; - return false; - } - - final private boolean jj_3_968() { + final private boolean jj_3_988() { if (jj_scan_token(CEILING)) return true; return false; } - final private boolean jj_3_967() { + final private boolean jj_3_987() { if (jj_scan_token(CARDINALITY)) return true; return false; } - final private boolean jj_3_173() { - if (jj_scan_token(AS)) return true; - if (jj_scan_token(DOT_FORMAT)) return true; - return false; - } - - final private boolean jj_3_511() { - if (jj_3R_243()) return true; + final private boolean jj_3_986() { + if (jj_scan_token(AVG)) return true; return false; } - final private boolean jj_3_966() { - if (jj_scan_token(AVG)) return true; + final private boolean jj_3_533() { + if (jj_3R_247()) return true; return false; } - final private boolean jj_3_965() { + final private boolean jj_3_985() { if (jj_scan_token(ABS)) return true; return false; } - final private boolean jj_3_172() { - if (jj_scan_token(AS)) return true; - if (jj_scan_token(JSON)) return true; + final private boolean jj_3R_362() { + if (jj_3R_153()) return true; return false; } - final private boolean jj_3R_119() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_511()) { - jj_scanpos = xsp; - if (jj_3_512()) return true; - } + final private boolean jj_3_532() { + if (jj_3R_250()) return true; return false; } - final private boolean jj_3R_333() { + final private boolean jj_3R_337() { Token xsp; xsp = jj_scanpos; - if (jj_3_965()) { - jj_scanpos = xsp; - if (jj_3_966()) { - jj_scanpos = xsp; - if (jj_3_967()) { - jj_scanpos = xsp; - if (jj_3_968()) { - jj_scanpos = xsp; - if (jj_3_969()) { - jj_scanpos = xsp; - if (jj_3_970()) { - jj_scanpos = xsp; - if (jj_3_971()) { - jj_scanpos = xsp; - if (jj_3_972()) { - jj_scanpos = xsp; - if (jj_3_973()) { - jj_scanpos = xsp; - if (jj_3_974()) { - jj_scanpos = xsp; - if (jj_3_975()) { - jj_scanpos = xsp; - if (jj_3_976()) { - jj_scanpos = xsp; - if (jj_3_977()) { - jj_scanpos = xsp; - if (jj_3_978()) { - jj_scanpos = xsp; - if (jj_3_979()) { - jj_scanpos = xsp; - if (jj_3_980()) { - jj_scanpos = xsp; - if (jj_3_981()) { - jj_scanpos = xsp; - if (jj_3_982()) { - jj_scanpos = xsp; - if (jj_3_983()) { - jj_scanpos = xsp; - if (jj_3_984()) { - jj_scanpos = xsp; if (jj_3_985()) { jj_scanpos = xsp; if (jj_3_986()) { @@ -27873,7 +27472,47 @@ final private boolean jj_3R_333() { jj_scanpos = xsp; if (jj_3_1028()) { jj_scanpos = xsp; - if (jj_3_1029()) return true; + if (jj_3_1029()) { + jj_scanpos = xsp; + if (jj_3_1030()) { + jj_scanpos = xsp; + if (jj_3_1031()) { + jj_scanpos = xsp; + if (jj_3_1032()) { + jj_scanpos = xsp; + if (jj_3_1033()) { + jj_scanpos = xsp; + if (jj_3_1034()) { + jj_scanpos = xsp; + if (jj_3_1035()) { + jj_scanpos = xsp; + if (jj_3_1036()) { + jj_scanpos = xsp; + if (jj_3_1037()) { + jj_scanpos = xsp; + if (jj_3_1038()) { + jj_scanpos = xsp; + if (jj_3_1039()) { + jj_scanpos = xsp; + if (jj_3_1040()) { + jj_scanpos = xsp; + if (jj_3_1041()) { + jj_scanpos = xsp; + if (jj_3_1042()) { + jj_scanpos = xsp; + if (jj_3_1043()) { + jj_scanpos = xsp; + if (jj_3_1044()) { + jj_scanpos = xsp; + if (jj_3_1045()) { + jj_scanpos = xsp; + if (jj_3_1046()) { + jj_scanpos = xsp; + if (jj_3_1047()) { + jj_scanpos = xsp; + if (jj_3_1048()) { + jj_scanpos = xsp; + if (jj_3_1049()) return true; } } } @@ -27941,1072 +27580,1152 @@ final private boolean jj_3R_333() { return false; } - final private boolean jj_3_171() { - if (jj_scan_token(AS)) return true; - if (jj_scan_token(XML)) return true; - return false; - } - - final private boolean jj_3_170() { - if (jj_3R_151()) return true; + final private boolean jj_3R_226() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_532()) { + jj_scanpos = xsp; + if (jj_3_533()) return true; + } return false; } - final private boolean jj_3R_111() { - if (jj_scan_token(EXPLAIN)) return true; - if (jj_scan_token(PLAN)) return true; + final private boolean jj_3_984() { + if (jj_3R_337()) return true; return false; } - final private boolean jj_3_964() { - if (jj_3R_333()) return true; + final private boolean jj_3_983() { + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_963() { - if (jj_3R_152()) return true; + final private boolean jj_3_531() { + if (jj_3R_249()) return true; return false; } - final private boolean jj_3R_229() { + final private boolean jj_3R_233() { Token xsp; xsp = jj_scanpos; - if (jj_3_963()) { + if (jj_3_983()) { jj_scanpos = xsp; - if (jj_3_964()) return true; + if (jj_3_984()) return true; } return false; } - final private boolean jj_3_510() { - if (jj_3R_242()) return true; + final private boolean jj_3R_118() { + if (jj_scan_token(CALL)) return true; + if (jj_3R_362()) return true; return false; } - final private boolean jj_3_509() { - if (jj_3R_241()) return true; + final private boolean jj_3_530() { + if (jj_3R_248()) return true; return false; } - final private boolean jj_3_508() { - if (jj_3R_240()) return true; + final private boolean jj_3_529() { + if (jj_3R_139()) return true; return false; } - final private boolean jj_3_507() { - if (jj_3R_239()) return true; + final private boolean jj_3_528() { + if (jj_3R_140()) return true; return false; } - final private boolean jj_3R_110() { - if (jj_scan_token(DROP)) return true; + final private boolean jj_3_189() { + if (jj_scan_token(SCHEMA)) return true; + return false; + } + + final private boolean jj_3R_247() { Token xsp; xsp = jj_scanpos; - if (jj_3_507()) { + if (jj_3_528()) { jj_scanpos = xsp; - if (jj_3_508()) { + if (jj_3_529()) { jj_scanpos = xsp; - if (jj_3_509()) { + if (jj_3_530()) { jj_scanpos = xsp; - if (jj_3_510()) return true; + if (jj_3_531()) return true; } } } return false; } - final private boolean jj_3R_334() { + final private boolean jj_3R_338() { if (jj_scan_token(SUBSTRING)) return true; return false; } - final private boolean jj_3_159() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_143()) return true; - return false; - } - - final private boolean jj_3_168() { - if (jj_3R_149()) return true; - return false; - } - - final private boolean jj_3_167() { - if (jj_3R_148()) return true; - return false; - } - - final private boolean jj_3_166() { - if (jj_3R_147()) return true; + final private boolean jj_3_527() { + if (jj_3R_195()) return true; return false; } - final private boolean jj_3_165() { - if (jj_3R_146()) return true; + final private boolean jj_3_526() { + if (jj_3R_247()) return true; return false; } - final private boolean jj_3_961() { - if (jj_3R_331()) return true; + final private boolean jj_3_188() { + if (jj_scan_token(CATALOG)) return true; return false; } - final private boolean jj_3_164() { - if (jj_3R_145()) return true; + final private boolean jj_3_194() { + Token xsp; + xsp = jj_scanpos; + if (jj_scan_token(601)) jj_scanpos = xsp; + if (jj_3R_154()) return true; return false; } - final private boolean jj_3_506() { - if (jj_3R_238()) return true; + final private boolean jj_3R_120() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_526()) { + jj_scanpos = xsp; + if (jj_3_527()) return true; + } return false; } - final private boolean jj_3_960() { - if (jj_3R_84()) return true; + final private boolean jj_3_981() { + if (jj_3R_335()) return true; return false; } - final private boolean jj_3_505() { - if (jj_3R_237()) return true; + final private boolean jj_3_191() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_169() { - if (jj_scan_token(FROM)) return true; - if (jj_3R_150()) return true; + final private boolean jj_3_193() { + Token xsp; + xsp = jj_scanpos; + if (jj_scan_token(622)) { + jj_scanpos = xsp; + if (jj_scan_token(824)) { + jj_scanpos = xsp; + if (jj_scan_token(823)) { + jj_scanpos = xsp; + if (jj_scan_token(820)) { + jj_scanpos = xsp; + if (jj_scan_token(821)) { + jj_scanpos = xsp; + if (jj_scan_token(822)) { + jj_scanpos = xsp; + if (jj_scan_token(819)) return true; + } + } + } + } + } + } return false; } - final private boolean jj_3_504() { - if (jj_3R_236()) return true; + final private boolean jj_3_980() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_163() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_144()) return true; + final private boolean jj_3_190() { + if (jj_scan_token(TABLE)) return true; return false; } - final private boolean jj_3_503() { - if (jj_3R_235()) return true; + final private boolean jj_3_187() { + if (jj_scan_token(DATABASE)) return true; return false; } - final private boolean jj_3_962() { + final private boolean jj_3_982() { if (jj_scan_token(OVER)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_960()) { + if (jj_3_980()) { jj_scanpos = xsp; - if (jj_3_961()) return true; + if (jj_3_981()) return true; } return false; } - final private boolean jj_3_162() { - if (jj_3R_82()) return true; + final private boolean jj_3R_360() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_190()) jj_scanpos = xsp; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_502() { - if (jj_scan_token(OR)) return true; - if (jj_scan_token(REPLACE)) return true; + final private boolean jj_3_979() { + if (jj_scan_token(TO)) return true; + if (jj_3R_336()) return true; return false; } - final private boolean jj_3_161() { - if (jj_scan_token(STREAM)) return true; + final private boolean jj_3_525() { + if (jj_3R_246()) return true; return false; } - final private boolean jj_3_959() { - if (jj_scan_token(TO)) return true; - if (jj_3R_332()) return true; + final private boolean jj_3_524() { + if (jj_3R_245()) return true; return false; } - final private boolean jj_3R_109() { - if (jj_scan_token(CREATE)) return true; + final private boolean jj_3_192() { Token xsp; xsp = jj_scanpos; - if (jj_3_502()) jj_scanpos = xsp; - xsp = jj_scanpos; - if (jj_3_503()) { + if (jj_3_187()) { jj_scanpos = xsp; - if (jj_3_504()) { + if (jj_3_188()) { jj_scanpos = xsp; - if (jj_3_505()) { - jj_scanpos = xsp; - if (jj_3_506()) return true; - } + if (jj_3_189()) return true; } } + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_501() { - if (jj_scan_token(SESSION)) return true; + final private boolean jj_3_523() { + if (jj_3R_244()) return true; return false; } - final private boolean jj_3_160() { - if (jj_scan_token(HINT_BEG)) return true; - if (jj_3R_143()) return true; + final private boolean jj_3R_412() { + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_400() { - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_522() { + if (jj_3R_243()) return true; return false; } - final private boolean jj_3_158() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_143()) return true; + final private boolean jj_3R_113() { + if (jj_scan_token(DESCRIBE)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_192()) { + jj_scanpos = xsp; + if (jj_3R_360()) { + jj_scanpos = xsp; + if (jj_3_194()) return true; + } + } return false; } - final private boolean jj_3R_75() { - if (jj_scan_token(SELECT)) return true; + final private boolean jj_3R_111() { + if (jj_scan_token(DROP)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_160()) jj_scanpos = xsp; - if (jj_3R_346()) return true; + if (jj_3_522()) { + jj_scanpos = xsp; + if (jj_3_523()) { + jj_scanpos = xsp; + if (jj_3_524()) { + jj_scanpos = xsp; + if (jj_3_525()) return true; + } + } + } return false; } - final private boolean jj_3_500() { - if (jj_scan_token(SYSTEM)) return true; + final private boolean jj_3_978() { + if (jj_3R_224()) return true; return false; } - final private boolean jj_3R_355() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_500()) { - jj_scanpos = xsp; - if (jj_3_501()) return true; - } + final private boolean jj_3_521() { + if (jj_3R_242()) return true; return false; } - final private boolean jj_3_958() { - if (jj_3R_220()) return true; + final private boolean jj_3_184() { + if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_957() { + final private boolean jj_3_520() { + if (jj_3R_241()) return true; + return false; + } + + final private boolean jj_3_977() { if (jj_scan_token(LPAREN)) return true; if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3R_108() { - if (jj_scan_token(ALTER)) return true; - if (jj_3R_355()) return true; + final private boolean jj_3_186() { + if (jj_scan_token(INCLUDING)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_184()) jj_scanpos = xsp; + if (jj_scan_token(ATTRIBUTES)) return true; return false; } - final private boolean jj_3_956() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(STAR)) return true; + final private boolean jj_3_519() { + if (jj_3R_240()) return true; return false; } - final private boolean jj_3R_157() { - if (jj_scan_token(HINT_BEG)) return true; - if (jj_3R_143()) return true; + final private boolean jj_3_518() { + if (jj_3R_239()) return true; return false; } - final private boolean jj_3R_404() { + final private boolean jj_3_976() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(STAR)) return true; return false; } - final private boolean jj_3_497() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_185() { + if (jj_scan_token(EXCLUDING)) return true; + if (jj_scan_token(ATTRIBUTES)) return true; return false; } - final private boolean jj_3_955() { - if (jj_scan_token(SPECIFIC)) return true; + final private boolean jj_3R_416() { return false; } - final private boolean jj_3_496() { - if (jj_3R_152()) return true; + final private boolean jj_3_517() { + if (jj_scan_token(OR)) return true; + if (jj_scan_token(REPLACE)) return true; return false; } - final private boolean jj_3R_328() { + final private boolean jj_3R_152() { Token xsp; xsp = jj_scanpos; - if (jj_3_955()) { + if (jj_3_185()) { jj_scanpos = xsp; - if (jj_3R_404()) return true; + if (jj_3_186()) return true; } - if (jj_3R_229()) return true; return false; } - final private boolean jj_3_154() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_975() { + if (jj_scan_token(SPECIFIC)) return true; return false; } - final private boolean jj_3_499() { - if (jj_scan_token(RESET)) return true; + final private boolean jj_3R_110() { + if (jj_scan_token(CREATE)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_496()) { + if (jj_3_517()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_518()) { + jj_scanpos = xsp; + if (jj_3_519()) { + jj_scanpos = xsp; + if (jj_3_520()) { jj_scanpos = xsp; - if (jj_3_497()) return true; + if (jj_3_521()) return true; + } + } } return false; } - final private boolean jj_3_157() { - if (jj_3R_142()) return true; + final private boolean jj_3_516() { + if (jj_scan_token(SESSION)) return true; return false; } - final private boolean jj_3_495() { - if (jj_scan_token(ON)) return true; + final private boolean jj_3R_332() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_975()) { + jj_scanpos = xsp; + if (jj_3R_416()) return true; + } + if (jj_3R_233()) return true; return false; } - final private boolean jj_3_953() { - if (jj_3R_331()) return true; + final private boolean jj_3_183() { + if (jj_scan_token(WITHOUT)) return true; + if (jj_scan_token(IMPLEMENTATION)) return true; return false; } - final private boolean jj_3_156() { - if (jj_3R_124()) return true; + final private boolean jj_3_515() { + if (jj_scan_token(SYSTEM)) return true; return false; } - final private boolean jj_3_494() { - if (jj_3R_84()) return true; + final private boolean jj_3R_359() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_515()) { + jj_scanpos = xsp; + if (jj_3_516()) return true; + } return false; } - final private boolean jj_3_153() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_140()) return true; + final private boolean jj_3_973() { + if (jj_3R_335()) return true; return false; } - final private boolean jj_3_952() { - if (jj_3R_84()) return true; + final private boolean jj_3_182() { + if (jj_scan_token(WITH)) return true; + if (jj_scan_token(IMPLEMENTATION)) return true; return false; } - final private boolean jj_3_493() { - if (jj_3R_119()) return true; + final private boolean jj_3_972() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_155() { - if (jj_3R_141()) return true; + final private boolean jj_3_181() { + if (jj_scan_token(WITH)) return true; + if (jj_scan_token(TYPE)) return true; return false; } - final private boolean jj_3_954() { + final private boolean jj_3_974() { if (jj_scan_token(OVER)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_952()) { + if (jj_3_972()) { jj_scanpos = xsp; - if (jj_3_953()) return true; + if (jj_3_973()) return true; } return false; } - final private boolean jj_3R_143() { - if (jj_3R_84()) return true; - return false; - } - - final private boolean jj_3_498() { - if (jj_scan_token(SET)) return true; - if (jj_3R_152()) return true; - return false; - } - - final private boolean jj_3R_107() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_498()) { - jj_scanpos = xsp; - if (jj_3_499()) return true; - } + final private boolean jj_3R_109() { + if (jj_scan_token(ALTER)) return true; + if (jj_3R_359()) return true; return false; } - final private boolean jj_3_951() { + final private boolean jj_3_971() { if (jj_scan_token(FILTER)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_950() { - if (jj_3R_323()) return true; + final private boolean jj_3_180() { + if (jj_3R_117()) return true; return false; } - final private boolean jj_3_949() { - if (jj_3R_330()) return true; + final private boolean jj_3_970() { + if (jj_3R_327()) return true; return false; } - final private boolean jj_3R_142() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_140()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_153()) { jj_scanpos = xsp; break; } - } - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_179() { + if (jj_3R_116()) return true; return false; } - final private boolean jj_3_948() { - if (jj_3R_329()) return true; + final private boolean jj_3_178() { + if (jj_3R_115()) return true; return false; } - final private boolean jj_3_947() { - if (jj_3R_328()) return true; + final private boolean jj_3_969() { + if (jj_3R_334()) return true; return false; } - final private boolean jj_3_492() { - if (jj_scan_token(CURRENT)) return true; + final private boolean jj_3_177() { + if (jj_3R_114()) return true; return false; } - final private boolean jj_3R_413() { - if (jj_3R_416()) return true; + final private boolean jj_3_512() { + if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_491() { - if (jj_scan_token(NEXT)) return true; + final private boolean jj_3_176() { + if (jj_3R_80()) return true; return false; } - final private boolean jj_3_152() { - if (jj_3R_138()) return true; + final private boolean jj_3_968() { + if (jj_3R_333()) return true; return false; } - final private boolean jj_3_946() { - if (jj_3R_327()) return true; + final private boolean jj_3_511() { + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_151() { - if (jj_3R_139()) return true; + final private boolean jj_3_967() { + if (jj_3R_332()) return true; return false; } - final private boolean jj_3R_233() { + final private boolean jj_3R_154() { Token xsp; xsp = jj_scanpos; - if (jj_3_491()) { + if (jj_3_176()) { + jj_scanpos = xsp; + if (jj_3_177()) { + jj_scanpos = xsp; + if (jj_3_178()) { jj_scanpos = xsp; - if (jj_3_492()) return true; + if (jj_3_179()) { + jj_scanpos = xsp; + if (jj_3_180()) return true; + } + } + } } - if (jj_scan_token(VALUE)) return true; return false; } - final private boolean jj_3R_378() { + final private boolean jj_3R_425() { + if (jj_3R_429()) return true; + return false; + } + + final private boolean jj_3_514() { + if (jj_scan_token(RESET)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_946()) { - jj_scanpos = xsp; - if (jj_3R_413()) { + if (jj_3_511()) { jj_scanpos = xsp; - if (jj_3_947()) return true; - } + if (jj_3_512()) return true; } return false; } - final private boolean jj_3R_140() { + final private boolean jj_3_966() { + if (jj_3R_331()) return true; + return false; + } + + final private boolean jj_3R_387() { Token xsp; xsp = jj_scanpos; - if (jj_3_151()) { + if (jj_3_966()) { jj_scanpos = xsp; - if (jj_3_152()) return true; + if (jj_3R_425()) { + jj_scanpos = xsp; + if (jj_3_967()) return true; + } } return false; } - final private boolean jj_3_490() { - if (jj_scan_token(ELSE)) return true; - if (jj_3R_81()) return true; - return false; - } - - final private boolean jj_3_150() { - if (jj_3R_138()) return true; + final private boolean jj_3_510() { + if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3_149() { - if (jj_3R_84()) return true; + final private boolean jj_3_509() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3R_137() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_149()) { - jj_scanpos = xsp; - if (jj_3_150()) return true; - } - if (jj_scan_token(EQ)) return true; - if (jj_3R_138()) return true; + final private boolean jj_3_508() { + if (jj_3R_120()) return true; return false; } - final private boolean jj_3_489() { - if (jj_scan_token(WHEN)) return true; - if (jj_3R_234()) return true; + final private boolean jj_3_175() { + if (jj_scan_token(AS)) return true; + if (jj_scan_token(DOT_FORMAT)) return true; return false; } - final private boolean jj_3R_395() { + final private boolean jj_3_174() { + if (jj_scan_token(AS)) return true; + if (jj_scan_token(JSON)) return true; return false; } - final private boolean jj_3R_329() { - if (jj_3R_221()) return true; + final private boolean jj_3_173() { + if (jj_scan_token(AS)) return true; + if (jj_scan_token(XML)) return true; return false; } - final private boolean jj_3_488() { - if (jj_3R_81()) return true; + final private boolean jj_3_513() { + if (jj_scan_token(SET)) return true; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_148() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_137()) return true; + final private boolean jj_3_172() { + if (jj_3R_152()) return true; return false; } - final private boolean jj_3R_232() { - if (jj_scan_token(CASE)) return true; + final private boolean jj_3R_108() { Token xsp; xsp = jj_scanpos; - if (jj_3_488()) { + if (jj_3_513()) { jj_scanpos = xsp; - if (jj_3R_395()) return true; + if (jj_3_514()) return true; } return false; } - final private boolean jj_3_945() { - if (jj_scan_token(RESPECT)) return true; - if (jj_scan_token(NULLS)) return true; + final private boolean jj_3R_112() { + if (jj_scan_token(EXPLAIN)) return true; + if (jj_scan_token(PLAN)) return true; return false; } - final private boolean jj_3R_221() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_944()) { - jj_scanpos = xsp; - if (jj_3_945()) return true; - } + final private boolean jj_3R_333() { + if (jj_3R_225()) return true; return false; } - final private boolean jj_3R_141() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_137()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_148()) { jj_scanpos = xsp; break; } - } - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_507() { + if (jj_scan_token(CURRENT)) return true; return false; } - final private boolean jj_3_944() { - if (jj_scan_token(IGNORE)) return true; + final private boolean jj_3_506() { + if (jj_scan_token(NEXT)) return true; + return false; + } + + final private boolean jj_3_965() { + if (jj_scan_token(RESPECT)) return true; if (jj_scan_token(NULLS)) return true; return false; } - final private boolean jj_3_487() { - if (jj_3R_233()) return true; + final private boolean jj_3R_237() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_506()) { + jj_scanpos = xsp; + if (jj_3_507()) return true; + } + if (jj_scan_token(VALUE)) return true; return false; } - final private boolean jj_3_482() { + final private boolean jj_3R_225() { Token xsp; xsp = jj_scanpos; - if (jj_scan_token(542)) jj_scanpos = xsp; - if (jj_3R_229()) return true; - if (jj_scan_token(LPAREN)) return true; + if (jj_3_964()) { + jj_scanpos = xsp; + if (jj_3_965()) return true; + } return false; } - final private boolean jj_3_486() { - if (jj_3R_232()) return true; + final private boolean jj_3_964() { + if (jj_scan_token(IGNORE)) return true; + if (jj_scan_token(NULLS)) return true; return false; } - final private boolean jj_3_485() { - if (jj_3R_231()) return true; + final private boolean jj_3_161() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_144()) return true; return false; } - final private boolean jj_3R_242() { - if (jj_scan_token(VIEW)) return true; - if (jj_3R_133()) return true; - if (jj_3R_152()) return true; + final private boolean jj_3_505() { + if (jj_scan_token(ELSE)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_484() { - if (jj_3R_152()) return true; + final private boolean jj_3R_327() { + if (jj_scan_token(WITHIN)) return true; + if (jj_scan_token(GROUP)) return true; return false; } - final private boolean jj_3_483() { - if (jj_3R_230()) return true; + final private boolean jj_3_170() { + if (jj_3R_150()) return true; return false; } - final private boolean jj_3R_323() { - if (jj_scan_token(WITHIN)) return true; - if (jj_scan_token(GROUP)) return true; + final private boolean jj_3_169() { + if (jj_3R_149()) return true; return false; } - final private boolean jj_3R_384() { - if (jj_3R_378()) return true; + final private boolean jj_3_168() { + if (jj_3R_148()) return true; return false; } - final private boolean jj_3_481() { - if (jj_3R_228()) return true; + final private boolean jj_3_167() { + if (jj_3R_147()) return true; return false; } - final private boolean jj_3R_238() { - if (jj_scan_token(VIEW)) return true; - if (jj_3R_152()) return true; + final private boolean jj_3_166() { + if (jj_3R_146()) return true; return false; } - final private boolean jj_3_480() { - if (jj_3R_227()) return true; + final private boolean jj_3_171() { + if (jj_scan_token(FROM)) return true; + if (jj_3R_151()) return true; return false; } - final private boolean jj_3_479() { - if (jj_3R_226()) return true; + final private boolean jj_3_165() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_145()) return true; return false; } - final private boolean jj_3_478() { - if (jj_3R_225()) return true; + final private boolean jj_3_504() { + if (jj_scan_token(WHEN)) return true; + if (jj_3R_238()) return true; return false; } - final private boolean jj_3R_330() { + final private boolean jj_3R_407() { + return false; + } + + final private boolean jj_3R_334() { if (jj_scan_token(WITHIN)) return true; if (jj_scan_token(DISTINCT)) return true; return false; } - final private boolean jj_3_477() { - if (jj_3R_224()) return true; + final private boolean jj_3_164() { + if (jj_3R_83()) return true; return false; } - final private boolean jj_3_476() { - if (jj_3R_223()) return true; + final private boolean jj_3_503() { + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_475() { - if (jj_3R_219()) return true; + final private boolean jj_3_163() { + if (jj_scan_token(STREAM)) return true; return false; } - final private boolean jj_3R_104() { - if (jj_scan_token(ANALYZE)) return true; - if (jj_3R_354()) return true; + final private boolean jj_3R_236() { + if (jj_scan_token(CASE)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_503()) { + jj_scanpos = xsp; + if (jj_3R_407()) return true; + } return false; } - final private boolean jj_3_474() { - if (jj_3R_222()) return true; + final private boolean jj_3_162() { + if (jj_scan_token(HINT_BEG)) return true; + if (jj_3R_144()) return true; return false; } - final private boolean jj_3_943() { + final private boolean jj_3_963() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_139()) return true; + if (jj_3R_140()) return true; return false; } - final private boolean jj_3R_216() { + final private boolean jj_3_160() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_144()) return true; + return false; + } + + final private boolean jj_3R_76() { + if (jj_scan_token(SELECT)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_474()) { - jj_scanpos = xsp; - if (jj_3_475()) { - jj_scanpos = xsp; - if (jj_3_476()) { - jj_scanpos = xsp; - if (jj_3_477()) { - jj_scanpos = xsp; - if (jj_3_478()) { - jj_scanpos = xsp; - if (jj_3_479()) { - jj_scanpos = xsp; - if (jj_3_480()) { - jj_scanpos = xsp; - if (jj_3_481()) { - jj_scanpos = xsp; - if (jj_3R_384()) { - jj_scanpos = xsp; - if (jj_3_483()) { - jj_scanpos = xsp; - if (jj_3_484()) { - jj_scanpos = xsp; - if (jj_3_485()) { - jj_scanpos = xsp; - if (jj_3_486()) { - jj_scanpos = xsp; - if (jj_3_487()) return true; - } - } - } - } - } - } - } - } - } - } - } - } - } + if (jj_3_162()) jj_scanpos = xsp; + if (jj_3R_350()) return true; return false; } - final private boolean jj_3_942() { + final private boolean jj_3_962() { if (jj_scan_token(NEXT)) return true; return false; } - final private boolean jj_3_941() { + final private boolean jj_3_502() { + if (jj_3R_237()) return true; + return false; + } + + final private boolean jj_3_961() { if (jj_scan_token(PREV)) return true; return false; } - final private boolean jj_3R_105() { - if (jj_scan_token(REFRESH)) return true; - if (jj_scan_token(STATISTICS)) return true; + final private boolean jj_3_501() { + if (jj_3R_236()) return true; return false; } - final private boolean jj_3R_325() { + final private boolean jj_3_497() { + Token xsp; + xsp = jj_scanpos; + if (jj_scan_token(542)) jj_scanpos = xsp; + if (jj_3R_233()) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3_500() { + if (jj_3R_235()) return true; + return false; + } + + final private boolean jj_3R_329() { Token xsp; xsp = jj_scanpos; - if (jj_3_941()) { + if (jj_3_961()) { jj_scanpos = xsp; - if (jj_3_942()) return true; + if (jj_3_962()) return true; } if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_106() { - if (jj_scan_token(DROP)) return true; - if (jj_scan_token(STATISTICS)) return true; + final private boolean jj_3R_396() { + if (jj_scan_token(STAR)) return true; return false; } - final private boolean jj_3_471() { - if (jj_3R_221()) return true; + final private boolean jj_3_499() { + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_147() { - if (jj_3R_84()) return true; + final private boolean jj_3_498() { + if (jj_3R_234()) return true; return false; } - final private boolean jj_3_473() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_139()) return true; + final private boolean jj_3R_395() { + if (jj_3R_387()) return true; return false; } - final private boolean jj_3_940() { + final private boolean jj_3_496() { + if (jj_3R_232()) return true; + return false; + } + + final private boolean jj_3R_158() { + if (jj_scan_token(HINT_BEG)) return true; + if (jj_3R_144()) return true; + return false; + } + + final private boolean jj_3_495() { + if (jj_3R_231()) return true; + return false; + } + + final private boolean jj_3_960() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_139()) return true; + if (jj_3R_140()) return true; return false; } - final private boolean jj_3_146() { - if (jj_3R_119()) return true; + final private boolean jj_3_494() { + if (jj_3R_230()) return true; return false; } - final private boolean jj_3_472() { - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_493() { + if (jj_3R_229()) return true; return false; } - final private boolean jj_3_939() { + final private boolean jj_3_492() { + if (jj_3R_228()) return true; + return false; + } + + final private boolean jj_3_959() { if (jj_scan_token(LAST)) return true; return false; } - final private boolean jj_3R_136() { - if (jj_3R_364()) return true; - if (jj_scan_token(EQ)) return true; + final private boolean jj_3_491() { + if (jj_3R_227()) return true; return false; } - final private boolean jj_3_938() { + final private boolean jj_3_958() { if (jj_scan_token(FIRST)) return true; return false; } - final private boolean jj_3_470() { - if (jj_scan_token(PERCENTILE_DISC)) return true; + final private boolean jj_3_490() { + if (jj_3R_223()) return true; return false; } - final private boolean jj_3_469() { - if (jj_scan_token(PERCENTILE_CONT)) return true; + final private boolean jj_3R_415() { return false; } - final private boolean jj_3R_403() { + final private boolean jj_3_957() { + if (jj_scan_token(FINAL)) return true; return false; } - final private boolean jj_3_937() { - if (jj_scan_token(FINAL)) return true; + final private boolean jj_3_156() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_936() { + final private boolean jj_3_489() { + if (jj_3R_226()) return true; + return false; + } + + final private boolean jj_3_956() { if (jj_scan_token(RUNNING)) return true; return false; } - final private boolean jj_3R_416() { + final private boolean jj_3R_220() { Token xsp; xsp = jj_scanpos; - if (jj_3_469()) { + if (jj_3_489()) { jj_scanpos = xsp; - if (jj_3_470()) return true; + if (jj_3_490()) { + jj_scanpos = xsp; + if (jj_3_491()) { + jj_scanpos = xsp; + if (jj_3_492()) { + jj_scanpos = xsp; + if (jj_3_493()) { + jj_scanpos = xsp; + if (jj_3_494()) { + jj_scanpos = xsp; + if (jj_3_495()) { + jj_scanpos = xsp; + if (jj_3_496()) { + jj_scanpos = xsp; + if (jj_3R_395()) { + jj_scanpos = xsp; + if (jj_3_498()) { + jj_scanpos = xsp; + if (jj_3_499()) { + jj_scanpos = xsp; + lookingAhead = true; + jj_semLA = allowRowValueStar(); + lookingAhead = false; + if (!jj_semLA || jj_3R_396()) { + jj_scanpos = xsp; + if (jj_3_500()) { + jj_scanpos = xsp; + if (jj_3_501()) { + jj_scanpos = xsp; + if (jj_3_502()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + } } - if (jj_scan_token(LPAREN)) return true; - return false; - } - - final private boolean jj_3_145() { - if (jj_scan_token(MAX_CHANGED_PARTITION_ROWS_PERCENT)) return true; return false; } - final private boolean jj_3R_324() { + final private boolean jj_3R_328() { Token xsp; xsp = jj_scanpos; - if (jj_3_936()) { + if (jj_3_956()) { jj_scanpos = xsp; - if (jj_3_937()) { + if (jj_3_957()) { jj_scanpos = xsp; - if (jj_3R_403()) return true; + if (jj_3R_415()) return true; } } xsp = jj_scanpos; - if (jj_3_938()) { + if (jj_3_958()) { jj_scanpos = xsp; - if (jj_3_939()) return true; + if (jj_3_959()) return true; } if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_144() { - if (jj_scan_token(NULLS)) return true; - return false; - } - - final private boolean jj_3_143() { - if (jj_scan_token(SIZE)) return true; + final private boolean jj_3_159() { + if (jj_3R_143()) return true; return false; } - final private boolean jj_3_142() { - if (jj_scan_token(TOTAL)) return true; + final private boolean jj_3_158() { + if (jj_3R_125()) return true; return false; } - final private boolean jj_3R_364() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_141()) { - jj_scanpos = xsp; - if (jj_3_142()) { - jj_scanpos = xsp; - if (jj_3_143()) { - jj_scanpos = xsp; - if (jj_3_144()) { - jj_scanpos = xsp; - if (jj_3_145()) return true; - } - } - } - } + final private boolean jj_3_155() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_141()) return true; return false; } - final private boolean jj_3_141() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3_157() { + if (jj_3R_142()) return true; return false; } - final private boolean jj_3_935() { + final private boolean jj_3_955() { if (jj_scan_token(FINAL)) return true; return false; } - final private boolean jj_3_139() { - if (jj_scan_token(QUOTED_IDENTIFIER)) return true; + final private boolean jj_3_954() { + if (jj_scan_token(RUNNING)) return true; return false; } - final private boolean jj_3_934() { - if (jj_scan_token(RUNNING)) return true; + final private boolean jj_3R_144() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_137() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_136()) return true; + final private boolean jj_3_486() { + if (jj_3R_225()) return true; return false; } - final private boolean jj_3R_326() { + final private boolean jj_3R_330() { Token xsp; xsp = jj_scanpos; - if (jj_3_934()) { + if (jj_3_954()) { jj_scanpos = xsp; - if (jj_3_935()) return true; + if (jj_3_955()) return true; } - if (jj_3R_378()) return true; + if (jj_3R_213()) return true; return false; } - final private boolean jj_3_138() { - if (jj_3R_136()) return true; + final private boolean jj_3_488() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_140()) return true; return false; } - final private boolean jj_3_468() { - if (jj_scan_token(SEPARATOR)) return true; - if (jj_3R_138()) return true; + final private boolean jj_3_953() { + if (jj_3R_330()) return true; return false; } - final private boolean jj_3_140() { - if (jj_scan_token(WITH)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_138()) { - jj_scanpos = xsp; - if (jj_3_139()) return true; - } + final private boolean jj_3_487() { + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_467() { - if (jj_3R_70()) return true; + final private boolean jj_3_952() { + if (jj_3R_329()) return true; return false; } - final private boolean jj_3_933() { - if (jj_3R_326()) return true; + final private boolean jj_3R_143() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_141()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_155()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_932() { - if (jj_3R_325()) return true; + final private boolean jj_3_951() { + if (jj_3R_328()) return true; return false; } - final private boolean jj_3_466() { - if (jj_3R_221()) return true; + final private boolean jj_3_485() { + if (jj_scan_token(PERCENTILE_DISC)) return true; return false; } - final private boolean jj_3_931() { - if (jj_3R_324()) return true; + final private boolean jj_3_484() { + if (jj_scan_token(PERCENTILE_CONT)) return true; return false; } - final private boolean jj_3_930() { + final private boolean jj_3_950() { if (jj_scan_token(MATCH_NUMBER)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_465() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_83()) return true; + final private boolean jj_3R_429() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_484()) { + jj_scanpos = xsp; + if (jj_3_485()) return true; + } + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_136() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_135()) return true; + final private boolean jj_3_154() { + if (jj_3R_139()) return true; return false; } - final private boolean jj_3_929() { + final private boolean jj_3_949() { if (jj_scan_token(CLASSIFIER)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_464() { - if (jj_3R_82()) return true; + final private boolean jj_3_153() { + if (jj_3R_140()) return true; return false; } - final private boolean jj_3R_304() { + final private boolean jj_3R_308() { Token xsp; xsp = jj_scanpos; - if (jj_3_929()) { + if (jj_3_949()) { jj_scanpos = xsp; - if (jj_3_930()) { + if (jj_3_950()) { jj_scanpos = xsp; - if (jj_3_931()) { + if (jj_3_951()) { jj_scanpos = xsp; - if (jj_3_932()) { + if (jj_3_952()) { jj_scanpos = xsp; - if (jj_3_933()) return true; + if (jj_3_953()) return true; } } } @@ -29014,640 +28733,695 @@ final private boolean jj_3R_304() { return false; } - final private boolean jj_3R_354() { - if (jj_3R_135()) return true; - return false; - } - - final private boolean jj_3_463() { - if (jj_scan_token(STRING_AGG)) return true; - return false; - } - - final private boolean jj_3_462() { - if (jj_scan_token(GROUP_CONCAT)) return true; - return false; - } - - final private boolean jj_3_461() { - if (jj_scan_token(ARRAY_CONCAT_AGG)) return true; - return false; - } - - final private boolean jj_3_460() { - if (jj_scan_token(ARRAY_AGG)) return true; - return false; - } - - final private boolean jj_3R_327() { + final private boolean jj_3R_141() { Token xsp; xsp = jj_scanpos; - if (jj_3_460()) { - jj_scanpos = xsp; - if (jj_3_461()) { + if (jj_3_153()) { jj_scanpos = xsp; - if (jj_3_462()) { - jj_scanpos = xsp; - if (jj_3_463()) return true; - } + if (jj_3_154()) return true; } - } - if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_928() { + final private boolean jj_3_948() { if (jj_scan_token(SESSION)) return true; return false; } - final private boolean jj_3_927() { + final private boolean jj_3_152() { + if (jj_3R_85()) return true; + return false; + } + + final private boolean jj_3_947() { if (jj_scan_token(HOP)) return true; return false; } - final private boolean jj_3_135() { - if (jj_3R_124()) return true; + final private boolean jj_3_151() { + if (jj_3R_139()) return true; return false; } - final private boolean jj_3_926() { + final private boolean jj_3_946() { if (jj_scan_token(TUMBLE)) return true; return false; } - final private boolean jj_3R_312() { + final private boolean jj_3_150() { + if (jj_3R_139()) return true; + return false; + } + + final private boolean jj_3R_316() { Token xsp; xsp = jj_scanpos; - if (jj_3_926()) { + if (jj_3_946()) { jj_scanpos = xsp; - if (jj_3_927()) { + if (jj_3_947()) { jj_scanpos = xsp; - if (jj_3_928()) return true; + if (jj_3_948()) return true; } } - if (jj_3R_401()) return true; + if (jj_3R_413()) return true; return false; } - final private boolean jj_3R_135() { - if (jj_3R_152()) return true; + final private boolean jj_3_149() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_134() { - if (jj_scan_token(TRANSACTION)) return true; - return false; - } - - final private boolean jj_3_458() { - if (jj_3R_220()) return true; - return false; - } - - final private boolean jj_3R_101() { - if (jj_scan_token(ROLLBACK)) return true; - if (jj_scan_token(TO)) return true; + final private boolean jj_3_483() { + if (jj_scan_token(SEPARATOR)) return true; + if (jj_3R_139()) return true; return false; } - final private boolean jj_3_457() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3R_138() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_149()) { + jj_scanpos = xsp; + if (jj_3_150()) return true; + } + if (jj_scan_token(EQ)) return true; + xsp = jj_scanpos; + if (jj_3_151()) { + jj_scanpos = xsp; + if (jj_3_152()) return true; + } return false; } - final private boolean jj_3_459() { - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_482() { + if (jj_3R_71()) return true; return false; } - final private boolean jj_3_133() { - if (jj_scan_token(TRANSACTION)) return true; + final private boolean jj_3_481() { + if (jj_3R_225()) return true; return false; } - final private boolean jj_3_456() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(STAR)) return true; + final private boolean jj_3_148() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_138()) return true; return false; } - final private boolean jj_3R_303() { + final private boolean jj_3R_307() { if (jj_scan_token(TIME_TRUNC)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_100() { - if (jj_scan_token(SAVEPOINT)) return true; + final private boolean jj_3_480() { + if (jj_scan_token(COMMA)) return true; if (jj_3R_84()) return true; return false; } - final private boolean jj_3R_207() { - if (jj_3R_84()) return true; + final private boolean jj_3_479() { + if (jj_3R_83()) return true; return false; } - final private boolean jj_3R_103() { - if (jj_scan_token(ROLLBACK)) return true; + final private boolean jj_3R_142() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_138()) return true; Token xsp; - xsp = jj_scanpos; - if (jj_3_134()) jj_scanpos = xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_148()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3R_296() { - if (jj_scan_token(DATETIME_TRUNC)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_478() { + if (jj_scan_token(STRING_AGG)) return true; return false; } - final private boolean jj_3R_102() { - if (jj_scan_token(COMMIT)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_133()) jj_scanpos = xsp; + final private boolean jj_3_477() { + if (jj_scan_token(GROUP_CONCAT)) return true; return false; } - final private boolean jj_3_455() { - if (jj_3R_219()) return true; + final private boolean jj_3_476() { + if (jj_scan_token(ARRAY_CONCAT_AGG)) return true; return false; } - final private boolean jj_3_454() { - if (jj_3R_198()) return true; + final private boolean jj_3_475() { + if (jj_scan_token(ARRAY_AGG)) return true; return false; } - final private boolean jj_3R_74() { + final private boolean jj_3R_331() { Token xsp; xsp = jj_scanpos; - if (jj_3_454()) { + if (jj_3_475()) { + jj_scanpos = xsp; + if (jj_3_476()) { + jj_scanpos = xsp; + if (jj_3_477()) { jj_scanpos = xsp; - if (jj_3_455()) return true; + if (jj_3_478()) return true; + } } + } + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_99() { - if (jj_scan_token(KILL)) return true; - if (jj_scan_token(QUERY)) return true; + final private boolean jj_3R_246() { + if (jj_scan_token(VIEW)) return true; + if (jj_3R_134()) return true; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3R_302() { - if (jj_scan_token(TIME_DIFF)) return true; + final private boolean jj_3R_300() { + if (jj_scan_token(DATETIME_TRUNC)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_132() { - if (jj_scan_token(ASYNC)) return true; + final private boolean jj_3R_242() { + if (jj_scan_token(VIEW)) return true; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_453() { - if (jj_scan_token(EQUALS)) return true; + final private boolean jj_3_473() { + if (jj_3R_224()) return true; return false; } - final private boolean jj_3_452() { - if (jj_scan_token(SUCCEEDS)) return true; + final private boolean jj_3_472() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3R_98() { - if (jj_scan_token(KILL)) return true; - if (jj_scan_token(COMPUTE)) return true; + final private boolean jj_3_474() { + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_451() { - if (jj_scan_token(IMMEDIATELY)) return true; - if (jj_scan_token(SUCCEEDS)) return true; + final private boolean jj_3R_306() { + if (jj_scan_token(TIME_DIFF)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_450() { - if (jj_scan_token(PRECEDES)) return true; + final private boolean jj_3R_105() { + if (jj_scan_token(ANALYZE)) return true; + if (jj_3R_358()) return true; return false; } - final private boolean jj_3R_301() { - if (jj_scan_token(TIMESTAMP_TRUNC)) return true; + final private boolean jj_3_471() { if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(STAR)) return true; return false; } - final private boolean jj_3_449() { - if (jj_scan_token(IMMEDIATELY)) return true; - if (jj_scan_token(PRECEDES)) return true; + final private boolean jj_3R_211() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_448() { - if (jj_scan_token(OVERLAPS)) return true; + final private boolean jj_3R_106() { + if (jj_scan_token(REFRESH)) return true; + if (jj_scan_token(STATISTICS)) return true; return false; } - final private boolean jj_3R_96() { - if (jj_scan_token(KILL)) return true; - if (jj_scan_token(SERVICE)) return true; + final private boolean jj_3R_305() { + if (jj_scan_token(TIMESTAMP_TRUNC)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_447() { - if (jj_3R_134()) return true; + final private boolean jj_3R_107() { + if (jj_scan_token(DROP)) return true; + if (jj_scan_token(STATISTICS)) return true; return false; } - final private boolean jj_3_925() { - if (jj_3R_78()) return true; + final private boolean jj_3_470() { + if (jj_3R_223()) return true; return false; } - final private boolean jj_3R_415() { + final private boolean jj_3_469() { + if (jj_3R_200()) return true; + return false; + } + + final private boolean jj_3_945() { + if (jj_3R_79()) return true; + return false; + } + + final private boolean jj_3R_75() { Token xsp; xsp = jj_scanpos; - if (jj_3_446()) { + if (jj_3_469()) { jj_scanpos = xsp; - if (jj_3_447()) return true; + if (jj_3_470()) return true; } return false; } - final private boolean jj_3_446() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_147() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_924() { - if (jj_3R_270()) return true; + final private boolean jj_3_944() { + if (jj_3R_274()) return true; return false; } - final private boolean jj_3R_97() { - if (jj_scan_token(KILL)) return true; - if (jj_scan_token(TRANSACTION)) return true; + final private boolean jj_3_146() { + if (jj_3R_120()) return true; return false; } - final private boolean jj_3R_295() { + final private boolean jj_3R_137() { + if (jj_3R_368()) return true; + if (jj_scan_token(EQ)) return true; + return false; + } + + final private boolean jj_3R_299() { if (jj_scan_token(DATE_TRUNC)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_95() { - if (jj_scan_token(KILL)) return true; - if (jj_scan_token(CONTINUOUS)) return true; + final private boolean jj_3_145() { + if (jj_scan_token(MAX_CHANGED_PARTITION_ROWS_PERCENT)) return true; return false; } - final private boolean jj_3R_408() { - if (jj_3R_415()) return true; - if (jj_scan_token(LAMBDA)) return true; + final private boolean jj_3_144() { + if (jj_scan_token(NULLS)) return true; return false; } - final private boolean jj_3R_298() { - if (jj_scan_token(DATETIME_DIFF)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_143() { + if (jj_scan_token(SIZE)) return true; return false; } - final private boolean jj_3R_94() { - if (jj_scan_token(KILL)) return true; - if (jj_scan_token(SCAN)) return true; + final private boolean jj_3_468() { + if (jj_scan_token(EQUALS)) return true; return false; } - final private boolean jj_3R_300() { - if (jj_scan_token(TIMESTAMP_DIFF)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_142() { + if (jj_scan_token(TOTAL)) return true; return false; } - final private boolean jj_3_441() { - if (jj_3R_215()) return true; + final private boolean jj_3_467() { + if (jj_scan_token(SUCCEEDS)) return true; return false; } - final private boolean jj_3R_299() { - if (jj_scan_token(TIMESTAMPDIFF)) return true; - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_332()) return true; + final private boolean jj_3R_368() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_141()) { + jj_scanpos = xsp; + if (jj_3_142()) { + jj_scanpos = xsp; + if (jj_3_143()) { + jj_scanpos = xsp; + if (jj_3_144()) { + jj_scanpos = xsp; + if (jj_3_145()) return true; + } + } + } + } return false; } - final private boolean jj_3_131() { - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_141() { + if (jj_scan_token(DISTINCT)) return true; return false; } - final private boolean jj_3R_218() { + final private boolean jj_3_466() { + if (jj_scan_token(IMMEDIATELY)) return true; + if (jj_scan_token(SUCCEEDS)) return true; return false; } - final private boolean jj_3_130() { - if (jj_scan_token(MINUS)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_465() { + if (jj_scan_token(PRECEDES)) return true; return false; } - final private boolean jj_3_440() { - if (jj_scan_token(ROW)) return true; + final private boolean jj_3_464() { + if (jj_scan_token(IMMEDIATELY)) return true; + if (jj_scan_token(PRECEDES)) return true; return false; } - final private boolean jj_3_129() { - if (jj_scan_token(PLUS)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3R_302() { + if (jj_scan_token(DATETIME_DIFF)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_445() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_440()) { - jj_scanpos = xsp; - if (jj_3R_218()) return true; - } - if (jj_3R_173()) return true; + final private boolean jj_3_139() { + if (jj_scan_token(QUOTED_IDENTIFIER)) return true; return false; } - final private boolean jj_3R_297() { - if (jj_scan_token(TIMESTAMPADD)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_463() { + if (jj_scan_token(OVERLAPS)) return true; return false; } - final private boolean jj_3R_241() { - if (jj_scan_token(USER)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_137() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_137()) return true; return false; } - final private boolean jj_3_444() { - if (jj_scan_token(ROW)) return true; - if (jj_3R_173()) return true; + final private boolean jj_3_138() { + if (jj_3R_137()) return true; return false; } - final private boolean jj_3_443() { - if (jj_3R_217()) return true; + final private boolean jj_3_462() { + if (jj_3R_135()) return true; return false; } - final private boolean jj_3R_209() { + final private boolean jj_3R_428() { Token xsp; xsp = jj_scanpos; - if (jj_3_442()) { - jj_scanpos = xsp; - if (jj_3_443()) { - jj_scanpos = xsp; - if (jj_3_444()) { + if (jj_3_461()) { jj_scanpos = xsp; - if (jj_3_445()) return true; - } - } + if (jj_3_462()) return true; } return false; } - final private boolean jj_3_442() { - if (jj_3R_216()) return true; + final private boolean jj_3_461() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3R_93() { - if (jj_scan_token(ALTER)) return true; - if (jj_scan_token(USER)) return true; + final private boolean jj_3_140() { + if (jj_scan_token(WITH)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_138()) { + jj_scanpos = xsp; + if (jj_3_139()) return true; + } return false; } - final private boolean jj_3R_294() { - if (jj_scan_token(DATE_DIFF)) return true; + final private boolean jj_3R_304() { + if (jj_scan_token(TIMESTAMP_DIFF)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_237() { - if (jj_scan_token(USER)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_136() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_136()) return true; return false; } - final private boolean jj_3_124() { - if (jj_scan_token(COLUMN)) return true; + final private boolean jj_3R_420() { + if (jj_3R_428()) return true; + if (jj_scan_token(LAMBDA)) return true; return false; } - final private boolean jj_3_439() { - if (jj_scan_token(NE2)) return true; + final private boolean jj_3R_358() { + if (jj_3R_136()) return true; return false; } - final private boolean jj_3_438() { - if (jj_scan_token(NE)) return true; + final private boolean jj_3_135() { + if (jj_3R_125()) return true; return false; } - final private boolean jj_3_923() { - if (jj_scan_token(COMMA)) return true; - if (jj_scan_token(JSON_SCOPE)) return true; + final private boolean jj_3R_303() { + if (jj_scan_token(TIMESTAMPDIFF)) return true; + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_336()) return true; return false; } - final private boolean jj_3_123() { - if (jj_scan_token(COLUMN)) return true; + final private boolean jj_3R_136() { + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_437() { - if (jj_scan_token(EQ)) return true; + final private boolean jj_3_134() { + if (jj_scan_token(TRANSACTION)) return true; return false; } - final private boolean jj_3_922() { - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3R_102() { + if (jj_scan_token(ROLLBACK)) return true; + if (jj_scan_token(TO)) return true; return false; } - final private boolean jj_3_128() { - if (jj_scan_token(DROP)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_124()) jj_scanpos = xsp; - if (jj_3R_133()) return true; - if (jj_3R_134()) return true; + final private boolean jj_3_133() { + if (jj_scan_token(TRANSACTION)) return true; return false; } - final private boolean jj_3_436() { - if (jj_scan_token(GE)) return true; + final private boolean jj_3R_301() { + if (jj_scan_token(TIMESTAMPADD)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_435() { - if (jj_scan_token(GT)) return true; + final private boolean jj_3R_101() { + if (jj_scan_token(SAVEPOINT)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_127() { - if (jj_scan_token(ADD)) return true; + final private boolean jj_3R_104() { + if (jj_scan_token(ROLLBACK)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_123()) jj_scanpos = xsp; - if (jj_3R_131()) return true; - if (jj_3R_132()) return true; + if (jj_3_134()) jj_scanpos = xsp; return false; } - final private boolean jj_3_434() { - if (jj_scan_token(LE)) return true; + final private boolean jj_3_456() { + if (jj_3R_219()) return true; return false; } - final private boolean jj_3R_208() { + final private boolean jj_3R_298() { + if (jj_scan_token(DATE_DIFF)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3R_103() { + if (jj_scan_token(COMMIT)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_433()) { - jj_scanpos = xsp; - if (jj_3_434()) { - jj_scanpos = xsp; - if (jj_3_435()) { - jj_scanpos = xsp; - if (jj_3_436()) { - jj_scanpos = xsp; - if (jj_3_437()) { - jj_scanpos = xsp; - if (jj_3_438()) { - jj_scanpos = xsp; - if (jj_3_439()) return true; - } - } - } - } - } - } + if (jj_3_133()) jj_scanpos = xsp; return false; } - final private boolean jj_3_126() { - if (jj_scan_token(NOLOGGING)) return true; + final private boolean jj_3R_222() { return false; } - final private boolean jj_3_433() { - if (jj_scan_token(LT)) return true; + final private boolean jj_3_943() { + if (jj_scan_token(COMMA)) return true; + if (jj_scan_token(JSON_SCOPE)) return true; return false; } - final private boolean jj_3R_292() { - if (jj_scan_token(CONTAINS_SUBSTR)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_455() { + if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_125() { - if (jj_scan_token(LOGGING)) return true; + final private boolean jj_3_942() { + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3R_407() { + final private boolean jj_3_460() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_455()) { + jj_scanpos = xsp; + if (jj_3R_222()) return true; + } + if (jj_3R_174()) return true; return false; } - final private boolean jj_3R_92() { - if (jj_scan_token(ALTER)) return true; - if (jj_scan_token(TABLE)) return true; + final private boolean jj_3R_100() { + if (jj_scan_token(KILL)) return true; + if (jj_scan_token(QUERY)) return true; return false; } - final private boolean jj_3_430() { - if (jj_3R_214()) return true; + final private boolean jj_3R_296() { + if (jj_scan_token(CONTAINS_SUBSTR)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_423() { - if (jj_scan_token(DOT)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_132() { + if (jj_scan_token(ASYNC)) return true; return false; } - final private boolean jj_3_122() { - if (jj_3R_130()) return true; + final private boolean jj_3R_99() { + if (jj_scan_token(KILL)) return true; + if (jj_scan_token(COMPUTE)) return true; return false; } - final private boolean jj_3R_132() { + final private boolean jj_3_459() { + if (jj_scan_token(ROW)) return true; + if (jj_3R_174()) return true; + return false; + } + + final private boolean jj_3_458() { + if (jj_3R_221()) return true; + return false; + } + + final private boolean jj_3R_213() { Token xsp; xsp = jj_scanpos; - if (jj_3_121()) { + if (jj_3_457()) { jj_scanpos = xsp; - if (jj_3_122()) return true; + if (jj_3_458()) { + jj_scanpos = xsp; + if (jj_3_459()) { + jj_scanpos = xsp; + if (jj_3_460()) return true; + } + } } return false; } - final private boolean jj_3_121() { - if (jj_3R_129()) return true; + final private boolean jj_3_457() { + if (jj_3R_220()) return true; return false; } - final private boolean jj_3_422() { - if (jj_3R_81()) return true; + final private boolean jj_3_941() { + if (jj_3R_327()) return true; return false; } - final private boolean jj_3_921() { - if (jj_3R_323()) return true; + final private boolean jj_3R_97() { + if (jj_scan_token(KILL)) return true; + if (jj_scan_token(SERVICE)) return true; return false; } - final private boolean jj_3_421() { - if (jj_scan_token(SAFE_ORDINAL)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_940() { + if (jj_3R_325()) return true; return false; } - final private boolean jj_3_420() { - if (jj_scan_token(SAFE_OFFSET)) return true; - if (jj_scan_token(LPAREN)) return true; - return false; + final private boolean jj_3R_98() { + if (jj_scan_token(KILL)) return true; + if (jj_scan_token(TRANSACTION)) return true; + return false; } - final private boolean jj_3_419() { - if (jj_scan_token(ORDINAL)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_939() { + if (jj_3R_326()) return true; return false; } - final private boolean jj_3_418() { - if (jj_scan_token(OFFSET)) return true; + final private boolean jj_3_454() { + if (jj_scan_token(NE2)) return true; + return false; + } + + final private boolean jj_3R_315() { + if (jj_scan_token(JSON_ARRAYAGG)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_429() { - if (jj_scan_token(LBRACKET)) return true; + final private boolean jj_3_453() { + if (jj_scan_token(NE)) return true; + return false; + } + + final private boolean jj_3_452() { + if (jj_scan_token(EQ)) return true; + return false; + } + + final private boolean jj_3_451() { + if (jj_scan_token(GE)) return true; + return false; + } + + final private boolean jj_3R_96() { + if (jj_scan_token(KILL)) return true; + if (jj_scan_token(CONTINUOUS)) return true; + return false; + } + + final private boolean jj_3_450() { + if (jj_scan_token(GT)) return true; + return false; + } + + final private boolean jj_3_449() { + if (jj_scan_token(LE)) return true; + return false; + } + + final private boolean jj_3R_212() { Token xsp; xsp = jj_scanpos; - if (jj_3_418()) { + if (jj_3_448()) { jj_scanpos = xsp; - if (jj_3_419()) { + if (jj_3_449()) { jj_scanpos = xsp; - if (jj_3_420()) { + if (jj_3_450()) { + jj_scanpos = xsp; + if (jj_3_451()) { jj_scanpos = xsp; - if (jj_3_421()) { + if (jj_3_452()) { jj_scanpos = xsp; - if (jj_3_422()) return true; + if (jj_3_453()) { + jj_scanpos = xsp; + if (jj_3_454()) return true; + } + } } } } @@ -29655,180 +29429,264 @@ final private boolean jj_3_429() { return false; } - final private boolean jj_3_120() { - if (jj_scan_token(NOT)) return true; - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_448() { + if (jj_scan_token(LT)) return true; return false; } - final private boolean jj_3_920() { - if (jj_3R_321()) return true; + final private boolean jj_3R_326() { + if (jj_3R_71()) return true; return false; } - final private boolean jj_3_428() { - if (jj_3R_213()) return true; - if (jj_3R_210()) return true; + final private boolean jj_3R_419() { return false; } - final private boolean jj_3R_129() { - if (jj_3R_84()) return true; - if (jj_3R_122()) return true; + final private boolean jj_3_445() { + if (jj_3R_218()) return true; return false; } - final private boolean jj_3_427() { - if (jj_3R_212()) return true; + final private boolean jj_3R_95() { + if (jj_scan_token(KILL)) return true; + if (jj_scan_token(SCAN)) return true; return false; } - final private boolean jj_3_919() { - if (jj_3R_322()) return true; + final private boolean jj_3_438() { + if (jj_scan_token(DOT)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3R_311() { - if (jj_scan_token(JSON_ARRAYAGG)) return true; + final private boolean jj_3_938() { + if (jj_3R_325()) return true; + return false; + } + + final private boolean jj_3_936() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_79()) return true; + return false; + } + + final private boolean jj_3_937() { + if (jj_3R_79()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_936()) { jj_scanpos = xsp; break; } + } + return false; + } + + final private boolean jj_3R_314() { + if (jj_scan_token(JSON_ARRAY)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_417() { + final private boolean jj_3_437() { + if (jj_3R_82()) return true; + return false; + } + + final private boolean jj_3_436() { + if (jj_scan_token(SAFE_ORDINAL)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3_435() { + if (jj_scan_token(SAFE_OFFSET)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3_434() { + if (jj_scan_token(ORDINAL)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3_433() { + if (jj_scan_token(OFFSET)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3_444() { + if (jj_scan_token(LBRACKET)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_433()) { + jj_scanpos = xsp; + if (jj_3_434()) { + jj_scanpos = xsp; + if (jj_3_435()) { + jj_scanpos = xsp; + if (jj_3_436()) { + jj_scanpos = xsp; + if (jj_3_437()) return true; + } + } + } + } + return false; + } + + final private boolean jj_3_443() { + if (jj_3R_217()) return true; + if (jj_3R_214()) return true; + return false; + } + + final private boolean jj_3_935() { + if (jj_3R_325()) return true; + return false; + } + + final private boolean jj_3_442() { + if (jj_3R_216()) return true; + return false; + } + + final private boolean jj_3_432() { if (jj_scan_token(ESCAPE)) return true; - if (jj_3R_209()) return true; + if (jj_3R_213()) return true; return false; } - final private boolean jj_3_119() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_129()) return true; + final private boolean jj_3R_313() { + if (jj_scan_token(JSON_OBJECTAGG)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_413() { + final private boolean jj_3_428() { if (jj_scan_token(STAR)) return true; return false; } - final private boolean jj_3_416() { + final private boolean jj_3_431() { if (jj_scan_token(TILDE)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_413()) jj_scanpos = xsp; + if (jj_3_428()) jj_scanpos = xsp; return false; } - final private boolean jj_3_412() { + final private boolean jj_3_427() { if (jj_scan_token(STAR)) return true; return false; } - final private boolean jj_3_411() { + final private boolean jj_3_426() { if (jj_scan_token(SIMILAR)) return true; if (jj_scan_token(TO)) return true; return false; } - final private boolean jj_3_415() { + final private boolean jj_3_430() { if (jj_scan_token(NEGATE)) return true; if (jj_scan_token(TILDE)) return true; return false; } - final private boolean jj_3R_130() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_129()) return true; - return false; - } - - final private boolean jj_3_410() { + final private boolean jj_3_425() { if (jj_scan_token(RLIKE)) return true; return false; } - final private boolean jj_3R_322() { - if (jj_3R_70()) return true; + final private boolean jj_3_131() { + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } - final private boolean jj_3_409() { + final private boolean jj_3_424() { if (jj_scan_token(ILIKE)) return true; return false; } - final private boolean jj_3_406() { + final private boolean jj_3_421() { if (jj_scan_token(SIMILAR)) return true; if (jj_scan_token(TO)) return true; return false; } - final private boolean jj_3_408() { + final private boolean jj_3_423() { if (jj_scan_token(LIKE)) return true; return false; } - final private boolean jj_3_405() { + final private boolean jj_3_130() { + if (jj_scan_token(MINUS)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + return false; + } + + final private boolean jj_3_420() { if (jj_scan_token(RLIKE)) return true; return false; } - final private boolean jj_3_404() { + final private boolean jj_3_419() { if (jj_scan_token(ILIKE)) return true; return false; } - final private boolean jj_3_403() { - if (jj_scan_token(LIKE)) return true; + final private boolean jj_3_129() { + if (jj_scan_token(PLUS)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } - final private boolean jj_3_407() { - if (jj_scan_token(NOT)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_403()) { - jj_scanpos = xsp; - if (jj_3_404()) { - jj_scanpos = xsp; - if (jj_3_405()) { - jj_scanpos = xsp; - if (jj_3_406()) return true; - } - } - } + final private boolean jj_3_418() { + if (jj_scan_token(LIKE)) return true; return false; } - final private boolean jj_3_918() { - if (jj_3R_321()) return true; + final private boolean jj_3_934() { + if (jj_3R_325()) return true; return false; } - final private boolean jj_3_916() { + final private boolean jj_3_932() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_78()) return true; + if (jj_3R_324()) return true; return false; } - final private boolean jj_3R_212() { - if (jj_scan_token(INFIX_CAST)) return true; - if (jj_3R_122()) return true; + final private boolean jj_3_422() { + if (jj_scan_token(NOT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_418()) { + jj_scanpos = xsp; + if (jj_3_419()) { + jj_scanpos = xsp; + if (jj_3_420()) { + jj_scanpos = xsp; + if (jj_3_421()) return true; + } + } + } return false; } - final private boolean jj_3_414() { + final private boolean jj_3_429() { Token xsp; xsp = jj_scanpos; - if (jj_3_407()) { + if (jj_3_422()) { jj_scanpos = xsp; - if (jj_3_408()) { + if (jj_3_423()) { jj_scanpos = xsp; - if (jj_3_409()) { + if (jj_3_424()) { jj_scanpos = xsp; - if (jj_3_410()) { + if (jj_3_425()) { jj_scanpos = xsp; - if (jj_3_411()) return true; + if (jj_3_426()) return true; } } } @@ -29836,1320 +29694,1342 @@ final private boolean jj_3_414() { return false; } - final private boolean jj_3_917() { - if (jj_3R_78()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_916()) { jj_scanpos = xsp; break; } - } + final private boolean jj_3_933() { + if (jj_3R_324()) return true; return false; } - final private boolean jj_3R_310() { - if (jj_scan_token(JSON_ARRAY)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3R_245() { + if (jj_scan_token(USER)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3R_240() { - if (jj_scan_token(INDEX)) return true; - if (jj_3R_133()) return true; - if (jj_3R_152()) return true; + final private boolean jj_3R_312() { + if (jj_scan_token(JSON_OBJECT)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_426() { + final private boolean jj_3_441() { Token xsp; xsp = jj_scanpos; - if (jj_3_414()) { + if (jj_3_429()) { jj_scanpos = xsp; - if (jj_3_415()) { + if (jj_3_430()) { jj_scanpos = xsp; - if (jj_3_416()) return true; + if (jj_3_431()) return true; } } - if (jj_3R_211()) return true; + if (jj_3R_215()) return true; return false; } - final private boolean jj_3_399() { + final private boolean jj_3_414() { if (jj_scan_token(ASYMMETRIC)) return true; return false; } - final private boolean jj_3_400() { + final private boolean jj_3_415() { Token xsp; xsp = jj_scanpos; - if (jj_3_398()) { + if (jj_3_413()) { jj_scanpos = xsp; - if (jj_3_399()) return true; + if (jj_3_414()) return true; } return false; } - final private boolean jj_3_398() { + final private boolean jj_3_413() { if (jj_scan_token(SYMMETRIC)) return true; return false; } - final private boolean jj_3R_239() { - if (jj_scan_token(TABLE)) return true; - if (jj_3R_133()) return true; - if (jj_3R_152()) return true; + final private boolean jj_3R_94() { + if (jj_scan_token(ALTER)) return true; + if (jj_scan_token(USER)) return true; return false; } - final private boolean jj_3_915() { - if (jj_3R_321()) return true; + final private boolean jj_3_411() { + if (jj_scan_token(ASYMMETRIC)) return true; return false; } - final private boolean jj_3_396() { - if (jj_scan_token(ASYMMETRIC)) return true; + final private boolean jj_3_931() { + if (jj_scan_token(ABSENT)) return true; + if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3_402() { + final private boolean jj_3_417() { if (jj_scan_token(BETWEEN)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_400()) jj_scanpos = xsp; + if (jj_3_415()) jj_scanpos = xsp; return false; } - final private boolean jj_3_397() { + final private boolean jj_3_412() { Token xsp; xsp = jj_scanpos; - if (jj_3_395()) { + if (jj_3_410()) { jj_scanpos = xsp; - if (jj_3_396()) return true; + if (jj_3_411()) return true; } return false; } - final private boolean jj_3_395() { + final private boolean jj_3_410() { if (jj_scan_token(SYMMETRIC)) return true; return false; } - final private boolean jj_3R_363() { - return false; - } - - final private boolean jj_3R_309() { - if (jj_scan_token(JSON_OBJECTAGG)) return true; - if (jj_scan_token(LPAREN)) return true; - return false; - } - - final private boolean jj_3R_133() { + final private boolean jj_3R_325() { Token xsp; xsp = jj_scanpos; - if (jj_3_118()) { + if (jj_3_930()) { jj_scanpos = xsp; - if (jj_3R_363()) return true; + if (jj_3_931()) return true; } return false; } - final private boolean jj_3_118() { - if (jj_scan_token(IF)) return true; - if (jj_scan_token(EXISTS)) return true; + final private boolean jj_3_930() { + if (jj_scan_token(NULL)) return true; + if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3_401() { + final private boolean jj_3_416() { if (jj_scan_token(NOT)) return true; if (jj_scan_token(BETWEEN)) return true; return false; } - final private boolean jj_3_425() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_401()) { - jj_scanpos = xsp; - if (jj_3_402()) return true; - } - if (jj_3R_210()) return true; + final private boolean jj_3R_241() { + if (jj_scan_token(USER)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_117() { - if (jj_scan_token(INLINE_SIZE)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_124() { + if (jj_scan_token(COLUMN)) return true; return false; } - final private boolean jj_3_914() { - if (jj_3R_321()) return true; + final private boolean jj_3_929() { + if (jj_scan_token(COLON)) return true; return false; } - final private boolean jj_3_116() { - if (jj_scan_token(PARALLEL)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_123() { + if (jj_scan_token(COLUMN)) return true; return false; } - final private boolean jj_3_115() { + final private boolean jj_3_926() { + if (jj_scan_token(KEY)) return true; + if (jj_3R_323()) return true; + return false; + } + + final private boolean jj_3_440() { Token xsp; xsp = jj_scanpos; - if (jj_3_116()) { + if (jj_3_416()) { jj_scanpos = xsp; - if (jj_3_117()) return true; + if (jj_3_417()) return true; } + if (jj_3R_214()) return true; return false; } - final private boolean jj_3_912() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_320()) return true; - return false; - } - - final private boolean jj_3_391() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_128() { + if (jj_scan_token(DROP)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_124()) jj_scanpos = xsp; + if (jj_3R_134()) return true; + if (jj_3R_135()) return true; return false; } - final private boolean jj_3_390() { - if (jj_scan_token(ANY)) return true; + final private boolean jj_3_928() { + if (jj_scan_token(COMMA)) return true; return false; } - final private boolean jj_3_114() { - if (jj_3R_84()) return true; + final private boolean jj_3_927() { + if (jj_scan_token(VALUE)) return true; return false; } - final private boolean jj_3_389() { - if (jj_scan_token(SOME)) return true; + final private boolean jj_3_127() { + if (jj_scan_token(ADD)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_123()) jj_scanpos = xsp; + if (jj_3R_132()) return true; + if (jj_3R_133()) return true; return false; } - final private boolean jj_3_913() { - if (jj_3R_320()) return true; + final private boolean jj_3_126() { + if (jj_scan_token(NOLOGGING)) return true; return false; } - final private boolean jj_3_394() { - if (jj_3R_208()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_389()) { - jj_scanpos = xsp; - if (jj_3_390()) { - jj_scanpos = xsp; - if (jj_3_391()) return true; - } - } + final private boolean jj_3R_424() { return false; } - final private boolean jj_3R_236() { - if (jj_scan_token(INDEX)) return true; - if (jj_3R_131()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_114()) jj_scanpos = xsp; - if (jj_scan_token(ON)) return true; + final private boolean jj_3_125() { + if (jj_scan_token(LOGGING)) return true; return false; } - final private boolean jj_3R_308() { - if (jj_scan_token(JSON_OBJECT)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3R_414() { + if (jj_scan_token(KEY)) return true; return false; } - final private boolean jj_3_393() { - if (jj_scan_token(IN)) return true; + final private boolean jj_3_406() { + if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_392() { - if (jj_scan_token(NOT)) return true; - if (jj_scan_token(IN)) return true; + final private boolean jj_3_405() { + if (jj_scan_token(ANY)) return true; return false; } - final private boolean jj_3_424() { + final private boolean jj_3R_324() { Token xsp; xsp = jj_scanpos; - if (jj_3_392()) { + if (jj_3R_414()) jj_scanpos = xsp; + if (jj_3R_323()) return true; + xsp = jj_scanpos; + if (jj_3_927()) { jj_scanpos = xsp; - if (jj_3_393()) { + if (jj_3_928()) { jj_scanpos = xsp; - if (jj_3_394()) return true; + if (jj_3_929()) return true; } } - if (jj_3R_173()) return true; return false; } - final private boolean jj_3_113() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_128()) return true; + final private boolean jj_3R_93() { + if (jj_scan_token(ALTER)) return true; + if (jj_scan_token(TABLE)) return true; return false; } - final private boolean jj_3_911() { - if (jj_scan_token(ABSENT)) return true; - if (jj_scan_token(ON)) return true; + final private boolean jj_3_404() { + if (jj_scan_token(SOME)) return true; return false; } - final private boolean jj_3R_321() { + final private boolean jj_3_409() { + if (jj_3R_212()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_910()) { + if (jj_3_404()) { + jj_scanpos = xsp; + if (jj_3_405()) { jj_scanpos = xsp; - if (jj_3_911()) return true; + if (jj_3_406()) return true; + } } return false; } - final private boolean jj_3_431() { + final private boolean jj_3R_384() { Token xsp; xsp = jj_scanpos; - if (jj_3_424()) { - jj_scanpos = xsp; - if (jj_3_425()) { - jj_scanpos = xsp; - if (jj_3_426()) { - jj_scanpos = xsp; - if (jj_3_427()) { - jj_scanpos = xsp; - if (jj_3_428()) { - jj_scanpos = xsp; - if (jj_3_429()) { - jj_scanpos = xsp; - if (jj_3_430()) return true; - } - } - } - } - } - } + lookingAhead = true; + jj_semLA = false; + lookingAhead = false; + if (!jj_semLA || jj_3R_424()) return true; + if (jj_scan_token(ZONE)) return true; return false; } - final private boolean jj_3_910() { - if (jj_scan_token(NULL)) return true; - if (jj_scan_token(ON)) return true; + final private boolean jj_3_408() { + if (jj_scan_token(IN)) return true; return false; } - final private boolean jj_3_432() { - Token xsp; - if (jj_3_431()) return true; - while (true) { - xsp = jj_scanpos; - if (jj_3_431()) { jj_scanpos = xsp; break; } - } + final private boolean jj_3R_323() { + if (jj_3R_82()) return true; return false; } - final private boolean jj_3R_211() { - if (jj_3R_210()) return true; + final private boolean jj_3_407() { + if (jj_scan_token(NOT)) return true; + if (jj_scan_token(IN)) return true; + return false; + } + + final private boolean jj_3_122() { + if (jj_3R_131()) return true; + return false; + } + + final private boolean jj_3R_133() { Token xsp; xsp = jj_scanpos; - if (jj_3_432()) { + if (jj_3_121()) { jj_scanpos = xsp; - if (jj_3R_407()) return true; + if (jj_3_122()) return true; } return false; } - final private boolean jj_3_909() { - if (jj_scan_token(COLON)) return true; + final private boolean jj_3_121() { + if (jj_3R_130()) return true; return false; } - final private boolean jj_3_111() { - if (jj_scan_token(DESC)) return true; + final private boolean jj_3_439() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_407()) { + jj_scanpos = xsp; + if (jj_3_408()) { + jj_scanpos = xsp; + if (jj_3_409()) return true; + } + } + if (jj_3R_174()) return true; return false; } - final private boolean jj_3_112() { + final private boolean jj_3_120() { + if (jj_scan_token(NOT)) return true; + if (jj_scan_token(NULL)) return true; + return false; + } + + final private boolean jj_3_446() { Token xsp; xsp = jj_scanpos; - if (jj_3_110()) { + if (jj_3_439()) { jj_scanpos = xsp; - if (jj_3_111()) return true; + if (jj_3_440()) { + jj_scanpos = xsp; + if (jj_3_441()) { + jj_scanpos = xsp; + if (jj_3_442()) { + jj_scanpos = xsp; + if (jj_3_443()) { + jj_scanpos = xsp; + if (jj_3_444()) { + jj_scanpos = xsp; + if (jj_3_445()) return true; + } + } + } + } + } } return false; } - final private boolean jj_3_110() { - if (jj_scan_token(ASC)) return true; + final private boolean jj_3_925() { + if (jj_3R_322()) return true; return false; } - final private boolean jj_3_906() { - if (jj_scan_token(KEY)) return true; - if (jj_3R_319()) return true; + final private boolean jj_3R_130() { + if (jj_3R_85()) return true; + if (jj_3R_123()) return true; return false; } - final private boolean jj_3_908() { - if (jj_scan_token(COMMA)) return true; + final private boolean jj_3_447() { + Token xsp; + if (jj_3_446()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3_446()) { jj_scanpos = xsp; break; } + } return false; } - final private boolean jj_3R_128() { - if (jj_3R_84()) return true; + final private boolean jj_3_924() { + if (jj_3R_321()) return true; + if (jj_scan_token(WRAPPER)) return true; return false; } - final private boolean jj_3_907() { - if (jj_scan_token(VALUE)) return true; + final private boolean jj_3R_215() { + if (jj_3R_214()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_447()) { + jj_scanpos = xsp; + if (jj_3R_419()) return true; + } return false; } - final private boolean jj_3R_402() { - if (jj_scan_token(KEY)) return true; + final private boolean jj_3_919() { + if (jj_scan_token(ARRAY)) return true; return false; } - final private boolean jj_3R_126() { + final private boolean jj_3_923() { + if (jj_3R_319()) return true; return false; } - final private boolean jj_3_107() { - if (jj_3R_124()) return true; + final private boolean jj_3_119() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_130()) return true; return false; } - final private boolean jj_3R_412() { + final private boolean jj_3_917() { + if (jj_scan_token(ARRAY)) return true; return false; } - final private boolean jj_3R_320() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_402()) jj_scanpos = xsp; - if (jj_3R_319()) return true; - xsp = jj_scanpos; - if (jj_3_907()) { - jj_scanpos = xsp; - if (jj_3_908()) { - jj_scanpos = xsp; - if (jj_3_909()) return true; - } - } + final private boolean jj_3R_311() { + if (jj_scan_token(JSON_QUERY)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_109() { + final private boolean jj_3R_131() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_130()) return true; + return false; + } + + final private boolean jj_3_918() { + if (jj_scan_token(UNCONDITIONAL)) return true; + return false; + } + + final private boolean jj_3_916() { + if (jj_scan_token(ARRAY)) return true; + return false; + } + + final private boolean jj_3_922() { + if (jj_scan_token(WITH)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_107()) { - jj_scanpos = xsp; - if (jj_3R_126()) return true; - } - if (jj_3R_127()) return true; - if (jj_scan_token(AS)) return true; - if (jj_3R_79()) return true; + if (jj_3_918()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_919()) jj_scanpos = xsp; return false; } - final private boolean jj_3_108() { - if (jj_3R_125()) return true; + final private boolean jj_3R_216() { + if (jj_scan_token(INFIX_CAST)) return true; + if (jj_3R_123()) return true; return false; } - final private boolean jj_3R_319() { - if (jj_3R_81()) return true; + final private boolean jj_3_921() { + if (jj_scan_token(WITH)) return true; + if (jj_scan_token(CONDITIONAL)) return true; return false; } - final private boolean jj_3_388() { + final private boolean jj_3_403() { if (jj_scan_token(DOT)) return true; - if (jj_3R_207()) return true; + if (jj_3R_211()) return true; return false; } - final private boolean jj_3R_375() { + final private boolean jj_3R_321() { Token xsp; xsp = jj_scanpos; - lookingAhead = true; - jj_semLA = false; - lookingAhead = false; - if (!jj_semLA || jj_3R_412()) return true; - if (jj_scan_token(ZONE)) return true; + if (jj_3_920()) { + jj_scanpos = xsp; + if (jj_3_921()) { + jj_scanpos = xsp; + if (jj_3_922()) return true; + } + } return false; } - final private boolean jj_3R_235() { - if (jj_scan_token(TABLE)) return true; - if (jj_3R_131()) return true; - if (jj_3R_152()) return true; + final private boolean jj_3_920() { + if (jj_scan_token(WITHOUT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_916()) jj_scanpos = xsp; return false; } - final private boolean jj_3R_383() { - if (jj_3R_414()) return true; + final private boolean jj_3R_244() { + if (jj_scan_token(INDEX)) return true; + if (jj_3R_134()) return true; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3R_210() { + final private boolean jj_3_915() { + if (jj_scan_token(ERROR)) return true; + return false; + } + + final private boolean jj_3R_393() { + if (jj_3R_426()) return true; + return false; + } + + final private boolean jj_3_914() { + if (jj_scan_token(EMPTY)) return true; + return false; + } + + final private boolean jj_3R_214() { Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_383()) { jj_scanpos = xsp; break; } + if (jj_3R_393()) { jj_scanpos = xsp; break; } } - if (jj_3R_209()) return true; + if (jj_3R_213()) return true; while (true) { xsp = jj_scanpos; - if (jj_3_388()) { jj_scanpos = xsp; break; } + if (jj_3_403()) { jj_scanpos = xsp; break; } } + if (jj_3R_394()) return true; return false; } - final private boolean jj_3_905() { - if (jj_3R_318()) return true; + final private boolean jj_3R_243() { + if (jj_scan_token(TABLE)) return true; + if (jj_3R_134()) return true; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_106() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_123()) return true; + final private boolean jj_3_913() { + if (jj_scan_token(EMPTY)) return true; + if (jj_scan_token(OBJECT)) return true; return false; } - final private boolean jj_3_904() { - if (jj_3R_317()) return true; - if (jj_scan_token(WRAPPER)) return true; + final private boolean jj_3_402() { + if (jj_3R_85()) return true; + if (jj_scan_token(RBRACKET)) return true; return false; } - final private boolean jj_3R_81() { - if (jj_3R_211()) return true; + final private boolean jj_3_912() { + if (jj_scan_token(EMPTY)) return true; + if (jj_scan_token(ARRAY)) return true; return false; } - final private boolean jj_3_899() { - if (jj_scan_token(ARRAY)) return true; + final private boolean jj_3R_367() { return false; } - final private boolean jj_3R_125() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_123()) return true; + final private boolean jj_3_911() { + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_903() { - if (jj_3R_315()) return true; + final private boolean jj_3R_134() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_118()) { + jj_scanpos = xsp; + if (jj_3R_367()) return true; + } return false; } - final private boolean jj_3_897() { - if (jj_scan_token(ARRAY)) return true; + final private boolean jj_3_118() { + if (jj_scan_token(IF)) return true; + if (jj_scan_token(EXISTS)) return true; return false; } - final private boolean jj_3R_78() { - if (jj_3R_81()) return true; + final private boolean jj_3R_392() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3R_307() { - if (jj_scan_token(JSON_QUERY)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_910() { + if (jj_scan_token(ERROR)) return true; return false; } - final private boolean jj_3_103() { - if (jj_scan_token(CONSTRAINT)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_401() { + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } - final private boolean jj_3_105() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_103()) jj_scanpos = xsp; - if (jj_scan_token(PRIMARY)) return true; - if (jj_scan_token(KEY)) return true; + final private boolean jj_3_400() { + if (jj_3R_139()) return true; return false; } - final private boolean jj_3_898() { - if (jj_scan_token(UNCONDITIONAL)) return true; + final private boolean jj_3R_322() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_910()) { + jj_scanpos = xsp; + if (jj_3_911()) { + jj_scanpos = xsp; + if (jj_3_912()) { + jj_scanpos = xsp; + if (jj_3_913()) return true; + } + } + } + if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3_387() { - if (jj_3R_81()) return true; + final private boolean jj_3_117() { + if (jj_scan_token(INLINE_SIZE)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } - final private boolean jj_3R_250() { + final private boolean jj_3R_209() { + if (jj_scan_token(LBRACKET)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_386()) { + if (jj_3_400()) { jj_scanpos = xsp; - if (jj_3_387()) return true; + if (jj_3_401()) { + jj_scanpos = xsp; + if (jj_3R_392()) return true; + } } return false; } - final private boolean jj_3_102() { - if (jj_scan_token(PRIMARY)) return true; - if (jj_scan_token(KEY)) return true; + final private boolean jj_3_909() { + if (jj_3R_320()) return true; return false; } - final private boolean jj_3_386() { - if (jj_3R_206()) return true; + final private boolean jj_3_116() { + if (jj_scan_token(PARALLEL)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } - final private boolean jj_3_896() { - if (jj_scan_token(ARRAY)) return true; + final private boolean jj_3_115() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_116()) { + jj_scanpos = xsp; + if (jj_3_117()) return true; + } return false; } - final private boolean jj_3_902() { - if (jj_scan_token(WITH)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_898()) jj_scanpos = xsp; - xsp = jj_scanpos; - if (jj_3_899()) jj_scanpos = xsp; + final private boolean jj_3_398() { + if (jj_3R_209()) return true; return false; } - final private boolean jj_3_901() { - if (jj_scan_token(WITH)) return true; - if (jj_scan_token(CONDITIONAL)) return true; + final private boolean jj_3_908() { + if (jj_3R_319()) return true; return false; } - final private boolean jj_3_101() { - if (jj_scan_token(DEFAULT_)) return true; - if (jj_3R_119()) return true; + final private boolean jj_3_114() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_385() { - if (jj_3R_124()) return true; + final private boolean jj_3R_210() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3R_317() { + final private boolean jj_3_397() { + if (jj_scan_token(DOT)) return true; + if (jj_3R_85()) return true; + return false; + } + + final private boolean jj_3_396() { Token xsp; xsp = jj_scanpos; - if (jj_3_900()) { + if (jj_3_397()) { jj_scanpos = xsp; - if (jj_3_901()) { - jj_scanpos = xsp; - if (jj_3_902()) return true; - } + if (jj_3_398()) return true; } return false; } - final private boolean jj_3_900() { - if (jj_scan_token(WITHOUT)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_896()) jj_scanpos = xsp; + final private boolean jj_3R_310() { + if (jj_scan_token(JSON_VALUE)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_205() { - if (jj_3R_84()) return true; + final private boolean jj_3_395() { + if (jj_3R_209()) return true; return false; } - final private boolean jj_3R_123() { + final private boolean jj_3R_240() { + if (jj_scan_token(INDEX)) return true; + if (jj_3R_132()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_104()) { - jj_scanpos = xsp; - if (jj_3_105()) return true; - } + if (jj_3_114()) jj_scanpos = xsp; + if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3_104() { - if (jj_3R_84()) return true; - if (jj_3R_122()) return true; + final private boolean jj_3_399() { + if (jj_scan_token(COLON)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3R_210()) { + jj_scanpos = xsp; + if (jj_scan_token(775)) return true; + } return false; } - final private boolean jj_3_383() { - if (jj_scan_token(RECURSIVE)) return true; + final private boolean jj_3_394() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_895() { + final private boolean jj_3_907() { if (jj_scan_token(ERROR)) return true; return false; } - final private boolean jj_3_384() { + final private boolean jj_3_113() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_205()) return true; + if (jj_3R_129()) return true; return false; } - final private boolean jj_3_894() { + final private boolean jj_3_906() { if (jj_scan_token(EMPTY)) return true; return false; } - final private boolean jj_3R_204() { - if (jj_scan_token(WITH)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_383()) jj_scanpos = xsp; - if (jj_3R_205()) return true; + final private boolean jj_3R_427() { + if (jj_scan_token(COLON)) return true; return false; } - final private boolean jj_3_893() { - if (jj_scan_token(EMPTY)) return true; - if (jj_scan_token(OBJECT)) return true; + final private boolean jj_3_905() { + if (jj_scan_token(DEFAULT_)) return true; + if (jj_3R_79()) return true; return false; } - final private boolean jj_3R_121() { - if (jj_scan_token(INTERVAL)) return true; - if (jj_3R_215()) return true; + final private boolean jj_3R_394() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_427()) jj_scanpos = xsp; return false; } - final private boolean jj_3_892() { - if (jj_scan_token(EMPTY)) return true; - if (jj_scan_token(ARRAY)) return true; + final private boolean jj_3_904() { + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_891() { - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_903() { + if (jj_scan_token(ERROR)) return true; return false; } - final private boolean jj_3_100() { - if (jj_3R_121()) return true; + final private boolean jj_3_111() { + if (jj_scan_token(DESC)) return true; return false; } - final private boolean jj_3_99() { - if (jj_3R_120()) return true; + final private boolean jj_3_112() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_110()) { + jj_scanpos = xsp; + if (jj_3_111()) return true; + } return false; } - final private boolean jj_3_890() { - if (jj_scan_token(ERROR)) return true; + final private boolean jj_3_110() { + if (jj_scan_token(ASC)) return true; return false; } - final private boolean jj_3R_318() { + final private boolean jj_3R_320() { Token xsp; xsp = jj_scanpos; - if (jj_3_890()) { - jj_scanpos = xsp; - if (jj_3_891()) { + if (jj_3_903()) { jj_scanpos = xsp; - if (jj_3_892()) { + if (jj_3_904()) { jj_scanpos = xsp; - if (jj_3_893()) return true; - } + if (jj_3_905()) return true; } } if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3R_122() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_99()) { - jj_scanpos = xsp; - if (jj_3_100()) return true; - } - return false; - } - - final private boolean jj_3R_67() { - if (jj_3R_344()) return true; + final private boolean jj_3R_129() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_98() { - if (jj_3R_84()) return true; + final private boolean jj_3R_82() { + if (jj_3R_215()) return true; return false; } - final private boolean jj_3_97() { - if (jj_3R_119()) return true; + final private boolean jj_3_902() { + if (jj_3R_318()) return true; + if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3_889() { - if (jj_3R_316()) return true; + final private boolean jj_3R_127() { return false; } - final private boolean jj_3R_118() { - if (jj_3R_359()) return true; - if (jj_scan_token(EQ)) return true; + final private boolean jj_3_107() { + if (jj_3R_125()) return true; return false; } - final private boolean jj_3_888() { - if (jj_3R_315()) return true; + final private boolean jj_3R_79() { + if (jj_3R_82()) return true; return false; } - final private boolean jj_3R_306() { - if (jj_scan_token(JSON_VALUE)) return true; + final private boolean jj_3R_309() { + if (jj_scan_token(JSON_EXISTS)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_96() { - if (jj_scan_token(WRAP_VALUE)) return true; - return false; - } - - final private boolean jj_3_95() { - if (jj_scan_token(WRAP_KEY)) return true; + final private boolean jj_3_109() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_107()) { + jj_scanpos = xsp; + if (jj_3R_127()) return true; + } + if (jj_3R_128()) return true; + if (jj_scan_token(AS)) return true; + if (jj_3R_80()) return true; return false; } - final private boolean jj_3_94() { - if (jj_scan_token(ENCRYPTED)) return true; + final private boolean jj_3_108() { + if (jj_3R_126()) return true; return false; } - final private boolean jj_3_93() { - if (jj_scan_token(VALUE_TYPE)) return true; + final private boolean jj_3_393() { + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_92() { - if (jj_scan_token(KEY_TYPE)) return true; + final private boolean jj_3R_254() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_392()) { + jj_scanpos = xsp; + if (jj_3_393()) return true; + } return false; } - final private boolean jj_3_91() { - if (jj_scan_token(DATA_REGION)) return true; + final private boolean jj_3_392() { + if (jj_3R_207()) return true; return false; } - final private boolean jj_3_887() { + final private boolean jj_3_901() { if (jj_scan_token(ERROR)) return true; return false; } - final private boolean jj_3_90() { - if (jj_scan_token(CACHE_NAME)) return true; + final private boolean jj_3_900() { + if (jj_scan_token(UNKNOWN)) return true; return false; } - final private boolean jj_3_89() { - if (jj_scan_token(CACHE_GROUP)) return true; + final private boolean jj_3_899() { + if (jj_scan_token(FALSE)) return true; return false; } - final private boolean jj_3_886() { - if (jj_scan_token(EMPTY)) return true; - return false; + final private boolean jj_3R_318() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_898()) { + jj_scanpos = xsp; + if (jj_3_899()) { + jj_scanpos = xsp; + if (jj_3_900()) { + jj_scanpos = xsp; + if (jj_3_901()) return true; + } + } + } + return false; } - final private boolean jj_3_88() { - if (jj_scan_token(WRITE_SYNCHRONIZATION_MODE)) return true; + final private boolean jj_3_898() { + if (jj_scan_token(TRUE)) return true; return false; } - final private boolean jj_3_87() { - if (jj_scan_token(ATOMICITY)) return true; + final private boolean jj_3R_239() { + if (jj_scan_token(TABLE)) return true; + if (jj_3R_132()) return true; + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_86() { - if (jj_scan_token(AFFINITY_KEY)) return true; + final private boolean jj_3_391() { + if (jj_3R_125()) return true; return false; } - final private boolean jj_3_85() { - if (jj_scan_token(BACKUPS)) return true; + final private boolean jj_3R_208() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_885() { - if (jj_scan_token(DEFAULT_)) return true; - if (jj_3R_78()) return true; + final private boolean jj_3_896() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3R_359() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_84()) { - jj_scanpos = xsp; - if (jj_3_85()) { - jj_scanpos = xsp; - if (jj_3_86()) { - jj_scanpos = xsp; - if (jj_3_87()) { - jj_scanpos = xsp; - if (jj_3_88()) { - jj_scanpos = xsp; - if (jj_3_89()) { - jj_scanpos = xsp; - if (jj_3_90()) { - jj_scanpos = xsp; - if (jj_3_91()) { - jj_scanpos = xsp; - if (jj_3_92()) { - jj_scanpos = xsp; - if (jj_3_93()) { - jj_scanpos = xsp; - if (jj_3_94()) { - jj_scanpos = xsp; - if (jj_3_95()) { - jj_scanpos = xsp; - if (jj_3_96()) return true; - } - } - } - } - } - } - } - } - } - } - } - } + final private boolean jj_3_389() { + if (jj_scan_token(RECURSIVE)) return true; return false; } - final private boolean jj_3_84() { - if (jj_scan_token(TEMPLATE)) return true; + final private boolean jj_3_106() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_124()) return true; return false; } - final private boolean jj_3_80() { + final private boolean jj_3_390() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_118()) return true; + if (jj_3R_208()) return true; return false; } - final private boolean jj_3_884() { - if (jj_scan_token(NULL)) return true; + final private boolean jj_3R_206() { + if (jj_scan_token(WITH)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_389()) jj_scanpos = xsp; + if (jj_3R_208()) return true; return false; } - final private boolean jj_3_382() { - if (jj_3R_67()) return true; + final private boolean jj_3R_126() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_124()) return true; return false; } - final private boolean jj_3_381() { - if (jj_3R_204()) return true; + final private boolean jj_3_897() { + if (jj_scan_token(PASSING)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_883() { - if (jj_scan_token(ERROR)) return true; + final private boolean jj_3_103() { + if (jj_scan_token(CONSTRAINT)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3R_68() { + final private boolean jj_3_105() { Token xsp; xsp = jj_scanpos; - if (jj_3_381()) jj_scanpos = xsp; - if (jj_3R_206()) return true; + if (jj_3_103()) jj_scanpos = xsp; + if (jj_scan_token(PRIMARY)) return true; + if (jj_scan_token(KEY)) return true; return false; } - final private boolean jj_3_82() { - if (jj_3R_118()) return true; + final private boolean jj_3_102() { + if (jj_scan_token(PRIMARY)) return true; + if (jj_scan_token(KEY)) return true; return false; } - final private boolean jj_3R_316() { + final private boolean jj_3R_68() { + if (jj_3R_348()) return true; + return false; + } + + final private boolean jj_3_895() { + if (jj_scan_token(FORMAT)) return true; + if (jj_3R_317()) return true; + return false; + } + + final private boolean jj_3_101() { + if (jj_scan_token(DEFAULT_)) return true; + if (jj_3R_120()) return true; + return false; + } + + final private boolean jj_3R_124() { Token xsp; xsp = jj_scanpos; - if (jj_3_883()) { - jj_scanpos = xsp; - if (jj_3_884()) { + if (jj_3_104()) { jj_scanpos = xsp; - if (jj_3_885()) return true; - } + if (jj_3_105()) return true; } - if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3_81() { - if (jj_scan_token(QUOTED_IDENTIFIER)) return true; + final private boolean jj_3_104() { + if (jj_3R_85()) return true; + if (jj_3R_123()) return true; return false; } - final private boolean jj_3_380() { - if (jj_3R_67()) return true; + final private boolean jj_3R_319() { + if (jj_scan_token(RETURNING)) return true; + if (jj_3R_121()) return true; return false; } - final private boolean jj_3_379() { - if (jj_3R_204()) return true; + final private boolean jj_3R_122() { + if (jj_scan_token(INTERVAL)) return true; + if (jj_3R_219()) return true; return false; } - final private boolean jj_3R_347() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_379()) jj_scanpos = xsp; - if (jj_3R_250()) return true; - while (true) { - xsp = jj_scanpos; - if (jj_3_380()) { jj_scanpos = xsp; break; } - } + final private boolean jj_3_893() { + if (jj_scan_token(UTF32)) return true; return false; } - final private boolean jj_3_882() { - if (jj_3R_314()) return true; - if (jj_scan_token(ON)) return true; + final private boolean jj_3_892() { + if (jj_scan_token(UTF16)) return true; return false; } - final private boolean jj_3_83() { - if (jj_scan_token(WITH)) return true; + final private boolean jj_3_891() { + if (jj_scan_token(UTF8)) return true; + return false; + } + + final private boolean jj_3_100() { + if (jj_3R_122()) return true; + return false; + } + + final private boolean jj_3_99() { + if (jj_3R_121()) return true; + return false; + } + + final private boolean jj_3_894() { + if (jj_scan_token(ENCODING)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_81()) { + if (jj_3_891()) { jj_scanpos = xsp; - if (jj_3_82()) return true; + if (jj_3_892()) { + jj_scanpos = xsp; + if (jj_3_893()) return true; + } } return false; } - final private boolean jj_3R_127() { + final private boolean jj_3R_123() { Token xsp; xsp = jj_scanpos; - if (jj_3_83()) jj_scanpos = xsp; + if (jj_3_99()) { + jj_scanpos = xsp; + if (jj_3_100()) return true; + } return false; } - final private boolean jj_3R_305() { - if (jj_scan_token(JSON_EXISTS)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3R_317() { + if (jj_scan_token(JSON)) return true; return false; } - final private boolean jj_3R_362() { + final private boolean jj_3_388() { + if (jj_3R_68()) return true; return false; } - final private boolean jj_3R_131() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_79()) { - jj_scanpos = xsp; - if (jj_3R_362()) return true; - } + final private boolean jj_3_387() { + if (jj_3R_207()) return true; return false; } - final private boolean jj_3_79() { - if (jj_scan_token(IF)) return true; - if (jj_scan_token(NOT)) return true; + final private boolean jj_3_386() { + if (jj_3R_206()) return true; return false; } - final private boolean jj_3_881() { - if (jj_scan_token(ERROR)) return true; + final private boolean jj_3_890() { + if (jj_3R_316()) return true; return false; } - final private boolean jj_3_880() { - if (jj_scan_token(UNKNOWN)) return true; + final private boolean jj_3_98() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_879() { - if (jj_scan_token(FALSE)) return true; + final private boolean jj_3_889() { + if (jj_3R_315()) return true; return false; } - final private boolean jj_3R_314() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_878()) { - jj_scanpos = xsp; - if (jj_3_879()) { - jj_scanpos = xsp; - if (jj_3_880()) { - jj_scanpos = xsp; - if (jj_3_881()) return true; - } - } - } + final private boolean jj_3_97() { + if (jj_3R_120()) return true; return false; } - final private boolean jj_3_878() { - if (jj_scan_token(TRUE)) return true; + final private boolean jj_3_888() { + if (jj_3R_314()) return true; return false; } - final private boolean jj_3_876() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_81()) return true; + final private boolean jj_3R_69() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_386()) { + jj_scanpos = xsp; + if (jj_3_387()) return true; + } return false; } - final private boolean jj_3_78() { - if (jj_3R_117()) return true; + final private boolean jj_3_887() { + if (jj_3R_313()) return true; return false; } - final private boolean jj_3_77() { - if (jj_3R_116()) return true; + final private boolean jj_3_886() { + if (jj_3R_312()) return true; return false; } - final private boolean jj_3_76() { - if (jj_3R_115()) return true; + final private boolean jj_3R_119() { + if (jj_3R_363()) return true; + if (jj_scan_token(EQ)) return true; return false; } - final private boolean jj_3_75() { - if (jj_3R_114()) return true; + final private boolean jj_3_885() { + if (jj_3R_311()) return true; return false; } - final private boolean jj_3_74() { - if (jj_3R_113()) return true; + final private boolean jj_3_884() { + if (jj_3R_310()) return true; return false; } - final private boolean jj_3_877() { - if (jj_scan_token(PASSING)) return true; - if (jj_3R_81()) return true; + final private boolean jj_3_385() { + if (jj_3R_68()) return true; return false; } - final private boolean jj_3_73() { - if (jj_3R_112()) return true; + final private boolean jj_3_883() { + if (jj_3R_309()) return true; return false; } - final private boolean jj_3R_203() { - if (jj_3R_84()) return true; + final private boolean jj_3_384() { + if (jj_3R_206()) return true; return false; } - final private boolean jj_3_72() { - if (jj_3R_111()) return true; + final private boolean jj_3_882() { + if (jj_3R_308()) return true; return false; } - final private boolean jj_3_71() { - if (jj_3R_79()) return true; + final private boolean jj_3R_351() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_384()) jj_scanpos = xsp; + if (jj_3R_254()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3_385()) { jj_scanpos = xsp; break; } + } return false; } - final private boolean jj_3_70() { - if (jj_3R_110()) return true; + final private boolean jj_3_881() { + if (jj_3R_307()) return true; return false; } - final private boolean jj_3_69() { - if (jj_3R_109()) return true; + final private boolean jj_3_96() { + if (jj_scan_token(WRAP_VALUE)) return true; return false; } - final private boolean jj_3_68() { - if (jj_3R_108()) return true; + final private boolean jj_3_880() { + if (jj_3R_306()) return true; return false; } - final private boolean jj_3_67() { - if (jj_3R_107()) return true; + final private boolean jj_3_95() { + if (jj_scan_token(WRAP_KEY)) return true; return false; } - final private boolean jj_3_66() { - if (jj_3R_106()) return true; + final private boolean jj_3_879() { + if (jj_3R_305()) return true; return false; } - final private boolean jj_3_378() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_203()) return true; + final private boolean jj_3_94() { + if (jj_scan_token(ENCRYPTED)) return true; return false; } - final private boolean jj_3_65() { - if (jj_3R_105()) return true; + final private boolean jj_3_878() { + if (jj_3R_304()) return true; return false; } - final private boolean jj_3_64() { - if (jj_3R_104()) return true; + final private boolean jj_3_93() { + if (jj_scan_token(VALUE_TYPE)) return true; return false; } - final private boolean jj_3_63() { - if (jj_3R_103()) return true; + final private boolean jj_3_877() { + if (jj_3R_303()) return true; return false; } - final private boolean jj_3_62() { - if (jj_3R_102()) return true; + final private boolean jj_3_92() { + if (jj_scan_token(KEY_TYPE)) return true; return false; } - final private boolean jj_3_61() { - if (jj_3R_101()) return true; + final private boolean jj_3_876() { + if (jj_3R_302()) return true; return false; } - final private boolean jj_3_60() { - if (jj_3R_100()) return true; + final private boolean jj_3_91() { + if (jj_scan_token(DATA_REGION)) return true; return false; } final private boolean jj_3_875() { - if (jj_scan_token(FORMAT)) return true; - if (jj_3R_313()) return true; + if (jj_3R_301()) return true; return false; } - final private boolean jj_3_59() { - if (jj_3R_99()) return true; + final private boolean jj_3_90() { + if (jj_scan_token(CACHE_NAME)) return true; return false; } - final private boolean jj_3_58() { - if (jj_3R_98()) return true; + final private boolean jj_3_874() { + if (jj_3R_300()) return true; return false; } - final private boolean jj_3_57() { - if (jj_3R_97()) return true; + final private boolean jj_3_89() { + if (jj_scan_token(CACHE_GROUP)) return true; return false; } - final private boolean jj_3_56() { - if (jj_3R_96()) return true; + final private boolean jj_3_873() { + if (jj_3R_299()) return true; return false; } - final private boolean jj_3_55() { - if (jj_3R_95()) return true; + final private boolean jj_3_88() { + if (jj_scan_token(WRITE_SYNCHRONIZATION_MODE)) return true; return false; } - final private boolean jj_3_54() { - if (jj_3R_94()) return true; + final private boolean jj_3_872() { + if (jj_3R_298()) return true; return false; } - final private boolean jj_3R_202() { - if (jj_3R_84()) return true; + final private boolean jj_3_87() { + if (jj_scan_token(ATOMICITY)) return true; return false; } - final private boolean jj_3R_315() { - if (jj_scan_token(RETURNING)) return true; - if (jj_3R_120()) return true; + final private boolean jj_3_871() { + if (jj_3R_297()) return true; return false; } - final private boolean jj_3_53() { - if (jj_3R_93()) return true; + final private boolean jj_3_86() { + if (jj_scan_token(AFFINITY_KEY)) return true; return false; } - final private boolean jj_3_52() { - if (jj_3R_92()) return true; + final private boolean jj_3_870() { + if (jj_3R_296()) return true; return false; } - final private boolean jj_3R_91() { + final private boolean jj_3_85() { + if (jj_scan_token(BACKUPS)) return true; + return false; + } + + final private boolean jj_3R_363() { Token xsp; xsp = jj_scanpos; - if (jj_3_52()) { - jj_scanpos = xsp; - if (jj_3_53()) { - jj_scanpos = xsp; - if (jj_3_54()) { - jj_scanpos = xsp; - if (jj_3_55()) { - jj_scanpos = xsp; - if (jj_3_56()) { - jj_scanpos = xsp; - if (jj_3_57()) { - jj_scanpos = xsp; - if (jj_3_58()) { - jj_scanpos = xsp; - if (jj_3_59()) { - jj_scanpos = xsp; - if (jj_3_60()) { - jj_scanpos = xsp; - if (jj_3_61()) { - jj_scanpos = xsp; - if (jj_3_62()) { - jj_scanpos = xsp; - if (jj_3_63()) { - jj_scanpos = xsp; - if (jj_3_64()) { - jj_scanpos = xsp; - if (jj_3_65()) { - jj_scanpos = xsp; - if (jj_3_66()) { + if (jj_3_84()) { jj_scanpos = xsp; - if (jj_3_67()) { + if (jj_3_85()) { jj_scanpos = xsp; - if (jj_3_68()) { + if (jj_3_86()) { jj_scanpos = xsp; - if (jj_3_69()) { + if (jj_3_87()) { jj_scanpos = xsp; - if (jj_3_70()) { + if (jj_3_88()) { jj_scanpos = xsp; - if (jj_3_71()) { + if (jj_3_89()) { jj_scanpos = xsp; - if (jj_3_72()) { + if (jj_3_90()) { jj_scanpos = xsp; - if (jj_3_73()) { + if (jj_3_91()) { jj_scanpos = xsp; - if (jj_3_74()) { + if (jj_3_92()) { jj_scanpos = xsp; - if (jj_3_75()) { + if (jj_3_93()) { jj_scanpos = xsp; - if (jj_3_76()) { + if (jj_3_94()) { jj_scanpos = xsp; - if (jj_3_77()) { + if (jj_3_95()) { jj_scanpos = xsp; - if (jj_3_78()) return true; - } - } - } - } - } - } - } - } - } - } - } - } - } - } + if (jj_3_96()) return true; } } } @@ -31165,2430 +31045,2284 @@ final private boolean jj_3R_91() { return false; } - final private boolean jj_3_377() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_202()) return true; + final private boolean jj_3_84() { + if (jj_scan_token(TEMPLATE)) return true; return false; } - final private boolean jj_3R_194() { - if (jj_3R_202()) return true; + final private boolean jj_3_857() { + if (jj_scan_token(FROM)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_873() { - if (jj_scan_token(UTF32)) return true; + final private boolean jj_3_80() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_119()) return true; return false; } - final private boolean jj_3_872() { - if (jj_scan_token(UTF16)) return true; + final private boolean jj_3_82() { + if (jj_3R_119()) return true; return false; } - final private boolean jj_3_50() { - if (jj_3R_91()) return true; + final private boolean jj_3_856() { + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_871() { - if (jj_scan_token(UTF8)) return true; + final private boolean jj_3_859() { + if (jj_3R_82()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_857()) jj_scanpos = xsp; return false; } - final private boolean jj_3_372() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_201()) return true; + final private boolean jj_3_855() { + if (jj_scan_token(LEADING)) return true; return false; } - final private boolean jj_3_49() { - if (jj_scan_token(SEMICOLON)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_50()) jj_scanpos = xsp; + final private boolean jj_3_81() { + if (jj_scan_token(QUOTED_IDENTIFIER)) return true; return false; } - final private boolean jj_3_874() { - if (jj_scan_token(ENCODING)) return true; + final private boolean jj_3_854() { + if (jj_scan_token(TRAILING)) return true; + return false; + } + + final private boolean jj_3_83() { + if (jj_scan_token(WITH)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_871()) { - jj_scanpos = xsp; - if (jj_3_872()) { + if (jj_3_81()) { jj_scanpos = xsp; - if (jj_3_873()) return true; - } + if (jj_3_82()) return true; } return false; } - final private boolean jj_3_376() { - if (jj_scan_token(PERMUTE)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_853() { + if (jj_scan_token(BOTH)) return true; return false; } - final private boolean jj_3R_313() { - if (jj_scan_token(JSON)) return true; + final private boolean jj_3R_205() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_51() { - if (jj_3R_91()) return true; + final private boolean jj_3R_128() { Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_49()) { jj_scanpos = xsp; break; } - } + xsp = jj_scanpos; + if (jj_3_83()) jj_scanpos = xsp; return false; } - final private boolean jj_3_375() { - if (jj_scan_token(LBRACE)) return true; - if (jj_scan_token(MINUS)) return true; + final private boolean jj_3_858() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_853()) { + jj_scanpos = xsp; + if (jj_3_854()) { + jj_scanpos = xsp; + if (jj_3_855()) return true; + } + } + xsp = jj_scanpos; + if (jj_3_856()) jj_scanpos = xsp; + if (jj_scan_token(FROM)) return true; return false; } - final private boolean jj_3_870() { - if (jj_3R_312()) return true; + final private boolean jj_3R_366() { return false; } - final private boolean jj_3_374() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_201()) return true; + final private boolean jj_3_1829() { + if (jj_scan_token(FRIDAY)) return true; return false; } - final private boolean jj_3_869() { - if (jj_3R_311()) return true; + final private boolean jj_3_1828() { + if (jj_scan_token(TUESDAY)) return true; return false; } - final private boolean jj_3R_380() { + final private boolean jj_3R_132() { Token xsp; xsp = jj_scanpos; - if (jj_3_373()) { - jj_scanpos = xsp; - if (jj_3_374()) { - jj_scanpos = xsp; - if (jj_3_375()) { + if (jj_3_79()) { jj_scanpos = xsp; - if (jj_3_376()) return true; - } - } + if (jj_3R_366()) return true; } return false; } - final private boolean jj_3_373() { - if (jj_3R_84()) return true; - return false; - } - - final private boolean jj_3_868() { - if (jj_3R_310()) return true; - return false; - } - - final private boolean jj_3_867() { - if (jj_3R_309()) return true; + final private boolean jj_3_1827() { + if (jj_scan_token(WITHOUT)) return true; return false; } - final private boolean jj_3R_90() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_79() { + if (jj_scan_token(IF)) return true; + if (jj_scan_token(NOT)) return true; return false; } - final private boolean jj_3_866() { - if (jj_3R_308()) return true; + final private boolean jj_3_383() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_205()) return true; return false; } - final private boolean jj_3_865() { - if (jj_3R_307()) return true; + final private boolean jj_3_1826() { + if (jj_scan_token(WIDTH_BUCKET)) return true; return false; } - final private boolean jj_3_864() { - if (jj_3R_306()) return true; + final private boolean jj_3_1825() { + if (jj_scan_token(VAR_SAMP)) return true; return false; } - final private boolean jj_3_863() { - if (jj_3R_305()) return true; + final private boolean jj_3_851() { + if (jj_scan_token(COMMA)) return true; return false; } - final private boolean jj_3R_382() { + final private boolean jj_3_1824() { + if (jj_scan_token(VARCHAR)) return true; return false; } - final private boolean jj_3_862() { - if (jj_3R_304()) return true; + final private boolean jj_3_1823() { + if (jj_scan_token(VALUE_OF)) return true; return false; } - final private boolean jj_3_861() { - if (jj_3R_303()) return true; + final private boolean jj_3_1822() { + if (jj_scan_token(UPSERT)) return true; return false; } - final private boolean jj_3_371() { - if (jj_scan_token(HOOK)) return true; + final private boolean jj_3_1821() { + if (jj_scan_token(UNKNOWN)) return true; return false; } - final private boolean jj_3_860() { - if (jj_3R_302()) return true; + final private boolean jj_3_1820() { + if (jj_scan_token(TRY_CAST)) return true; return false; } - final private boolean jj_3_859() { - if (jj_3R_301()) return true; + final private boolean jj_3_849() { + if (jj_scan_token(COMMA)) return true; return false; } - final private boolean jj_3_858() { - if (jj_3R_300()) return true; + final private boolean jj_3_869() { + if (jj_scan_token(TRIM)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_366() { - if (jj_scan_token(MINUS)) return true; - if (jj_3R_201()) return true; + final private boolean jj_3_1819() { + if (jj_scan_token(TRIM)) return true; return false; } - final private boolean jj_3_857() { - if (jj_3R_299()) return true; + final private boolean jj_3_1818() { + if (jj_scan_token(TRANSLATION)) return true; return false; } - final private boolean jj_3_856() { - if (jj_3R_298()) return true; + final private boolean jj_3_1817() { + if (jj_scan_token(TINYINT)) return true; return false; } - final private boolean jj_3R_200() { + final private boolean jj_3_850() { + if (jj_scan_token(FOR)) return true; return false; } - final private boolean jj_3R_199() { + final private boolean jj_3_1816() { + if (jj_scan_token(TIMESTAMP)) return true; return false; } - final private boolean jj_3_365() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_198()) return true; + final private boolean jj_3_852() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_850()) { + jj_scanpos = xsp; + if (jj_3_851()) return true; + } + if (jj_3R_79()) return true; return false; } - final private boolean jj_3_855() { - if (jj_3R_297()) return true; + final private boolean jj_3_1815() { + if (jj_scan_token(SYSTEM_USER)) return true; return false; } - final private boolean jj_3R_80() { - if (jj_scan_token(DEFAULT_)) return true; + final private boolean jj_3_1814() { + if (jj_scan_token(SUM)) return true; return false; } - final private boolean jj_3_362() { - if (jj_3R_198()) return true; + final private boolean jj_3_1813() { + if (jj_scan_token(SUBSTRING)) return true; return false; } - final private boolean jj_3_854() { - if (jj_3R_296()) return true; + final private boolean jj_3_1812() { + if (jj_scan_token(STREAM)) return true; return false; } - final private boolean jj_3R_89() { - if (jj_3R_134()) return true; + final private boolean jj_3_847() { + if (jj_scan_token(CEILING)) return true; return false; } - final private boolean jj_3_853() { - if (jj_3R_295()) return true; + final private boolean jj_3_1811() { + if (jj_scan_token(STATIC)) return true; return false; } - final private boolean jj_3_46() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_89()) { - jj_scanpos = xsp; - if (jj_3R_90()) return true; - } - if (jj_scan_token(LAMBDA)) return true; + final private boolean jj_3_848() { + if (jj_scan_token(FROM)) return true; return false; } - final private boolean jj_3_852() { - if (jj_3R_294()) return true; + final private boolean jj_3_1810() { + if (jj_scan_token(SQLWARNING)) return true; return false; } - final private boolean jj_3R_86() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_1809() { + if (jj_scan_token(SQL)) return true; return false; } - final private boolean jj_3_363() { - if (jj_scan_token(COMMA)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_362()) { - jj_scanpos = xsp; - if (jj_3R_199()) return true; - } + final private boolean jj_3_1808() { + if (jj_scan_token(SMALLINT)) return true; return false; } - final private boolean jj_3_851() { - if (jj_3R_293()) return true; + final private boolean jj_3_1807() { + if (jj_scan_token(SHOW)) return true; return false; } - final private boolean jj_3_48() { - if (jj_3R_87()) return true; + final private boolean jj_3_1806() { + if (jj_scan_token(SEEK)) return true; return false; } - final private boolean jj_3_850() { - if (jj_3R_292()) return true; + final private boolean jj_3_868() { + if (jj_scan_token(SUBSTRING)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_47() { - if (jj_3R_81()) return true; + final private boolean jj_3_1805() { + if (jj_scan_token(SCROLL)) return true; return false; } - final private boolean jj_3_364() { - if (jj_3R_198()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_363()) { - jj_scanpos = xsp; - if (jj_3R_200()) return true; - } - if (jj_scan_token(RBRACE)) return true; + final private boolean jj_3_78() { + if (jj_3R_118()) return true; return false; } - final private boolean jj_3_837() { - if (jj_scan_token(FROM)) return true; - if (jj_3R_81()) return true; + final private boolean jj_3_1804() { + if (jj_scan_token(SAFE_ORDINAL)) return true; return false; } - final private boolean jj_3R_350() { - if (jj_3R_408()) return true; + final private boolean jj_3_1803() { + if (jj_scan_token(RUNNING)) return true; return false; } - final private boolean jj_3_45() { - if (jj_3R_80()) return true; + final private boolean jj_3_77() { + if (jj_3R_117()) return true; return false; } - final private boolean jj_3_370() { - if (jj_scan_token(LBRACE)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_364()) { - jj_scanpos = xsp; - if (jj_3_365()) { - jj_scanpos = xsp; - if (jj_3_366()) return true; - } - } + final private boolean jj_3_846() { + if (jj_scan_token(CEIL)) return true; return false; } - final private boolean jj_3R_349() { + final private boolean jj_3R_204() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_44() { - if (jj_3R_84()) return true; - if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true; + final private boolean jj_3_1802() { + if (jj_scan_token(ROLLUP)) return true; return false; } - final private boolean jj_3_369() { - if (jj_scan_token(HOOK)) return true; + final private boolean jj_3_1801() { + if (jj_scan_token(RETURNS)) return true; return false; } - final private boolean jj_3_836() { - if (jj_3R_81()) return true; + final private boolean jj_3_76() { + if (jj_3R_116()) return true; return false; } - final private boolean jj_3_839() { - if (jj_3R_81()) return true; + final private boolean jj_3_867() { Token xsp; xsp = jj_scanpos; - if (jj_3_837()) jj_scanpos = xsp; + if (jj_3_846()) { + jj_scanpos = xsp; + if (jj_3_847()) return true; + } + if (jj_3R_295()) return true; return false; } - final private boolean jj_3R_83() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_44()) { - jj_scanpos = xsp; - if (jj_3R_349()) return true; - } - xsp = jj_scanpos; - if (jj_3_45()) { - jj_scanpos = xsp; - if (jj_3R_350()) { - jj_scanpos = xsp; - if (jj_3_47()) { - jj_scanpos = xsp; - if (jj_3_48()) return true; - } - } - } + final private boolean jj_3_1800() { + if (jj_scan_token(RESET)) return true; return false; } - final private boolean jj_3_835() { - if (jj_scan_token(LEADING)) return true; + final private boolean jj_3_1799() { + if (jj_scan_token(REGR_SXY)) return true; return false; } - final private boolean jj_3_368() { - if (jj_scan_token(PLUS)) return true; + final private boolean jj_3_75() { + if (jj_3R_115()) return true; return false; } - final private boolean jj_3_834() { - if (jj_scan_token(TRAILING)) return true; + final private boolean jj_3_1798() { + if (jj_scan_token(REGR_R2)) return true; return false; } - final private boolean jj_3R_85() { - if (jj_3R_134()) return true; + final private boolean jj_3_1797() { + if (jj_scan_token(REGR_AVGY)) return true; return false; } - final private boolean jj_3_367() { - if (jj_scan_token(STAR)) return true; + final private boolean jj_3_74() { + if (jj_3R_114()) return true; return false; } - final private boolean jj_3_41() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_85()) { - jj_scanpos = xsp; - if (jj_3R_86()) return true; - } - if (jj_scan_token(LAMBDA)) return true; + final private boolean jj_3_1796() { + if (jj_scan_token(REFERENCES)) return true; return false; } - final private boolean jj_3_833() { - if (jj_scan_token(BOTH)) return true; + final private boolean jj_3_866() { + if (jj_scan_token(FLOOR)) return true; + if (jj_3R_295()) return true; return false; } - final private boolean jj_3_43() { - if (jj_3R_88()) return true; + final private boolean jj_3_1795() { + if (jj_scan_token(REAL)) return true; return false; } - final private boolean jj_3R_381() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_367()) { - jj_scanpos = xsp; - if (jj_3_368()) { - jj_scanpos = xsp; - if (jj_3_369()) { - jj_scanpos = xsp; - if (jj_3_370()) return true; - } - } - } + final private boolean jj_3_73() { + if (jj_3R_113()) return true; return false; } - final private boolean jj_3_42() { - if (jj_3R_87()) return true; + final private boolean jj_3_1794() { + if (jj_scan_token(RANGE)) return true; return false; } - final private boolean jj_3R_367() { - if (jj_3R_408()) return true; + final private boolean jj_3_382() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_204()) return true; return false; } - final private boolean jj_3R_197() { - if (jj_3R_380()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3R_381()) { - jj_scanpos = xsp; - if (jj_3R_382()) return true; - } + final private boolean jj_3_1793() { + if (jj_scan_token(PREV)) return true; return false; } - final private boolean jj_3_40() { - if (jj_3R_80()) return true; + final private boolean jj_3_72() { + if (jj_3R_112()) return true; return false; } - final private boolean jj_3_838() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_833()) { - jj_scanpos = xsp; - if (jj_3_834()) { - jj_scanpos = xsp; - if (jj_3_835()) return true; - } - } - xsp = jj_scanpos; - if (jj_3_836()) jj_scanpos = xsp; - if (jj_scan_token(FROM)) return true; + final private boolean jj_3_845() { + if (jj_scan_token(FOR)) return true; + if (jj_3R_79()) return true; return false; } - final private boolean jj_3R_366() { + final private boolean jj_3_1792() { + if (jj_scan_token(PRECEDES)) return true; return false; } - final private boolean jj_3_39() { - if (jj_3R_84()) return true; - if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true; + final private boolean jj_3R_196() { + if (jj_3R_204()) return true; return false; } - final private boolean jj_3_831() { - if (jj_scan_token(COMMA)) return true; + final private boolean jj_3_1791() { + if (jj_scan_token(POSITION)) return true; return false; } - final private boolean jj_3_1805() { - if (jj_scan_token(SATURDAY)) return true; + final private boolean jj_3_71() { + if (jj_3R_80()) return true; return false; } - final private boolean jj_3R_154() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_39()) { - jj_scanpos = xsp; - if (jj_3R_366()) return true; - } - xsp = jj_scanpos; - if (jj_3_40()) { - jj_scanpos = xsp; - if (jj_3R_367()) { - jj_scanpos = xsp; - if (jj_3_42()) { - jj_scanpos = xsp; - if (jj_3_43()) return true; - } - } - } + final private boolean jj_3_1790() { + if (jj_scan_token(PERIOD)) return true; return false; } - final private boolean jj_3_1804() { - if (jj_scan_token(WEDNESDAY)) return true; + final private boolean jj_3_1789() { + if (jj_scan_token(PERCENTILE_CONT)) return true; return false; } - final private boolean jj_3_1803() { - if (jj_scan_token(YEAR)) return true; + final private boolean jj_3_70() { + if (jj_3R_111()) return true; return false; } - final private boolean jj_3_1802() { - if (jj_scan_token(WINDOW)) return true; + final private boolean jj_3_1788() { + if (jj_scan_token(PATTERN)) return true; return false; } - final private boolean jj_3_1801() { - if (jj_scan_token(VERSIONING)) return true; + final private boolean jj_3_1787() { + if (jj_scan_token(OVERLAPS)) return true; return false; } - final private boolean jj_3_829() { - if (jj_scan_token(COMMA)) return true; + final private boolean jj_3_69() { + if (jj_3R_110()) return true; return false; } - final private boolean jj_3_849() { - if (jj_scan_token(TRIM)) return true; + final private boolean jj_3_865() { + if (jj_scan_token(OVERLAY)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_1800() { - if (jj_scan_token(VARYING)) return true; + final private boolean jj_3_1786() { + if (jj_scan_token(ORDINAL)) return true; return false; } - final private boolean jj_3_1799() { - if (jj_scan_token(VARBINARY)) return true; + final private boolean jj_3_842() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_79()) return true; return false; } - final private boolean jj_3_361() { - if (jj_3R_197()) return true; + final private boolean jj_3_1785() { + if (jj_scan_token(ONE)) return true; return false; } - final private boolean jj_3_1798() { - if (jj_scan_token(UUID)) return true; + final private boolean jj_3_68() { + if (jj_3R_109()) return true; return false; } - final private boolean jj_3_830() { - if (jj_scan_token(FOR)) return true; + final private boolean jj_3_1784() { + if (jj_scan_token(OF)) return true; return false; } - final private boolean jj_3_1797() { - if (jj_scan_token(UNKNOWN)) return true; + final private boolean jj_3_377() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_203()) return true; return false; } - final private boolean jj_3_832() { + final private boolean jj_3_844() { Token xsp; - xsp = jj_scanpos; - if (jj_3_830()) { - jj_scanpos = xsp; - if (jj_3_831()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3_842()) { jj_scanpos = xsp; break; } } - if (jj_3R_78()) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_1796() { - if (jj_scan_token(TRY_CAST)) return true; + final private boolean jj_3_1783() { + if (jj_scan_token(NUMERIC)) return true; return false; } - final private boolean jj_3_1795() { - if (jj_scan_token(TRIM)) return true; + final private boolean jj_3_67() { + if (jj_3R_108()) return true; return false; } - final private boolean jj_3_1794() { - if (jj_scan_token(TRANSLATION)) return true; + final private boolean jj_3_1782() { + if (jj_scan_token(NTH_VALUE)) return true; return false; } - final private boolean jj_3R_196() { - if (jj_3R_197()) return true; + final private boolean jj_3_1781() { + if (jj_scan_token(NO)) return true; return false; } - final private boolean jj_3_1793() { - if (jj_scan_token(TINYINT)) return true; + final private boolean jj_3_66() { + if (jj_3R_107()) return true; return false; } - final private boolean jj_3_827() { - if (jj_scan_token(CEILING)) return true; + final private boolean jj_3_1780() { + if (jj_scan_token(NCLOB)) return true; return false; } - final private boolean jj_3_1792() { - if (jj_scan_token(TIMESTAMP)) return true; + final private boolean jj_3_1779() { + if (jj_scan_token(MULTISET)) return true; return false; } - final private boolean jj_3_828() { - if (jj_scan_token(FROM)) return true; + final private boolean jj_3_65() { + if (jj_3R_106()) return true; return false; } - final private boolean jj_3_1791() { - if (jj_scan_token(SYSTEM_USER)) return true; + final private boolean jj_3_1778() { + if (jj_scan_token(MODIFIES)) return true; return false; } - final private boolean jj_3_1790() { - if (jj_scan_token(SUM)) return true; + final private boolean jj_3_843() { + if (jj_scan_token(USING)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_1789() { - if (jj_scan_token(SUBSTRING)) return true; + final private boolean jj_3_1777() { + if (jj_scan_token(MIN)) return true; return false; } - final private boolean jj_3_1788() { - if (jj_scan_token(STREAM)) return true; - return false; - } - - final private boolean jj_3_1787() { - if (jj_scan_token(STATIC)) return true; - return false; - } - - final private boolean jj_3_848() { - if (jj_scan_token(SUBSTRING)) return true; - if (jj_scan_token(LPAREN)) return true; - return false; - } - - final private boolean jj_3_1786() { - if (jj_scan_token(SQLWARNING)) return true; - return false; - } - - final private boolean jj_3_1785() { - if (jj_scan_token(SQL)) return true; - return false; - } - - final private boolean jj_3_1784() { - if (jj_scan_token(SMALLINT)) return true; - return false; - } - - final private boolean jj_3_826() { - if (jj_scan_token(CEIL)) return true; - return false; - } - - final private boolean jj_3_1783() { - if (jj_scan_token(SHOW)) return true; - return false; - } - - final private boolean jj_3_1782() { - if (jj_scan_token(SEEK)) return true; - return false; - } - - final private boolean jj_3_847() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_826()) { - jj_scanpos = xsp; - if (jj_3_827()) return true; - } - if (jj_3R_291()) return true; + final private boolean jj_3_64() { + if (jj_3R_105()) return true; return false; } - final private boolean jj_3_1781() { - if (jj_scan_token(SCROLL)) return true; + final private boolean jj_3_1776() { + if (jj_scan_token(MEASURES)) return true; return false; } - final private boolean jj_3_1780() { - if (jj_scan_token(SAFE_ORDINAL)) return true; + final private boolean jj_3_1775() { + if (jj_scan_token(MATCH_RECOGNIZE)) return true; return false; } - final private boolean jj_3_360() { - if (jj_scan_token(VERTICAL_BAR)) return true; - if (jj_3R_196()) return true; + final private boolean jj_3_63() { + if (jj_3R_104()) return true; return false; } - final private boolean jj_3_1779() { - if (jj_scan_token(RUNNING)) return true; + final private boolean jj_3_1774() { + if (jj_scan_token(MATCHES)) return true; return false; } - final private boolean jj_3_38() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_381() { + if (jj_scan_token(PERMUTE)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_1778() { - if (jj_scan_token(ROLLUP)) return true; + final private boolean jj_3_838() { + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3R_82() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_37()) { - jj_scanpos = xsp; - if (jj_3_38()) return true; - } + final private boolean jj_3_1773() { + if (jj_scan_token(LOCAL)) return true; return false; } - final private boolean jj_3_1777() { - if (jj_scan_token(RETURNS)) return true; + final private boolean jj_3_62() { + if (jj_3R_103()) return true; return false; } - final private boolean jj_3_37() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3_1772() { + if (jj_scan_token(LEAD)) return true; return false; } - final private boolean jj_3_846() { - if (jj_scan_token(FLOOR)) return true; - if (jj_3R_291()) return true; + final private boolean jj_3_837() { + if (jj_3R_200()) return true; return false; } - final private boolean jj_3_1776() { - if (jj_scan_token(RESET)) return true; + final private boolean jj_3_1771() { + if (jj_scan_token(LARGE)) return true; return false; } - final private boolean jj_3_1775() { - if (jj_scan_token(REGR_SXY)) return true; + final private boolean jj_3_61() { + if (jj_3R_102()) return true; return false; } - final private boolean jj_3R_201() { - if (jj_3R_196()) return true; + final private boolean jj_3_1770() { + if (jj_scan_token(JSON_VALUE)) return true; return false; } - final private boolean jj_3_1774() { - if (jj_scan_token(REGR_R2)) return true; + final private boolean jj_3_864() { + if (jj_scan_token(TRANSLATE)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_825() { - if (jj_scan_token(FOR)) return true; - if (jj_3R_78()) return true; + final private boolean jj_3_1769() { + if (jj_scan_token(JSON_OBJECTAGG)) return true; return false; } - final private boolean jj_3_1773() { - if (jj_scan_token(REGR_AVGY)) return true; + final private boolean jj_3_60() { + if (jj_3R_101()) return true; return false; } - final private boolean jj_3_1772() { - if (jj_scan_token(REFERENCES)) return true; + final private boolean jj_3_1768() { + if (jj_scan_token(JSON_ARRAYAGG)) return true; return false; } - final private boolean jj_3_1771() { - if (jj_scan_token(REAL)) return true; + final private boolean jj_3_380() { + if (jj_scan_token(LBRACE)) return true; + if (jj_scan_token(MINUS)) return true; return false; } - final private boolean jj_3_1770() { - if (jj_scan_token(RANGE)) return true; + final private boolean jj_3_1767() { + if (jj_scan_token(INTEGER)) return true; return false; } - final private boolean jj_3_1769() { - if (jj_scan_token(PREV)) return true; + final private boolean jj_3_59() { + if (jj_3R_100()) return true; return false; } - final private boolean jj_3_1768() { - if (jj_scan_token(PRECEDES)) return true; + final private boolean jj_3_1766() { + if (jj_scan_token(INOUT)) return true; return false; } - final private boolean jj_3_845() { - if (jj_scan_token(OVERLAY)) return true; + final private boolean jj_3_379() { if (jj_scan_token(LPAREN)) return true; + if (jj_3R_203()) return true; return false; } - final private boolean jj_3_1767() { - if (jj_scan_token(POSITION)) return true; - return false; - } - - final private boolean jj_3_822() { + final private boolean jj_3_839() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_78()) return true; - return false; - } - - final private boolean jj_3_1766() { - if (jj_scan_token(PERIOD)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_837()) { + jj_scanpos = xsp; + if (jj_3_838()) return true; + } return false; } final private boolean jj_3_1765() { - if (jj_scan_token(PERCENTILE_CONT)) return true; + if (jj_scan_token(IMPORT)) return true; return false; } - final private boolean jj_3_36() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_83()) return true; + final private boolean jj_3_58() { + if (jj_3R_99()) return true; return false; } - final private boolean jj_3_824() { + final private boolean jj_3R_389() { Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_822()) { jj_scanpos = xsp; break; } + xsp = jj_scanpos; + if (jj_3_378()) { + jj_scanpos = xsp; + if (jj_3_379()) { + jj_scanpos = xsp; + if (jj_3_380()) { + jj_scanpos = xsp; + if (jj_3_381()) return true; + } + } } - if (jj_scan_token(RPAREN)) return true; return false; } final private boolean jj_3_1764() { - if (jj_scan_token(PATTERN)) return true; + if (jj_scan_token(HOLD)) return true; + return false; + } + + final private boolean jj_3_378() { + if (jj_3R_85()) return true; return false; } final private boolean jj_3_1763() { - if (jj_scan_token(OVERLAPS)) return true; + if (jj_scan_token(GRANT)) return true; + return false; + } + + final private boolean jj_3_57() { + if (jj_3R_98()) return true; return false; } final private boolean jj_3_1762() { - if (jj_scan_token(ORDINAL)) return true; + if (jj_scan_token(FUSION)) return true; return false; } - final private boolean jj_3R_385() { + final private boolean jj_3_1761() { + if (jj_scan_token(FRAME_ROW)) return true; return false; } - final private boolean jj_3R_195() { - if (jj_3R_81()) return true; + final private boolean jj_3_56() { + if (jj_3R_97()) return true; return false; } - final private boolean jj_3_1761() { - if (jj_scan_token(ONE)) return true; + final private boolean jj_3_836() { + if (jj_scan_token(INTERVAL)) return true; + if (jj_3R_219()) return true; return false; } final private boolean jj_3_1760() { - if (jj_scan_token(OF)) return true; + if (jj_scan_token(FLOAT)) return true; return false; } final private boolean jj_3_1759() { - if (jj_scan_token(NUMERIC)) return true; + if (jj_scan_token(EXTRACT)) return true; return false; } - final private boolean jj_3_35() { - if (jj_3R_82()) return true; + final private boolean jj_3_55() { + if (jj_3R_96()) return true; return false; } - final private boolean jj_3_823() { - if (jj_scan_token(USING)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_835() { + if (jj_3R_121()) return true; return false; } final private boolean jj_3_1758() { - if (jj_scan_token(NTH_VALUE)) return true; + if (jj_scan_token(EXP)) return true; return false; } final private boolean jj_3_1757() { - if (jj_scan_token(NO)) return true; + if (jj_scan_token(EVERY)) return true; + return false; + } + + final private boolean jj_3_54() { + if (jj_3R_95()) return true; return false; } final private boolean jj_3_1756() { - if (jj_scan_token(NCLOB)) return true; + if (jj_scan_token(END_PARTITION)) return true; return false; } final private boolean jj_3_1755() { - if (jj_scan_token(MULTISET)) return true; + if (jj_scan_token(END)) return true; return false; } - final private boolean jj_3_818() { - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_53() { + if (jj_3R_94()) return true; + return false; + } + + final private boolean jj_3_832() { + if (jj_scan_token(RPAREN)) return true; return false; } final private boolean jj_3_1754() { - if (jj_scan_token(MODIFIES)) return true; + if (jj_scan_token(EACH)) return true; return false; } - final private boolean jj_3R_220() { - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_841() { Token xsp; xsp = jj_scanpos; - if (jj_3_35()) { + if (jj_3_835()) { jj_scanpos = xsp; - if (jj_3R_385()) return true; + if (jj_3_836()) return true; } + if (jj_scan_token(COMMA)) return true; return false; } - final private boolean jj_3_1753() { - if (jj_scan_token(MIN)) return true; + final private boolean jj_3R_391() { return false; } - final private boolean jj_3_359() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_195()) return true; + final private boolean jj_3_1753() { + if (jj_scan_token(DISCONNECT)) return true; return false; } - final private boolean jj_3_817() { - if (jj_3R_198()) return true; + final private boolean jj_3_52() { + if (jj_3R_93()) return true; return false; } final private boolean jj_3_1752() { - if (jj_scan_token(MEASURES)) return true; + if (jj_scan_token(DESCRIBE)) return true; return false; } final private boolean jj_3_1751() { - if (jj_scan_token(MATCH_RECOGNIZE)) return true; + if (jj_scan_token(DEFINE)) return true; return false; } - final private boolean jj_3_844() { - if (jj_scan_token(TRANSLATE)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_1750() { + if (jj_scan_token(DEC)) return true; return false; } - final private boolean jj_3R_191() { - if (jj_3R_195()) return true; + final private boolean jj_3_1749() { + if (jj_scan_token(DATETIME)) return true; return false; } - final private boolean jj_3_1750() { - if (jj_scan_token(MATCHES)) return true; + final private boolean jj_3_831() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_1749() { - if (jj_scan_token(LOCAL)) return true; + final private boolean jj_3R_92() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_52()) { + jj_scanpos = xsp; + if (jj_3_53()) { + jj_scanpos = xsp; + if (jj_3_54()) { + jj_scanpos = xsp; + if (jj_3_55()) { + jj_scanpos = xsp; + if (jj_3_56()) { + jj_scanpos = xsp; + if (jj_3_57()) { + jj_scanpos = xsp; + if (jj_3_58()) { + jj_scanpos = xsp; + if (jj_3_59()) { + jj_scanpos = xsp; + if (jj_3_60()) { + jj_scanpos = xsp; + if (jj_3_61()) { + jj_scanpos = xsp; + if (jj_3_62()) { + jj_scanpos = xsp; + if (jj_3_63()) { + jj_scanpos = xsp; + if (jj_3_64()) { + jj_scanpos = xsp; + if (jj_3_65()) { + jj_scanpos = xsp; + if (jj_3_66()) { + jj_scanpos = xsp; + if (jj_3_67()) { + jj_scanpos = xsp; + if (jj_3_68()) { + jj_scanpos = xsp; + if (jj_3_69()) { + jj_scanpos = xsp; + if (jj_3_70()) { + jj_scanpos = xsp; + if (jj_3_71()) { + jj_scanpos = xsp; + if (jj_3_72()) { + jj_scanpos = xsp; + if (jj_3_73()) { + jj_scanpos = xsp; + if (jj_3_74()) { + jj_scanpos = xsp; + if (jj_3_75()) { + jj_scanpos = xsp; + if (jj_3_76()) { + jj_scanpos = xsp; + if (jj_3_77()) { + jj_scanpos = xsp; + if (jj_3_78()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } return false; } final private boolean jj_3_1748() { - if (jj_scan_token(LEAD)) return true; + if (jj_scan_token(CURSOR)) return true; return false; } - final private boolean jj_3_1747() { - if (jj_scan_token(LARGE)) return true; + final private boolean jj_3_376() { + if (jj_scan_token(HOOK)) return true; return false; } - final private boolean jj_3_819() { - if (jj_scan_token(COMMA)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_817()) { - jj_scanpos = xsp; - if (jj_3_818()) return true; - } + final private boolean jj_3_1747() { + if (jj_scan_token(CURRENT_ROLE)) return true; return false; } final private boolean jj_3_1746() { - if (jj_scan_token(JSON_VALUE)) return true; + if (jj_scan_token(CURRENT_CATALOG)) return true; return false; } final private boolean jj_3_1745() { - if (jj_scan_token(JSON_OBJECTAGG)) return true; + if (jj_scan_token(CUBE)) return true; return false; } final private boolean jj_3_1744() { - if (jj_scan_token(JSON_ARRAYAGG)) return true; + if (jj_scan_token(COUNT)) return true; return false; } final private boolean jj_3_1743() { - if (jj_scan_token(INTEGER)) return true; + if (jj_scan_token(CONVERT)) return true; return false; } - final private boolean jj_3_1742() { - if (jj_scan_token(INOUT)) return true; + final private boolean jj_3_371() { + if (jj_scan_token(MINUS)) return true; + if (jj_3R_203()) return true; return false; } - final private boolean jj_3_816() { - if (jj_scan_token(INTERVAL)) return true; - if (jj_3R_215()) return true; + final private boolean jj_3_834() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_85()) return true; + return false; + } + + final private boolean jj_3_1742() { + if (jj_scan_token(CONDITION)) return true; return false; } final private boolean jj_3_1741() { - if (jj_scan_token(IMPORT)) return true; + if (jj_scan_token(COLLATE)) return true; return false; } final private boolean jj_3_1740() { - if (jj_scan_token(HOLD)) return true; + if (jj_scan_token(CLOB)) return true; return false; } - final private boolean jj_3_815() { - if (jj_3R_120()) return true; + final private boolean jj_3_50() { + if (jj_3R_92()) return true; return false; } - final private boolean jj_3_1739() { - if (jj_scan_token(GRANT)) return true; + final private boolean jj_3R_202() { return false; } - final private boolean jj_3_1738() { - if (jj_scan_token(FUSION)) return true; + final private boolean jj_3R_201() { return false; } - final private boolean jj_3R_401() { - if (jj_3R_220()) return true; + final private boolean jj_3_1739() { + if (jj_scan_token(CHAR_LENGTH)) return true; return false; } - final private boolean jj_3_1737() { - if (jj_scan_token(FRAME_ROW)) return true; + final private boolean jj_3_1738() { + if (jj_scan_token(CHAR)) return true; return false; } - final private boolean jj_3_358() { - if (jj_scan_token(SUBSET)) return true; - if (jj_3R_194()) return true; + final private boolean jj_3_370() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_200()) return true; return false; } - final private boolean jj_3_1736() { - if (jj_scan_token(FLOAT)) return true; + final private boolean jj_3_833() { + if (jj_scan_token(USING)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_812() { - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_1737() { + if (jj_scan_token(CASCADED)) return true; return false; } - final private boolean jj_3_1735() { - if (jj_scan_token(EXTRACT)) return true; + final private boolean jj_3_367() { + if (jj_3R_200()) return true; return false; } - final private boolean jj_3_821() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_815()) { - jj_scanpos = xsp; - if (jj_3_816()) return true; - } - if (jj_scan_token(COMMA)) return true; + final private boolean jj_3_1736() { + if (jj_scan_token(CALL)) return true; + return false; + } + + final private boolean jj_3_1735() { + if (jj_scan_token(BIT)) return true; return false; } final private boolean jj_3_1734() { - if (jj_scan_token(EXP)) return true; + if (jj_scan_token(BEGIN_PARTITION)) return true; return false; } - final private boolean jj_3_1733() { - if (jj_scan_token(EVERY)) return true; + final private boolean jj_3_49() { + if (jj_scan_token(SEMICOLON)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_50()) jj_scanpos = xsp; return false; } - final private boolean jj_3_357() { - if (jj_scan_token(WITHIN)) return true; - if (jj_3R_193()) return true; + final private boolean jj_3_1733() { + if (jj_scan_token(AVG)) return true; return false; } final private boolean jj_3_1732() { - if (jj_scan_token(END_PARTITION)) return true; + if (jj_scan_token(AT)) return true; return false; } final private boolean jj_3_1731() { - if (jj_scan_token(END)) return true; + if (jj_scan_token(ARRAY_MAX_CARDINALITY)) return true; return false; } - final private boolean jj_3_1730() { - if (jj_scan_token(EACH)) return true; + final private boolean jj_3_368() { + if (jj_scan_token(COMMA)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_367()) { + jj_scanpos = xsp; + if (jj_3R_201()) return true; + } return false; } - final private boolean jj_3_349() { - if (jj_scan_token(LAST)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_840() { + if (jj_3R_79()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_833()) { + jj_scanpos = xsp; + if (jj_3_834()) return true; + } return false; } - final private boolean jj_3_811() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_1730() { + if (jj_scan_token(ALLOCATE)) return true; return false; } final private boolean jj_3_1729() { - if (jj_scan_token(DISCONNECT)) return true; + if (jj_scan_token(MAX_CHANGED_PARTITION_ROWS_PERCENT)) return true; return false; } final private boolean jj_3_1728() { - if (jj_scan_token(DESCRIBE)) return true; + if (jj_scan_token(STATISTICS)) return true; return false; } - final private boolean jj_3_356() { - if (jj_scan_token(DOLLAR)) return true; + final private boolean jj_3_1727() { + if (jj_scan_token(COMPUTE)) return true; return false; } - final private boolean jj_3_1727() { - if (jj_scan_token(DEFINE)) return true; - return false; - } - - final private boolean jj_3_34() { - if (jj_3R_80()) return true; + final private boolean jj_3_1726() { + if (jj_scan_token(SCAN)) return true; return false; } - final private boolean jj_3_1726() { - if (jj_scan_token(DEC)) return true; + final private boolean jj_3_51() { + if (jj_3R_92()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_49()) { jj_scanpos = xsp; break; } + } return false; } final private boolean jj_3_1725() { - if (jj_scan_token(DATETIME)) return true; + if (jj_scan_token(NOLOGGING)) return true; return false; } - final private boolean jj_3_33() { - if (jj_3R_81()) return true; + final private boolean jj_3_369() { + if (jj_3R_200()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_368()) { + jj_scanpos = xsp; + if (jj_3R_202()) return true; + } + if (jj_scan_token(RBRACE)) return true; return false; } final private boolean jj_3_1724() { - if (jj_scan_token(CURSOR)) return true; - return false; - } - - final private boolean jj_3_814() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_84()) return true; + if (jj_scan_token(PARALLEL)) return true; return false; } final private boolean jj_3_1723() { - if (jj_scan_token(CURRENT_ROLE)) return true; - return false; - } - - final private boolean jj_3_355() { - if (jj_scan_token(CARET)) return true; + if (jj_scan_token(WRAP_KEY)) return true; return false; } final private boolean jj_3_1722() { - if (jj_scan_token(CURRENT_CATALOG)) return true; + if (jj_scan_token(CACHE_NAME)) return true; return false; } final private boolean jj_3_1721() { - if (jj_scan_token(CUBE)) return true; + if (jj_scan_token(ATOMICITY)) return true; return false; } final private boolean jj_3_1720() { - if (jj_scan_token(COUNT)) return true; + if (jj_scan_token(TEMPLATE)) return true; return false; } final private boolean jj_3_1719() { - if (jj_scan_token(CONVERT)) return true; + if (jj_scan_token(XML)) return true; return false; } - final private boolean jj_3_813() { - if (jj_scan_token(USING)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_375() { + if (jj_scan_token(LBRACE)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_369()) { + jj_scanpos = xsp; + if (jj_3_370()) { + jj_scanpos = xsp; + if (jj_3_371()) return true; + } + } return false; } - final private boolean jj_3_1718() { - if (jj_scan_token(CONDITION)) return true; + final private boolean jj_3_863() { + if (jj_scan_token(CONVERT)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_1717() { - if (jj_scan_token(COLLATE)) return true; + final private boolean jj_3_1718() { + if (jj_scan_token(WORK)) return true; return false; } - final private boolean jj_3_353() { - if (jj_scan_token(PAST)) return true; - if (jj_scan_token(LAST)) return true; + final private boolean jj_3_1717() { + if (jj_scan_token(VIEW)) return true; return false; } final private boolean jj_3_1716() { - if (jj_scan_token(CLOB)) return true; + if (jj_scan_token(UTF32)) return true; return false; } - final private boolean jj_3_1715() { - if (jj_scan_token(CHAR_LENGTH)) return true; + final private boolean jj_3_830() { + if (jj_scan_token(FROM)) return true; + if (jj_3R_79()) return true; return false; } - final private boolean jj_3_32() { - if (jj_scan_token(COMMA)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_33()) { - jj_scanpos = xsp; - if (jj_3_34()) return true; - } + final private boolean jj_3R_91() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3R_192() { - Token xsp; - xsp = jj_scanpos; - if (jj_scan_token(304)) jj_scanpos = xsp; - if (jj_3R_84()) return true; + final private boolean jj_3_1715() { + if (jj_scan_token(USER_DEFINED_TYPE_NAME)) return true; return false; } final private boolean jj_3_1714() { - if (jj_scan_token(CHAR)) return true; - return false; - } - - final private boolean jj_3_1713() { - if (jj_scan_token(CASCADED)) return true; + if (jj_scan_token(USAGE)) return true; return false; } - final private boolean jj_3_1712() { - if (jj_scan_token(CALL)) return true; + final private boolean jj_3_374() { + if (jj_scan_token(HOOK)) return true; return false; } - final private boolean jj_3_31() { - if (jj_3R_80()) return true; + final private boolean jj_3_1713() { + if (jj_scan_token(UNDER)) return true; return false; } - final private boolean jj_3_820() { - if (jj_3R_78()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_813()) { - jj_scanpos = xsp; - if (jj_3_814()) return true; - } + final private boolean jj_3_1712() { + if (jj_scan_token(UNBOUNDED)) return true; return false; } final private boolean jj_3_1711() { - if (jj_scan_token(BIT)) return true; + if (jj_scan_token(TRIGGER_SCHEMA)) return true; return false; } final private boolean jj_3_1710() { - if (jj_scan_token(BEGIN_PARTITION)) return true; + if (jj_scan_token(TRANSFORMS)) return true; return false; } - final private boolean jj_3_30() { - if (jj_3R_79()) return true; + final private boolean jj_3_1709() { + if (jj_scan_token(TRANSACTIONS_COMMITTED)) return true; return false; } - final private boolean jj_3_1709() { - if (jj_scan_token(AVG)) return true; + final private boolean jj_3_373() { + if (jj_scan_token(PLUS)) return true; return false; } final private boolean jj_3_1708() { - if (jj_scan_token(AT)) return true; + if (jj_scan_token(TOP_LEVEL_COUNT)) return true; return false; } final private boolean jj_3_1707() { - if (jj_scan_token(ARRAY_MAX_CARDINALITY)) return true; + if (jj_scan_token(TIMESTAMPDIFF)) return true; return false; } final private boolean jj_3_1706() { - if (jj_scan_token(ALLOCATE)) return true; + if (jj_scan_token(TIME_DIFF)) return true; + return false; + } + + final private boolean jj_3_862() { + if (jj_scan_token(POSITION)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } final private boolean jj_3_1705() { - if (jj_scan_token(MAX_CHANGED_PARTITION_ROWS_PERCENT)) return true; + if (jj_scan_token(TABLE_NAME)) return true; return false; } final private boolean jj_3_1704() { - if (jj_scan_token(STATISTICS)) return true; + if (jj_scan_token(STYLE)) return true; + return false; + } + + final private boolean jj_3_372() { + if (jj_scan_token(STAR)) return true; return false; } final private boolean jj_3_1703() { - if (jj_scan_token(COMPUTE)) return true; + if (jj_scan_token(STATEMENT)) return true; return false; } final private boolean jj_3_1702() { - if (jj_scan_token(SCAN)) return true; + if (jj_scan_token(SQL_VARBINARY)) return true; return false; } final private boolean jj_3_1701() { - if (jj_scan_token(NOLOGGING)) return true; + if (jj_scan_token(SQL_TSI_SECOND)) return true; return false; } final private boolean jj_3_1700() { - if (jj_scan_token(PARALLEL)) return true; - return false; - } - - final private boolean jj_3_843() { - if (jj_scan_token(CONVERT)) return true; - if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(SQL_TSI_MINUTE)) return true; return false; } final private boolean jj_3_1699() { - if (jj_scan_token(WRAP_KEY)) return true; + if (jj_scan_token(SQL_TSI_FRAC_SECOND)) return true; return false; } - final private boolean jj_3_351() { - if (jj_scan_token(FIRST)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3R_390() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_372()) { + jj_scanpos = xsp; + if (jj_3_373()) { + jj_scanpos = xsp; + if (jj_3_374()) { + jj_scanpos = xsp; + if (jj_3_375()) return true; + } + } + } return false; } final private boolean jj_3_1698() { - if (jj_scan_token(CACHE_NAME)) return true; + if (jj_scan_token(SQL_TIMESTAMP)) return true; return false; } final private boolean jj_3_1697() { - if (jj_scan_token(ATOMICITY)) return true; + if (jj_scan_token(SQL_REAL)) return true; return false; } - final private boolean jj_3_810() { - if (jj_scan_token(FROM)) return true; - if (jj_3R_78()) return true; + final private boolean jj_3_1696() { + if (jj_scan_token(SQL_NCLOB)) return true; return false; } - final private boolean jj_3_1696() { - if (jj_scan_token(TEMPLATE)) return true; + final private boolean jj_3_861() { + if (jj_scan_token(EXTRACT)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } final private boolean jj_3_1695() { - if (jj_scan_token(XML)) return true; + if (jj_scan_token(SQL_LONGVARCHAR)) return true; return false; } final private boolean jj_3_1694() { - if (jj_scan_token(WORK)) return true; + if (jj_scan_token(SQL_INTERVAL_YEAR)) return true; return false; } final private boolean jj_3_1693() { - if (jj_scan_token(VIEW)) return true; - return false; - } - - final private boolean jj_3_350() { - if (jj_scan_token(NEXT)) return true; - if (jj_scan_token(ROW)) return true; + if (jj_scan_token(SQL_INTERVAL_MINUTE_TO_SECOND)) return true; return false; } - final private boolean jj_3_1692() { - if (jj_scan_token(UTF32)) return true; + final private boolean jj_3_829() { + if (jj_scan_token(FORMAT)) return true; + if (jj_3R_139()) return true; return false; } - final private boolean jj_3R_183() { - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3R_199() { + if (jj_3R_389()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_30()) { + if (jj_3R_390()) { jj_scanpos = xsp; - if (jj_3_31()) return true; + if (jj_3R_391()) return true; } return false; } + final private boolean jj_3_1692() { + if (jj_scan_token(SQL_INTERVAL_HOUR_TO_MINUTE)) return true; + return false; + } + + final private boolean jj_3_828() { + if (jj_scan_token(INTERVAL)) return true; + if (jj_3R_219()) return true; + return false; + } + + final private boolean jj_3R_81() { + if (jj_scan_token(DEFAULT_)) return true; + return false; + } + final private boolean jj_3_1691() { - if (jj_scan_token(USER_DEFINED_TYPE_NAME)) return true; + if (jj_scan_token(SQL_INTERVAL_DAY_TO_MINUTE)) return true; return false; } final private boolean jj_3_1690() { - if (jj_scan_token(USAGE)) return true; + if (jj_scan_token(SQL_INTEGER)) return true; + return false; + } + + final private boolean jj_3_827() { + if (jj_3R_121()) return true; return false; } final private boolean jj_3_1689() { - if (jj_scan_token(UNDER)) return true; + if (jj_scan_token(SQL_DECIMAL)) return true; + return false; + } + + final private boolean jj_3R_90() { + if (jj_3R_135()) return true; return false; } final private boolean jj_3_1688() { - if (jj_scan_token(UNBOUNDED)) return true; + if (jj_scan_token(SQL_CHAR)) return true; return false; } final private boolean jj_3_1687() { - if (jj_scan_token(TRIGGER_SCHEMA)) return true; + if (jj_scan_token(SQL_BIT)) return true; return false; } - final private boolean jj_3_352() { - if (jj_scan_token(TO)) return true; + final private boolean jj_3_46() { Token xsp; xsp = jj_scanpos; - if (jj_3_350()) { + if (jj_3R_90()) { jj_scanpos = xsp; - if (jj_3_351()) { - jj_scanpos = xsp; - lookingAhead = true; - jj_semLA = true; - lookingAhead = false; - if (!jj_semLA || jj_3R_192()) return true; - } + if (jj_3R_91()) return true; } + if (jj_scan_token(LAMBDA)) return true; return false; } - final private boolean jj_3_842() { - if (jj_scan_token(POSITION)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_1686() { + if (jj_scan_token(SPECIFIC_NAME)) return true; return false; } - final private boolean jj_3_1686() { - if (jj_scan_token(TRANSFORMS)) return true; + final private boolean jj_3R_87() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } final private boolean jj_3_1685() { - if (jj_scan_token(TRANSACTIONS_COMMITTED)) return true; + if (jj_scan_token(SIZE)) return true; return false; } final private boolean jj_3_1684() { - if (jj_scan_token(TOP_LEVEL_COUNT)) return true; + if (jj_scan_token(SESSION)) return true; return false; } final private boolean jj_3_1683() { - if (jj_scan_token(TIMESTAMPDIFF)) return true; + if (jj_scan_token(SERIALIZABLE)) return true; return false; } final private boolean jj_3_1682() { - if (jj_scan_token(TIME_DIFF)) return true; + if (jj_scan_token(SELF)) return true; + return false; + } + + final private boolean jj_3_48() { + if (jj_3R_88()) return true; + return false; + } + + final private boolean jj_3_826() { + if (jj_scan_token(TRY_CAST)) return true; return false; } final private boolean jj_3_1681() { - if (jj_scan_token(TABLE_NAME)) return true; + if (jj_scan_token(SECONDS)) return true; return false; } - final private boolean jj_3_354() { - if (jj_scan_token(AFTER)) return true; - if (jj_scan_token(MATCH)) return true; + final private boolean jj_3_824() { + if (jj_scan_token(CAST)) return true; + return false; + } + + final private boolean jj_3_825() { + if (jj_scan_token(SAFE_CAST)) return true; return false; } final private boolean jj_3_1680() { - if (jj_scan_token(STYLE)) return true; + if (jj_scan_token(SCOPE_CATALOGS)) return true; + return false; + } + + final private boolean jj_3_47() { + if (jj_3R_82()) return true; return false; } final private boolean jj_3_1679() { - if (jj_scan_token(STATEMENT)) return true; + if (jj_scan_token(SCALE)) return true; return false; } final private boolean jj_3_1678() { - if (jj_scan_token(SQL_VARBINARY)) return true; + if (jj_scan_token(ROUTINE_SCHEMA)) return true; + return false; + } + + final private boolean jj_3_860() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_824()) { + jj_scanpos = xsp; + if (jj_3_825()) { + jj_scanpos = xsp; + if (jj_3_826()) return true; + } + } + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3R_354() { + if (jj_3R_420()) return true; return false; } final private boolean jj_3_1677() { - if (jj_scan_token(SQL_TSI_SECOND)) return true; + if (jj_scan_token(ROUTINE)) return true; return false; } - final private boolean jj_3_841() { - if (jj_scan_token(EXTRACT)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_366() { + if (jj_3R_199()) return true; return false; } final private boolean jj_3_1676() { - if (jj_scan_token(SQL_TSI_MINUTE)) return true; + if (jj_scan_token(RETURNING)) return true; return false; } final private boolean jj_3_1675() { - if (jj_scan_token(SQL_TSI_FRAC_SECOND)) return true; + if (jj_scan_token(RETURNED_LENGTH)) return true; return false; } - final private boolean jj_3_348() { - if (jj_scan_token(ALL)) return true; - if (jj_scan_token(ROWS)) return true; + final private boolean jj_3_45() { + if (jj_3R_81()) return true; return false; } final private boolean jj_3_1674() { - if (jj_scan_token(SQL_TIMESTAMP)) return true; + if (jj_scan_token(RESTART)) return true; return false; } - final private boolean jj_3_808() { - if (jj_scan_token(INTERVAL)) return true; - if (jj_3R_215()) return true; + final private boolean jj_3R_227() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_860()) { + jj_scanpos = xsp; + if (jj_3_861()) { + jj_scanpos = xsp; + if (jj_3_862()) { + jj_scanpos = xsp; + if (jj_3_863()) { + jj_scanpos = xsp; + if (jj_3_864()) { + jj_scanpos = xsp; + if (jj_3_865()) { + jj_scanpos = xsp; + if (jj_3_866()) { + jj_scanpos = xsp; + if (jj_3_867()) { + jj_scanpos = xsp; + if (jj_3_868()) { + jj_scanpos = xsp; + if (jj_3_869()) { + jj_scanpos = xsp; + if (jj_3_870()) { + jj_scanpos = xsp; + if (jj_3_871()) { + jj_scanpos = xsp; + if (jj_3_872()) { + jj_scanpos = xsp; + if (jj_3_873()) { + jj_scanpos = xsp; + if (jj_3_874()) { + jj_scanpos = xsp; + if (jj_3_875()) { + jj_scanpos = xsp; + if (jj_3_876()) { + jj_scanpos = xsp; + if (jj_3_877()) { + jj_scanpos = xsp; + if (jj_3_878()) { + jj_scanpos = xsp; + if (jj_3_879()) { + jj_scanpos = xsp; + if (jj_3_880()) { + jj_scanpos = xsp; + if (jj_3_881()) { + jj_scanpos = xsp; + if (jj_3_882()) { + jj_scanpos = xsp; + if (jj_3_883()) { + jj_scanpos = xsp; + if (jj_3_884()) { + jj_scanpos = xsp; + if (jj_3_885()) { + jj_scanpos = xsp; + if (jj_3_886()) { + jj_scanpos = xsp; + if (jj_3_887()) { + jj_scanpos = xsp; + if (jj_3_888()) { + jj_scanpos = xsp; + if (jj_3_889()) { + jj_scanpos = xsp; + if (jj_3_890()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } return false; } - final private boolean jj_3_809() { - if (jj_scan_token(FORMAT)) return true; - if (jj_3R_138()) return true; + final private boolean jj_3_1673() { + if (jj_scan_token(REPEATABLE)) return true; return false; } - final private boolean jj_3_1673() { - if (jj_scan_token(SQL_REAL)) return true; + final private boolean jj_3R_353() { return false; } final private boolean jj_3_1672() { - if (jj_scan_token(SQL_NCLOB)) return true; + if (jj_scan_token(QUARTERS)) return true; return false; } - final private boolean jj_3_807() { - if (jj_3R_120()) return true; + final private boolean jj_3R_198() { + if (jj_3R_199()) return true; return false; } final private boolean jj_3_1671() { - if (jj_scan_token(SQL_LONGVARCHAR)) return true; + if (jj_scan_token(PRIVILEGES)) return true; return false; } - final private boolean jj_3_347() { - if (jj_scan_token(ONE)) return true; - if (jj_scan_token(ROW)) return true; + final private boolean jj_3_44() { + if (jj_3R_85()) return true; + if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true; return false; } final private boolean jj_3_1670() { - if (jj_scan_token(SQL_INTERVAL_YEAR)) return true; - return false; - } - - final private boolean jj_3_29() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_78()) return true; + if (jj_scan_token(PRECEDING)) return true; return false; } final private boolean jj_3_1669() { - if (jj_scan_token(SQL_INTERVAL_MINUTE_TO_SECOND)) return true; + if (jj_scan_token(PLACING)) return true; return false; } final private boolean jj_3_1668() { - if (jj_scan_token(SQL_INTERVAL_HOUR_TO_MINUTE)) return true; + if (jj_scan_token(PAST)) return true; return false; } final private boolean jj_3_1667() { - if (jj_scan_token(SQL_INTERVAL_DAY_TO_MINUTE)) return true; + if (jj_scan_token(PASCAL)) return true; return false; } - final private boolean jj_3_1666() { - if (jj_scan_token(SQL_INTEGER)) return true; + final private boolean jj_3R_84() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_44()) { + jj_scanpos = xsp; + if (jj_3R_353()) return true; + } + xsp = jj_scanpos; + if (jj_3_45()) { + jj_scanpos = xsp; + if (jj_3R_354()) { + jj_scanpos = xsp; + if (jj_3_47()) { + jj_scanpos = xsp; + if (jj_3_48()) return true; + } + } + } return false; } - final private boolean jj_3_1665() { - if (jj_scan_token(SQL_DECIMAL)) return true; + final private boolean jj_3_1666() { + if (jj_scan_token(PARAMETER_SPECIFIC_NAME)) return true; return false; } - final private boolean jj_3_346() { - if (jj_scan_token(MEASURES)) return true; - if (jj_3R_191()) return true; + final private boolean jj_3_1665() { + if (jj_scan_token(PARAMETER_NAME)) return true; return false; } final private boolean jj_3_1664() { - if (jj_scan_token(SQL_CHAR)) return true; + if (jj_scan_token(OVERRIDING)) return true; return false; } - final private boolean jj_3_806() { - if (jj_scan_token(TRY_CAST)) return true; - return false; - } - - final private boolean jj_3_1663() { - if (jj_scan_token(SQL_BIT)) return true; - return false; - } - - final private boolean jj_3_804() { - if (jj_scan_token(CAST)) return true; - return false; - } - - final private boolean jj_3_805() { - if (jj_scan_token(SAFE_CAST)) return true; + final private boolean jj_3_1663() { + if (jj_scan_token(ORDINALITY)) return true; return false; } final private boolean jj_3_1662() { - if (jj_scan_token(SPECIFIC_NAME)) return true; + if (jj_scan_token(OPTION)) return true; return false; } final private boolean jj_3_1661() { - if (jj_scan_token(SIZE)) return true; + if (jj_scan_token(NUMBER)) return true; return false; } final private boolean jj_3_1660() { - if (jj_scan_token(SESSION)) return true; - return false; - } - - final private boolean jj_3_345() { - if (jj_3R_70()) return true; + if (jj_scan_token(NORMALIZED)) return true; return false; } - final private boolean jj_3_840() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_804()) { - jj_scanpos = xsp; - if (jj_3_805()) { - jj_scanpos = xsp; - if (jj_3_806()) return true; - } - } - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_1659() { + if (jj_scan_token(NAMES)) return true; return false; } - final private boolean jj_3_1659() { - if (jj_scan_token(SERIALIZABLE)) return true; + final private boolean jj_3R_86() { + if (jj_3R_135()) return true; return false; } final private boolean jj_3_1658() { - if (jj_scan_token(SELF)) return true; + if (jj_scan_token(MORE_)) return true; return false; } - final private boolean jj_3_1657() { - if (jj_scan_token(SECONDS)) return true; + final private boolean jj_3_365() { + if (jj_scan_token(VERTICAL_BAR)) return true; + if (jj_3R_198()) return true; return false; } - final private boolean jj_3_1656() { - if (jj_scan_token(SCOPE_CATALOGS)) return true; + final private boolean jj_3_1657() { + if (jj_scan_token(MINUTES)) return true; return false; } - final private boolean jj_3R_223() { + final private boolean jj_3_41() { Token xsp; xsp = jj_scanpos; - if (jj_3_840()) { - jj_scanpos = xsp; - if (jj_3_841()) { - jj_scanpos = xsp; - if (jj_3_842()) { - jj_scanpos = xsp; - if (jj_3_843()) { - jj_scanpos = xsp; - if (jj_3_844()) { - jj_scanpos = xsp; - if (jj_3_845()) { - jj_scanpos = xsp; - if (jj_3_846()) { - jj_scanpos = xsp; - if (jj_3_847()) { - jj_scanpos = xsp; - if (jj_3_848()) { - jj_scanpos = xsp; - if (jj_3_849()) { - jj_scanpos = xsp; - if (jj_3_850()) { - jj_scanpos = xsp; - if (jj_3_851()) { - jj_scanpos = xsp; - if (jj_3_852()) { - jj_scanpos = xsp; - if (jj_3_853()) { - jj_scanpos = xsp; - if (jj_3_854()) { - jj_scanpos = xsp; - if (jj_3_855()) { - jj_scanpos = xsp; - if (jj_3_856()) { - jj_scanpos = xsp; - if (jj_3_857()) { - jj_scanpos = xsp; - if (jj_3_858()) { - jj_scanpos = xsp; - if (jj_3_859()) { - jj_scanpos = xsp; - if (jj_3_860()) { - jj_scanpos = xsp; - if (jj_3_861()) { - jj_scanpos = xsp; - if (jj_3_862()) { - jj_scanpos = xsp; - if (jj_3_863()) { - jj_scanpos = xsp; - if (jj_3_864()) { - jj_scanpos = xsp; - if (jj_3_865()) { - jj_scanpos = xsp; - if (jj_3_866()) { - jj_scanpos = xsp; - if (jj_3_867()) { - jj_scanpos = xsp; - if (jj_3_868()) { - jj_scanpos = xsp; - if (jj_3_869()) { + if (jj_3R_86()) { jj_scanpos = xsp; - if (jj_3_870()) return true; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } + if (jj_3R_87()) return true; } + if (jj_scan_token(LAMBDA)) return true; + return false; + } + + final private boolean jj_3_1656() { + if (jj_scan_token(MICROSECOND)) return true; return false; } final private boolean jj_3_1655() { - if (jj_scan_token(SCALE)) return true; + if (jj_scan_token(MESSAGE_LENGTH)) return true; return false; } final private boolean jj_3_1654() { - if (jj_scan_token(ROUTINE_SCHEMA)) return true; + if (jj_scan_token(MAP)) return true; return false; } - final private boolean jj_3_344() { - if (jj_scan_token(PARTITION)) return true; - if (jj_scan_token(BY)) return true; + final private boolean jj_3_1653() { + if (jj_scan_token(LIBRARY)) return true; return false; } - final private boolean jj_3_1653() { - if (jj_scan_token(ROUTINE)) return true; + final private boolean jj_3_43() { + if (jj_3R_89()) return true; + return false; + } + + final private boolean jj_3R_203() { + if (jj_3R_198()) return true; return false; } final private boolean jj_3_1652() { - if (jj_scan_token(RETURNING)) return true; + if (jj_scan_token(LAST)) return true; return false; } final private boolean jj_3_1651() { - if (jj_scan_token(RETURNED_LENGTH)) return true; + if (jj_scan_token(KEY_MEMBER)) return true; return false; } - final private boolean jj_3R_173() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_79()) return true; + final private boolean jj_3_1650() { + if (jj_scan_token(JSON)) return true; return false; } - final private boolean jj_3_1650() { - if (jj_scan_token(RESTART)) return true; + final private boolean jj_3_42() { + if (jj_3R_88()) return true; return false; } final private boolean jj_3_1649() { - if (jj_scan_token(REPEATABLE)) return true; + if (jj_scan_token(ISOLATION)) return true; return false; } - final private boolean jj_3R_168() { - if (jj_scan_token(MATCH_RECOGNIZE)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_1648() { + if (jj_scan_token(INSTANTIABLE)) return true; return false; } - final private boolean jj_3_1648() { - if (jj_scan_token(QUARTERS)) return true; + final private boolean jj_3R_371() { + if (jj_3R_420()) return true; return false; } final private boolean jj_3_1647() { - if (jj_scan_token(PRIVILEGES)) return true; + if (jj_scan_token(INITIALLY)) return true; return false; } final private boolean jj_3_1646() { - if (jj_scan_token(PRECEDING)) return true; + if (jj_scan_token(INCLUDE)) return true; return false; } final private boolean jj_3_1645() { - if (jj_scan_token(PLACING)) return true; - return false; - } - - final private boolean jj_3_1644() { - if (jj_scan_token(PAST)) return true; - return false; - } - - final private boolean jj_3_1643() { - if (jj_scan_token(PASCAL)) return true; - return false; - } - - final private boolean jj_3_1642() { - if (jj_scan_token(PARAMETER_SPECIFIC_NAME)) return true; - return false; - } - - final private boolean jj_3_1641() { - if (jj_scan_token(PARAMETER_NAME)) return true; - return false; - } - - final private boolean jj_3_1640() { - if (jj_scan_token(OVERRIDING)) return true; - return false; - } - - final private boolean jj_3_1639() { - if (jj_scan_token(ORDINALITY)) return true; - return false; - } - - final private boolean jj_3_1638() { - if (jj_scan_token(OPTION)) return true; - return false; - } - - final private boolean jj_3_1637() { - if (jj_scan_token(NUMBER)) return true; - return false; - } - - final private boolean jj_3_1636() { - if (jj_scan_token(NORMALIZED)) return true; - return false; - } - - final private boolean jj_3_1635() { - if (jj_scan_token(NAMES)) return true; - return false; - } - - final private boolean jj_3_1634() { - if (jj_scan_token(MORE_)) return true; - return false; - } - - final private boolean jj_3_1633() { - if (jj_scan_token(MINUTES)) return true; - return false; - } - - final private boolean jj_3_1632() { - if (jj_scan_token(MICROSECOND)) return true; - return false; - } - - final private boolean jj_3_1631() { - if (jj_scan_token(MESSAGE_LENGTH)) return true; + if (jj_scan_token(IMMEDIATE)) return true; return false; } - final private boolean jj_3_1630() { - if (jj_scan_token(MAP)) return true; + final private boolean jj_3_40() { + if (jj_3R_81()) return true; return false; } - final private boolean jj_3_1629() { - if (jj_scan_token(LIBRARY)) return true; + final private boolean jj_3_1644() { + if (jj_scan_token(HOURS)) return true; return false; } - final private boolean jj_3_1628() { - if (jj_scan_token(LAST)) return true; + final private boolean jj_3_1643() { + if (jj_scan_token(GROUP_CONCAT)) return true; return false; } - final private boolean jj_3_1627() { - if (jj_scan_token(KEY_MEMBER)) return true; + final private boolean jj_3R_370() { return false; } - final private boolean jj_3_1626() { - if (jj_scan_token(JSON)) return true; + final private boolean jj_3R_221() { + if (jj_scan_token(CURSOR)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_342() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_190()) return true; + final private boolean jj_3_1642() { + if (jj_scan_token(GO)) return true; return false; } - final private boolean jj_3_1625() { - if (jj_scan_token(ISOLATION)) return true; + final private boolean jj_3_1641() { + if (jj_scan_token(GENERAL)) return true; return false; } - final private boolean jj_3R_217() { - if (jj_scan_token(CURSOR)) return true; - if (jj_3R_81()) return true; + final private boolean jj_3_39() { + if (jj_3R_85()) return true; + if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true; return false; } - final private boolean jj_3_1624() { - if (jj_scan_token(INSTANTIABLE)) return true; + final private boolean jj_3_1640() { + if (jj_scan_token(FOUND)) return true; return false; } - final private boolean jj_3_1623() { - if (jj_scan_token(INITIALLY)) return true; + final private boolean jj_3R_197() { + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_1622() { - if (jj_scan_token(INCLUDE)) return true; + final private boolean jj_3_1639() { + if (jj_scan_token(FOLLOWING)) return true; return false; } - final private boolean jj_3_1621() { - if (jj_scan_token(IMMEDIATE)) return true; + final private boolean jj_3_1638() { + if (jj_scan_token(EXCLUDING)) return true; return false; } - final private boolean jj_3_343() { - if (jj_scan_token(AS)) return true; - if (jj_3R_162()) return true; + final private boolean jj_3_1637() { + if (jj_scan_token(ERROR)) return true; return false; } - final private boolean jj_3_1620() { - if (jj_scan_token(HOURS)) return true; + final private boolean jj_3R_155() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_39()) { + jj_scanpos = xsp; + if (jj_3R_370()) return true; + } + xsp = jj_scanpos; + if (jj_3_40()) { + jj_scanpos = xsp; + if (jj_3R_371()) { + jj_scanpos = xsp; + if (jj_3_42()) { + jj_scanpos = xsp; + if (jj_3_43()) return true; + } + } + } return false; } - final private boolean jj_3_1619() { - if (jj_scan_token(GROUP_CONCAT)) return true; + final private boolean jj_3_1636() { + if (jj_scan_token(DYNAMIC_FUNCTION_CODE)) return true; return false; } - final private boolean jj_3_1618() { - if (jj_scan_token(GO)) return true; + final private boolean jj_3_1635() { + if (jj_scan_token(DOY)) return true; return false; } - final private boolean jj_3_1617() { - if (jj_scan_token(GENERAL)) return true; + final private boolean jj_3_1634() { + if (jj_scan_token(DISPATCH)) return true; return false; } - final private boolean jj_3_1616() { - if (jj_scan_token(FOUND)) return true; + final private boolean jj_3_1633() { + if (jj_scan_token(DESCRIPTION)) return true; return false; } - final private boolean jj_3R_190() { - if (jj_3R_134()) return true; + final private boolean jj_3_821() { + if (jj_scan_token(LOCAL)) return true; return false; } - final private boolean jj_3_1615() { - if (jj_scan_token(FOLLOWING)) return true; + final private boolean jj_3_1632() { + if (jj_scan_token(DEPTH)) return true; return false; } - final private boolean jj_3_801() { - if (jj_scan_token(LOCAL)) return true; + final private boolean jj_3_1631() { + if (jj_scan_token(DEFINED)) return true; return false; } - final private boolean jj_3_1614() { - if (jj_scan_token(EXCLUDING)) return true; + final private boolean jj_3_364() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_197()) return true; return false; } - final private boolean jj_3_1613() { - if (jj_scan_token(ERROR)) return true; + final private boolean jj_3_1630() { + if (jj_scan_token(DEFAULTS)) return true; return false; } - final private boolean jj_3_1612() { - if (jj_scan_token(DYNAMIC_FUNCTION_CODE)) return true; + final private boolean jj_3_1629() { + if (jj_scan_token(DAYOFYEAR)) return true; return false; } - final private boolean jj_3_1611() { - if (jj_scan_token(DOY)) return true; + final private boolean jj_3R_411() { return false; } - final private boolean jj_3R_399() { + final private boolean jj_3R_193() { + if (jj_3R_197()) return true; return false; } - final private boolean jj_3_1610() { - if (jj_scan_token(DISPATCH)) return true; + final private boolean jj_3_1628() { + if (jj_scan_token(DATETIME_INTERVAL_PRECISION)) return true; return false; } - final private boolean jj_3_1609() { - if (jj_scan_token(DESCRIPTION)) return true; + final private boolean jj_3_1627() { + if (jj_scan_token(DATE_TRUNC)) return true; return false; } - final private boolean jj_3_1608() { - if (jj_scan_token(DEPTH)) return true; + final private boolean jj_3_1626() { + if (jj_scan_token(DATA)) return true; return false; } - final private boolean jj_3_1607() { - if (jj_scan_token(DEFINED)) return true; + final private boolean jj_3_1625() { + if (jj_scan_token(CONTAINS_SUBSTR)) return true; return false; } - final private boolean jj_3_1606() { - if (jj_scan_token(DEFAULTS)) return true; + final private boolean jj_3_1624() { + if (jj_scan_token(CONSTRAINTS)) return true; return false; } - final private boolean jj_3_803() { + final private boolean jj_3_823() { if (jj_scan_token(WITH)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_801()) jj_scanpos = xsp; + if (jj_3_821()) jj_scanpos = xsp; if (jj_scan_token(TIME)) return true; return false; } - final private boolean jj_3_1605() { - if (jj_scan_token(DAYOFYEAR)) return true; + final private boolean jj_3_1623() { + if (jj_scan_token(CONNECTION_NAME)) return true; return false; } - final private boolean jj_3_1604() { - if (jj_scan_token(DATETIME_INTERVAL_PRECISION)) return true; + final private boolean jj_3_1622() { + if (jj_scan_token(CONDITIONAL)) return true; return false; } - final private boolean jj_3R_290() { + final private boolean jj_3R_294() { Token xsp; xsp = jj_scanpos; - if (jj_3_802()) { + if (jj_3_822()) { jj_scanpos = xsp; - if (jj_3_803()) { + if (jj_3_823()) { jj_scanpos = xsp; - if (jj_3R_399()) return true; + if (jj_3R_411()) return true; } } return false; } - final private boolean jj_3_1603() { - if (jj_scan_token(DATE_TRUNC)) return true; + final private boolean jj_3_1621() { + if (jj_scan_token(COMMAND_FUNCTION)) return true; return false; } - final private boolean jj_3_802() { + final private boolean jj_3_822() { if (jj_scan_token(WITHOUT)) return true; if (jj_scan_token(TIME)) return true; if (jj_scan_token(ZONE)) return true; return false; } - final private boolean jj_3_1602() { - if (jj_scan_token(DATA)) return true; - return false; - } - - final private boolean jj_3_1601() { - if (jj_scan_token(CONTAINS_SUBSTR)) return true; - return false; - } - - final private boolean jj_3_1600() { - if (jj_scan_token(CONSTRAINTS)) return true; - return false; - } - - final private boolean jj_3_1599() { - if (jj_scan_token(CONNECTION_NAME)) return true; - return false; - } - - final private boolean jj_3_1598() { - if (jj_scan_token(CONDITIONAL)) return true; + final private boolean jj_3_1620() { + if (jj_scan_token(COLLATION_NAME)) return true; return false; } - final private boolean jj_3R_376() { + final private boolean jj_3_1619() { + if (jj_scan_token(COBOL)) return true; return false; } - final private boolean jj_3_1597() { - if (jj_scan_token(COMMAND_FUNCTION)) return true; + final private boolean jj_3_1618() { + if (jj_scan_token(CHARACTER_SET_NAME)) return true; return false; } - final private boolean jj_3R_172() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_374()) return true; + final private boolean jj_3_1617() { + if (jj_scan_token(CHARACTERISTICS)) return true; return false; } - final private boolean jj_3_1596() { - if (jj_scan_token(COLLATION_NAME)) return true; + final private boolean jj_3_1616() { + if (jj_scan_token(CATALOG_NAME)) return true; return false; } - final private boolean jj_3_341() { - if (jj_scan_token(EXCLUDE)) return true; - if (jj_scan_token(NULLS)) return true; + final private boolean jj_3_1615() { + if (jj_scan_token(C)) return true; return false; } - final private boolean jj_3_1595() { - if (jj_scan_token(COBOL)) return true; + final private boolean jj_3_363() { + if (jj_scan_token(SUBSET)) return true; + if (jj_3R_196()) return true; return false; } - final private boolean jj_3_340() { - if (jj_scan_token(INCLUDE)) return true; - if (jj_scan_token(NULLS)) return true; + final private boolean jj_3_1614() { + if (jj_scan_token(BEFORE)) return true; return false; } - final private boolean jj_3_1594() { - if (jj_scan_token(CHARACTER_SET_NAME)) return true; + final private boolean jj_3_1613() { + if (jj_scan_token(ASSIGNMENT)) return true; return false; } - final private boolean jj_3_1593() { - if (jj_scan_token(CHARACTERISTICS)) return true; + final private boolean jj_3_1612() { + if (jj_scan_token(ARRAY_CONCAT_AGG)) return true; return false; } - final private boolean jj_3_1592() { - if (jj_scan_token(CATALOG_NAME)) return true; + final private boolean jj_3_1611() { + if (jj_scan_token(ALWAYS)) return true; return false; } - final private boolean jj_3_1591() { - if (jj_scan_token(C)) return true; + final private boolean jj_3_38() { + if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3R_398() { + final private boolean jj_3_362() { + if (jj_scan_token(WITHIN)) return true; + if (jj_3R_195()) return true; return false; } - final private boolean jj_3_1590() { - if (jj_scan_token(BEFORE)) return true; + final private boolean jj_3_1610() { + if (jj_scan_token(ADD)) return true; return false; } - final private boolean jj_3R_177() { - if (jj_scan_token(UNPIVOT)) return true; + final private boolean jj_3R_83() { Token xsp; xsp = jj_scanpos; - if (jj_3_340()) { - jj_scanpos = xsp; - if (jj_3_341()) { + if (jj_3_37()) { jj_scanpos = xsp; - if (jj_3R_376()) return true; - } + if (jj_3_38()) return true; } - if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_1589() { - if (jj_scan_token(ASSIGNMENT)) return true; + final private boolean jj_3_1609() { + if (jj_scan_token(ABSOLUTE)) return true; return false; } - final private boolean jj_3_1588() { - if (jj_scan_token(ARRAY_CONCAT_AGG)) return true; + final private boolean jj_3_37() { + if (jj_scan_token(DISTINCT)) return true; return false; } - final private boolean jj_3_1587() { - if (jj_scan_token(ALWAYS)) return true; + final private boolean jj_3R_410() { return false; } - final private boolean jj_3_1586() { - if (jj_scan_token(ADD)) return true; + final private boolean jj_3_354() { + if (jj_scan_token(LAST)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3R_259() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_800()) { - jj_scanpos = xsp; - if (jj_3R_398()) return true; - } - return false; - } - - final private boolean jj_3_1585() { - if (jj_scan_token(ABSOLUTE)) return true; - return false; - } - - final private boolean jj_3_800() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_260()) return true; - return false; - } - - final private boolean jj_3_28() { - if (jj_3R_77()) return true; - return false; - } - - final private boolean jj_3_27() { - if (jj_3R_76()) return true; + final private boolean jj_3_361() { + if (jj_scan_token(DOLLAR)) return true; return false; } - final private boolean jj_3R_343() { + final private boolean jj_3R_347() { Token xsp; xsp = jj_scanpos; - if (jj_3_1585()) { - jj_scanpos = xsp; - if (jj_3_1586()) { - jj_scanpos = xsp; - if (jj_3_1587()) { - jj_scanpos = xsp; - if (jj_3_1588()) { - jj_scanpos = xsp; - if (jj_3_1589()) { - jj_scanpos = xsp; - if (jj_3_1590()) { - jj_scanpos = xsp; - if (jj_3_1591()) { - jj_scanpos = xsp; - if (jj_3_1592()) { - jj_scanpos = xsp; - if (jj_3_1593()) { - jj_scanpos = xsp; - if (jj_3_1594()) { - jj_scanpos = xsp; - if (jj_3_1595()) { - jj_scanpos = xsp; - if (jj_3_1596()) { - jj_scanpos = xsp; - if (jj_3_1597()) { - jj_scanpos = xsp; - if (jj_3_1598()) { - jj_scanpos = xsp; - if (jj_3_1599()) { - jj_scanpos = xsp; - if (jj_3_1600()) { - jj_scanpos = xsp; - if (jj_3_1601()) { - jj_scanpos = xsp; - if (jj_3_1602()) { - jj_scanpos = xsp; - if (jj_3_1603()) { - jj_scanpos = xsp; - if (jj_3_1604()) { - jj_scanpos = xsp; - if (jj_3_1605()) { - jj_scanpos = xsp; - if (jj_3_1606()) { - jj_scanpos = xsp; - if (jj_3_1607()) { - jj_scanpos = xsp; - if (jj_3_1608()) { - jj_scanpos = xsp; if (jj_3_1609()) { jj_scanpos = xsp; if (jj_3_1610()) { @@ -33981,7 +33715,55 @@ final private boolean jj_3R_343() { jj_scanpos = xsp; if (jj_3_1804()) { jj_scanpos = xsp; - if (jj_3_1805()) return true; + if (jj_3_1805()) { + jj_scanpos = xsp; + if (jj_3_1806()) { + jj_scanpos = xsp; + if (jj_3_1807()) { + jj_scanpos = xsp; + if (jj_3_1808()) { + jj_scanpos = xsp; + if (jj_3_1809()) { + jj_scanpos = xsp; + if (jj_3_1810()) { + jj_scanpos = xsp; + if (jj_3_1811()) { + jj_scanpos = xsp; + if (jj_3_1812()) { + jj_scanpos = xsp; + if (jj_3_1813()) { + jj_scanpos = xsp; + if (jj_3_1814()) { + jj_scanpos = xsp; + if (jj_3_1815()) { + jj_scanpos = xsp; + if (jj_3_1816()) { + jj_scanpos = xsp; + if (jj_3_1817()) { + jj_scanpos = xsp; + if (jj_3_1818()) { + jj_scanpos = xsp; + if (jj_3_1819()) { + jj_scanpos = xsp; + if (jj_3_1820()) { + jj_scanpos = xsp; + if (jj_3_1821()) { + jj_scanpos = xsp; + if (jj_3_1822()) { + jj_scanpos = xsp; + if (jj_3_1823()) { + jj_scanpos = xsp; + if (jj_3_1824()) { + jj_scanpos = xsp; + if (jj_3_1825()) { + jj_scanpos = xsp; + if (jj_3_1826()) { + jj_scanpos = xsp; + if (jj_3_1827()) { + jj_scanpos = xsp; + if (jj_3_1828()) { + jj_scanpos = xsp; + if (jj_3_1829()) return true; } } } @@ -34205,2198 +33987,2088 @@ final private boolean jj_3R_343() { return false; } - final private boolean jj_3R_379() { - return false; - } - - final private boolean jj_3R_206() { + final private boolean jj_3R_263() { Token xsp; xsp = jj_scanpos; - if (jj_3_26()) { + if (jj_3_820()) { jj_scanpos = xsp; - if (jj_3_27()) { - jj_scanpos = xsp; - if (jj_3_28()) return true; - } + if (jj_3R_410()) return true; } return false; } - final private boolean jj_3_26() { - if (jj_3R_75()) return true; + final private boolean jj_3_820() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_264()) return true; return false; } - final private boolean jj_3_1584() { - if (jj_scan_token(FRIDAY)) return true; + final private boolean jj_3_360() { + if (jj_scan_token(CARET)) return true; return false; } - final private boolean jj_3_1583() { - if (jj_scan_token(TUESDAY)) return true; + final private boolean jj_3_1608() { + if (jj_scan_token(SUNDAY)) return true; return false; } - final private boolean jj_3_1582() { - if (jj_scan_token(WITHOUT)) return true; + final private boolean jj_3_1607() { + if (jj_scan_token(THURSDAY)) return true; return false; } - final private boolean jj_3_338() { - if (jj_scan_token(AS)) return true; + final private boolean jj_3_1606() { + if (jj_scan_token(MONDAY)) return true; return false; } - final private boolean jj_3_1581() { - if (jj_scan_token(WIDTH_BUCKET)) return true; + final private boolean jj_3_36() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_84()) return true; return false; } - final private boolean jj_3_1580() { - if (jj_scan_token(VAR_SAMP)) return true; + final private boolean jj_3R_380() { return false; } - final private boolean jj_3_339() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_338()) jj_scanpos = xsp; - if (jj_3R_84()) return true; + final private boolean jj_3_1605() { + if (jj_scan_token(WITHIN)) return true; return false; } - final private boolean jj_3_799() { - if (jj_scan_token(TIMESTAMP)) return true; - if (jj_3R_259()) return true; - if (jj_3R_290()) return true; + final private boolean jj_3_1604() { + if (jj_scan_token(WHENEVER)) return true; return false; } - final private boolean jj_3_1579() { - if (jj_scan_token(VARCHAR)) return true; + final private boolean jj_3_358() { + if (jj_scan_token(PAST)) return true; + if (jj_scan_token(LAST)) return true; return false; } - final private boolean jj_3_1578() { - if (jj_scan_token(VALUE_OF)) return true; + final private boolean jj_3_1603() { + if (jj_scan_token(VAR_POP)) return true; return false; } - final private boolean jj_3_1577() { - if (jj_scan_token(UPSERT)) return true; + final private boolean jj_3R_397() { return false; } - final private boolean jj_3_25() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_1602() { + if (jj_scan_token(VARIANT)) return true; return false; } - final private boolean jj_3_1576() { - if (jj_scan_token(UNIQUE)) return true; + final private boolean jj_3R_194() { + Token xsp; + xsp = jj_scanpos; + if (jj_scan_token(304)) jj_scanpos = xsp; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_1575() { - if (jj_scan_token(TRUNCATE)) return true; + final private boolean jj_3_1601() { + if (jj_scan_token(VALUE)) return true; return false; } - final private boolean jj_3_24() { - if (jj_3R_74()) return true; + final private boolean jj_3_1600() { + if (jj_scan_token(UPPER)) return true; return false; } - final private boolean jj_3R_189() { - if (jj_3R_162()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_339()) { - jj_scanpos = xsp; - if (jj_3R_379()) return true; - } + final private boolean jj_3_35() { + if (jj_3R_83()) return true; return false; } - final private boolean jj_3_1574() { + final private boolean jj_3_1599() { + if (jj_scan_token(UNIQUE)) return true; + return false; + } + + final private boolean jj_3_1598() { + if (jj_scan_token(TRUNCATE)) return true; + return false; + } + + final private boolean jj_3_819() { + if (jj_scan_token(TIMESTAMP)) return true; + if (jj_3R_263()) return true; + if (jj_3R_294()) return true; + return false; + } + + final private boolean jj_3_1597() { if (jj_scan_token(TRIGGER)) return true; return false; } - final private boolean jj_3_1573() { + final private boolean jj_3_1596() { if (jj_scan_token(TRANSLATE_REGEX)) return true; return false; } - final private boolean jj_3_1572() { + final private boolean jj_3_1595() { if (jj_scan_token(TIMEZONE_MINUTE)) return true; return false; } - final private boolean jj_3_798() { - if (jj_scan_token(TIME)) return true; - if (jj_3R_259()) return true; - if (jj_3R_290()) return true; + final private boolean jj_3R_224() { + if (jj_scan_token(LPAREN)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_35()) { + jj_scanpos = xsp; + if (jj_3R_397()) return true; + } return false; } - final private boolean jj_3_1571() { + final private boolean jj_3_1594() { if (jj_scan_token(TIME)) return true; return false; } - final private boolean jj_3_1570() { + final private boolean jj_3_1593() { if (jj_scan_token(SYSTEM_TIME)) return true; return false; } - final private boolean jj_3_1569() { + final private boolean jj_3_1592() { if (jj_scan_token(SUCCEEDS)) return true; return false; } - final private boolean jj_3_22() { - if (jj_scan_token(ALL)) return true; - return false; - } - - final private boolean jj_3_1568() { + final private boolean jj_3_1591() { if (jj_scan_token(SUBSET)) return true; return false; } - final private boolean jj_3R_285() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_797()) { - jj_scanpos = xsp; - if (jj_3_798()) { - jj_scanpos = xsp; - if (jj_3_799()) return true; - } - } - return false; - } - - final private boolean jj_3_1567() { + final private boolean jj_3_1590() { if (jj_scan_token(STDDEV_SAMP)) return true; return false; } - final private boolean jj_3_797() { - if (jj_scan_token(DATE)) return true; + final private boolean jj_3_818() { + if (jj_scan_token(TIME)) return true; + if (jj_3R_263()) return true; + if (jj_3R_294()) return true; return false; } - final private boolean jj_3_1566() { + final private boolean jj_3_1589() { if (jj_scan_token(START)) return true; return false; } - final private boolean jj_3_1565() { + final private boolean jj_3_1588() { if (jj_scan_token(SQLSTATE)) return true; return false; } - final private boolean jj_3_21() { - if (jj_3R_74()) return true; + final private boolean jj_3_1587() { + if (jj_scan_token(SPECIFICTYPE)) return true; return false; } - final private boolean jj_3_1564() { - if (jj_scan_token(SPECIFICTYPE)) return true; + final private boolean jj_3_1586() { + if (jj_scan_token(SKIP_)) return true; return false; } - final private boolean jj_3_335() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_189()) return true; + final private boolean jj_3_356() { + if (jj_scan_token(FIRST)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_1563() { - if (jj_scan_token(SKIP_)) return true; + final private boolean jj_3R_289() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_817()) { + jj_scanpos = xsp; + if (jj_3_818()) { + jj_scanpos = xsp; + if (jj_3_819()) return true; + } + } return false; } - final private boolean jj_3_337() { - if (jj_scan_token(AS)) return true; + final private boolean jj_3_1585() { + if (jj_scan_token(SESSION_USER)) return true; return false; } - final private boolean jj_3_1562() { - if (jj_scan_token(SESSION_USER)) return true; + final private boolean jj_3_817() { + if (jj_scan_token(DATE)) return true; return false; } - final private boolean jj_3_1561() { + final private boolean jj_3_1584() { if (jj_scan_token(SECOND)) return true; return false; } - final private boolean jj_3_1560() { + final private boolean jj_3_1583() { if (jj_scan_token(SCOPE)) return true; return false; } - final private boolean jj_3_1559() { + final private boolean jj_3_1582() { if (jj_scan_token(SAFE_OFFSET)) return true; return false; } - final private boolean jj_3_1558() { + final private boolean jj_3_1581() { if (jj_scan_token(ROW_NUMBER)) return true; return false; } - final private boolean jj_3_1557() { + final private boolean jj_3_1580() { if (jj_scan_token(ROLLBACK)) return true; return false; } - final private boolean jj_3_23() { - if (jj_3R_74()) return true; - if (jj_scan_token(COMMA)) return true; - return false; - } - - final private boolean jj_3_18() { + final private boolean jj_3_355() { if (jj_scan_token(NEXT)) return true; + if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_792() { - if (jj_scan_token(CHAR)) return true; - return false; - } - - final private boolean jj_3_1556() { + final private boolean jj_3_1579() { if (jj_scan_token(RETURN)) return true; return false; } - final private boolean jj_3_1555() { - if (jj_scan_token(RELEASE)) return true; + final private boolean jj_3R_413() { + if (jj_3R_224()) return true; return false; } - final private boolean jj_3_334() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_188()) return true; + final private boolean jj_3_1578() { + if (jj_scan_token(RELEASE)) return true; return false; } - final private boolean jj_3_1554() { + final private boolean jj_3_1577() { if (jj_scan_token(REGR_SXX)) return true; return false; } - final private boolean jj_3R_188() { - if (jj_3R_378()) return true; - return false; - } - - final private boolean jj_3_1553() { + final private boolean jj_3_1576() { if (jj_scan_token(REGR_INTERCEPT)) return true; return false; } - final private boolean jj_3_796() { - if (jj_scan_token(CHARACTER)) return true; - if (jj_scan_token(SET)) return true; - return false; - } - - final private boolean jj_3_1552() { + final private boolean jj_3_1575() { if (jj_scan_token(REGR_AVGX)) return true; return false; } - final private boolean jj_3_1551() { - if (jj_scan_token(REF)) return true; + final private boolean jj_3_812() { + if (jj_scan_token(CHAR)) return true; return false; } - final private boolean jj_3R_289() { + final private boolean jj_3_1574() { + if (jj_scan_token(REF)) return true; return false; } - final private boolean jj_3R_72() { - if (jj_scan_token(LIMIT)) return true; + final private boolean jj_3_357() { + if (jj_scan_token(TO)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_23()) { + if (jj_3_355()) { jj_scanpos = xsp; - if (jj_3_24()) { + if (jj_3_356()) { jj_scanpos = xsp; - if (jj_3_25()) return true; + lookingAhead = true; + jj_semLA = true; + lookingAhead = false; + if (!jj_semLA || jj_3R_194()) return true; } } return false; } - final private boolean jj_3_1550() { + final private boolean jj_3_1573() { if (jj_scan_token(READS)) return true; return false; } - final private boolean jj_3_1549() { + final private boolean jj_3_1572() { if (jj_scan_token(QUALIFY)) return true; return false; } - final private boolean jj_3_795() { - if (jj_scan_token(VARCHAR)) return true; + final private boolean jj_3_1571() { + if (jj_scan_token(PREPARE)) return true; return false; } - final private boolean jj_3_1548() { - if (jj_scan_token(PREPARE)) return true; + final private boolean jj_3_816() { + if (jj_scan_token(CHARACTER)) return true; + if (jj_scan_token(SET)) return true; return false; } - final private boolean jj_3_20() { - if (jj_scan_token(ROWS)) return true; + final private boolean jj_3_1570() { + if (jj_scan_token(POWER)) return true; return false; } - final private boolean jj_3_793() { - if (jj_scan_token(VARYING)) return true; + final private boolean jj_3_1569() { + if (jj_scan_token(PORTION)) return true; return false; } - final private boolean jj_3_1547() { - if (jj_scan_token(POWER)) return true; + final private boolean jj_3R_293() { return false; } - final private boolean jj_3_17() { - if (jj_scan_token(FIRST)) return true; + final private boolean jj_3_1568() { + if (jj_scan_token(PERCENT_RANK)) return true; return false; } - final private boolean jj_3_1546() { - if (jj_scan_token(PORTION)) return true; + final private boolean jj_3_34() { + if (jj_3R_81()) return true; return false; } - final private boolean jj_3_1545() { - if (jj_scan_token(PERCENT_RANK)) return true; + final private boolean jj_3_359() { + if (jj_scan_token(AFTER)) return true; + if (jj_scan_token(MATCH)) return true; return false; } - final private boolean jj_3_1544() { + final private boolean jj_3_1567() { if (jj_scan_token(PERCENT)) return true; return false; } - final private boolean jj_3_1543() { + final private boolean jj_3_815() { + if (jj_scan_token(VARCHAR)) return true; + return false; + } + + final private boolean jj_3_1566() { if (jj_scan_token(PARAMETER)) return true; return false; } - final private boolean jj_3_791() { - if (jj_scan_token(CHARACTER)) return true; + final private boolean jj_3_33() { + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_1542() { - if (jj_scan_token(OVER)) return true; + final private boolean jj_3_813() { + if (jj_scan_token(VARYING)) return true; return false; } - final private boolean jj_3_794() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_791()) { - jj_scanpos = xsp; - if (jj_3_792()) return true; - } - xsp = jj_scanpos; - if (jj_3_793()) { - jj_scanpos = xsp; - if (jj_3R_289()) return true; - } + final private boolean jj_3R_379() { return false; } - final private boolean jj_3_1541() { - if (jj_scan_token(OPEN)) return true; + final private boolean jj_3_1565() { + if (jj_scan_token(OVER)) return true; return false; } - final private boolean jj_3_1540() { - if (jj_scan_token(OMIT)) return true; + final private boolean jj_3_1564() { + if (jj_scan_token(OPEN)) return true; return false; } - final private boolean jj_3_19() { - if (jj_scan_token(ROW)) return true; + final private boolean jj_3_1563() { + if (jj_scan_token(OMIT)) return true; return false; } - final private boolean jj_3_1539() { + final private boolean jj_3_1562() { if (jj_scan_token(OCTET_LENGTH)) return true; return false; } - final private boolean jj_3_1538() { - if (jj_scan_token(NULLIF)) return true; + final private boolean jj_3_353() { + if (jj_scan_token(ALL)) return true; + if (jj_scan_token(ROWS)) return true; return false; } - final private boolean jj_3R_284() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_794()) { - jj_scanpos = xsp; - if (jj_3_795()) return true; - } - if (jj_3R_259()) return true; - xsp = jj_scanpos; - if (jj_3_796()) jj_scanpos = xsp; + final private boolean jj_3_1561() { + if (jj_scan_token(NULLIF)) return true; return false; } - final private boolean jj_3R_73() { - if (jj_scan_token(FETCH)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_17()) { - jj_scanpos = xsp; - if (jj_3_18()) return true; - } + final private boolean jj_3_811() { + if (jj_scan_token(CHARACTER)) return true; return false; } - final private boolean jj_3_1537() { + final private boolean jj_3_1560() { if (jj_scan_token(NORMALIZE)) return true; return false; } - final private boolean jj_3_336() { - if (jj_3R_189()) return true; + final private boolean jj_3_814() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_811()) { + jj_scanpos = xsp; + if (jj_3_812()) return true; + } + xsp = jj_scanpos; + if (jj_3_813()) { + jj_scanpos = xsp; + if (jj_3R_293()) return true; + } return false; } - final private boolean jj_3_1536() { + final private boolean jj_3_1559() { if (jj_scan_token(NEXT)) return true; return false; } - final private boolean jj_3_1535() { + final private boolean jj_3_1558() { if (jj_scan_token(NCHAR)) return true; return false; } - final private boolean jj_3_15() { - if (jj_scan_token(ROWS)) return true; + final private boolean jj_3_352() { + if (jj_scan_token(ONE)) return true; + if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_1534() { + final private boolean jj_3_1557() { if (jj_scan_token(MONTH)) return true; return false; } - final private boolean jj_3_1533() { + final private boolean jj_3_1556() { if (jj_scan_token(MOD)) return true; return false; } - final private boolean jj_3_1532() { - if (jj_scan_token(METHOD)) return true; - return false; - } - - final private boolean jj_3_1531() { - if (jj_scan_token(MEASURE)) return true; + final private boolean jj_3_32() { + if (jj_scan_token(COMMA)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_33()) { + jj_scanpos = xsp; + if (jj_3_34()) return true; + } return false; } - final private boolean jj_3R_176() { - if (jj_scan_token(PIVOT)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3R_378() { return false; } - final private boolean jj_3_1530() { + final private boolean jj_3R_288() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_814()) { + jj_scanpos = xsp; + if (jj_3_815()) return true; + } + if (jj_3R_263()) return true; + xsp = jj_scanpos; + if (jj_3_816()) jj_scanpos = xsp; + return false; + } + + final private boolean jj_3_1555() { + if (jj_scan_token(METHOD)) return true; + return false; + } + + final private boolean jj_3_1554() { + if (jj_scan_token(MEASURE)) return true; + return false; + } + + final private boolean jj_3_1553() { if (jj_scan_token(MATCH_NUMBER)) return true; return false; } - final private boolean jj_3_1529() { + final private boolean jj_3_31() { + if (jj_3R_81()) return true; + return false; + } + + final private boolean jj_3_1552() { if (jj_scan_token(MATCH)) return true; return false; } - final private boolean jj_3_1528() { + final private boolean jj_3_351() { + if (jj_scan_token(MEASURES)) return true; + if (jj_3R_193()) return true; + return false; + } + + final private boolean jj_3_1551() { if (jj_scan_token(LN)) return true; return false; } - final private boolean jj_3_1527() { - if (jj_scan_token(LATERAL)) return true; + final private boolean jj_3_30() { + if (jj_3R_80()) return true; return false; } - final private boolean jj_3_14() { - if (jj_scan_token(ROW)) return true; + final private boolean jj_3_1550() { + if (jj_scan_token(LATERAL)) return true; return false; } - final private boolean jj_3_16() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_14()) { - jj_scanpos = xsp; - if (jj_3_15()) return true; - } + final private boolean jj_3R_377() { return false; } - final private boolean jj_3_1526() { + final private boolean jj_3_1549() { if (jj_scan_token(LANGUAGE)) return true; return false; } - final private boolean jj_3_1525() { + final private boolean jj_3_1548() { if (jj_scan_token(JSON_SCOPE)) return true; return false; } - final private boolean jj_3_1524() { + final private boolean jj_3_1547() { if (jj_scan_token(JSON_OBJECT)) return true; return false; } - final private boolean jj_3R_71() { - if (jj_scan_token(OFFSET)) return true; - if (jj_3R_74()) return true; + final private boolean jj_3_350() { + if (jj_3R_71()) return true; return false; } - final private boolean jj_3_1523() { + final private boolean jj_3_1546() { if (jj_scan_token(JSON_ARRAY)) return true; return false; } - final private boolean jj_3_1522() { + final private boolean jj_3_1545() { if (jj_scan_token(INT)) return true; return false; } - final private boolean jj_3_1521() { + final private boolean jj_3R_376() { + return false; + } + + final private boolean jj_3_1544() { if (jj_scan_token(INITIAL)) return true; return false; } - final private boolean jj_3_1520() { + final private boolean jj_3_1543() { if (jj_scan_token(IDENTITY)) return true; return false; } - final private boolean jj_3_1519() { + final private boolean jj_3_1542() { if (jj_scan_token(GROUPS)) return true; return false; } - final private boolean jj_3_1518() { + final private boolean jj_3_1541() { if (jj_scan_token(GLOBAL)) return true; return false; } - final private boolean jj_3_1517() { - if (jj_scan_token(FUNCTION)) return true; + final private boolean jj_3_349() { + if (jj_scan_token(PARTITION)) return true; + if (jj_scan_token(BY)) return true; return false; } - final private boolean jj_3R_280() { - if (jj_scan_token(MAP)) return true; - if (jj_scan_token(LT)) return true; - if (jj_3R_120()) return true; + final private boolean jj_3_1540() { + if (jj_scan_token(FUNCTION)) return true; return false; } - final private boolean jj_3_1516() { + final private boolean jj_3_1539() { if (jj_scan_token(FOREIGN)) return true; return false; } - final private boolean jj_3_1515() { + final private boolean jj_3_1538() { if (jj_scan_token(FIRST_VALUE)) return true; return false; } - final private boolean jj_3_1514() { + final private boolean jj_3_1537() { if (jj_scan_token(EXTERNAL)) return true; return false; } - final private boolean jj_3_1513() { + final private boolean jj_3_1536() { if (jj_scan_token(EXECUTE)) return true; return false; } - final private boolean jj_3_1512() { + final private boolean jj_3_1535() { if (jj_scan_token(ESCAPE)) return true; return false; } - final private boolean jj_3_1511() { - if (jj_scan_token(END_FRAME)) return true; + final private boolean jj_3R_284() { + if (jj_scan_token(MAP)) return true; + if (jj_scan_token(LT)) return true; + if (jj_3R_121()) return true; return false; } - final private boolean jj_3_1510() { - if (jj_scan_token(EMPTY)) return true; + final private boolean jj_3_1534() { + if (jj_scan_token(END_FRAME)) return true; return false; } - final private boolean jj_3_1509() { - if (jj_scan_token(DYNAMIC)) return true; + final private boolean jj_3_1533() { + if (jj_scan_token(EMPTY)) return true; return false; } - final private boolean jj_3_1508() { - if (jj_scan_token(DISALLOW)) return true; + final private boolean jj_3R_184() { + if (jj_scan_token(LPAREN)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_30()) { + jj_scanpos = xsp; + if (jj_3_31()) return true; + } return false; } - final private boolean jj_3_1507() { - if (jj_scan_token(DEREF)) return true; + final private boolean jj_3_1532() { + if (jj_scan_token(DYNAMIC)) return true; return false; } - final private boolean jj_3_8() { - if (jj_3R_73()) return true; + final private boolean jj_3_348() { + if (jj_scan_token(AS)) return true; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_1506() { - if (jj_scan_token(DECLARE)) return true; + final private boolean jj_3_1531() { + if (jj_scan_token(DISALLOW)) return true; return false; } - final private boolean jj_3_12() { - if (jj_3R_73()) return true; + final private boolean jj_3_1530() { + if (jj_scan_token(DEREF)) return true; return false; } - final private boolean jj_3_1505() { - if (jj_scan_token(DEALLOCATE)) return true; + final private boolean jj_3R_169() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_348()) jj_scanpos = xsp; + if (jj_scan_token(MATCH_RECOGNIZE)) return true; + if (jj_scan_token(LPAREN)) return true; + xsp = jj_scanpos; + if (jj_3_349()) { + jj_scanpos = xsp; + if (jj_3R_376()) return true; + } + xsp = jj_scanpos; + if (jj_3_350()) { + jj_scanpos = xsp; + if (jj_3R_377()) return true; + } + xsp = jj_scanpos; + if (jj_3_351()) { + jj_scanpos = xsp; + if (jj_3R_378()) return true; + } + xsp = jj_scanpos; + if (jj_3_352()) { + jj_scanpos = xsp; + if (jj_3_353()) { + jj_scanpos = xsp; + if (jj_3R_379()) return true; + } + } + xsp = jj_scanpos; + if (jj_3_359()) { + jj_scanpos = xsp; + if (jj_3R_380()) return true; + } + if (jj_scan_token(PATTERN)) return true; return false; } - final private boolean jj_3R_167() { - if (jj_scan_token(FOR)) return true; - if (jj_scan_token(SYSTEM_TIME)) return true; + final private boolean jj_3_1529() { + if (jj_scan_token(DECLARE)) return true; return false; } - final private boolean jj_3_1504() { - if (jj_scan_token(DATE)) return true; + final private boolean jj_3_1528() { + if (jj_scan_token(DEALLOCATE)) return true; return false; } - final private boolean jj_3R_279() { - if (jj_scan_token(ROW)) return true; - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_417()) return true; + final private boolean jj_3_1527() { + if (jj_scan_token(DATE)) return true; return false; } - final private boolean jj_3_1503() { + final private boolean jj_3_1526() { if (jj_scan_token(CURRENT_TRANSFORM_GROUP_FOR_TYPE)) return true; return false; } - final private boolean jj_3_1502() { + final private boolean jj_3_1525() { if (jj_scan_token(CURRENT_PATH)) return true; return false; } - final private boolean jj_3_1501() { + final private boolean jj_3_1524() { if (jj_scan_token(CURRENT)) return true; return false; } - final private boolean jj_3_1500() { + final private boolean jj_3_1523() { if (jj_scan_token(COVAR_SAMP)) return true; return false; } - final private boolean jj_3_7() { - if (jj_3R_72()) return true; - return false; - } - - final private boolean jj_3_9() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_7()) { - jj_scanpos = xsp; - if (jj_3_8()) return true; - } + final private boolean jj_3_1522() { + if (jj_scan_token(CORRESPONDING)) return true; return false; } - final private boolean jj_3_1499() { - if (jj_scan_token(CORRESPONDING)) return true; + final private boolean jj_3R_283() { + if (jj_scan_token(ROW)) return true; + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_430()) return true; return false; } - final private boolean jj_3_1498() { + final private boolean jj_3_1521() { if (jj_scan_token(CONTAINS)) return true; return false; } - final private boolean jj_3_1497() { + final private boolean jj_3_1520() { if (jj_scan_token(COMMIT)) return true; return false; } - final private boolean jj_3_1496() { + final private boolean jj_3_1519() { if (jj_scan_token(COALESCE)) return true; return false; } - final private boolean jj_3_1495() { + final private boolean jj_3_1518() { if (jj_scan_token(CLASSIFIER)) return true; return false; } - final private boolean jj_3_1494() { + final private boolean jj_3_1517() { if (jj_scan_token(CHARACTER_LENGTH)) return true; return false; } - final private boolean jj_3_6() { - if (jj_3R_71()) return true; - return false; - } - - final private boolean jj_3_11() { - if (jj_3R_71()) return true; - return false; - } - - final private boolean jj_3_1493() { + final private boolean jj_3_1516() { if (jj_scan_token(CEILING)) return true; return false; } - final private boolean jj_3_1492() { + final private boolean jj_3_1515() { if (jj_scan_token(CARDINALITY)) return true; return false; } - final private boolean jj_3_1491() { + final private boolean jj_3_1514() { if (jj_scan_token(BOOLEAN)) return true; return false; } - final private boolean jj_3_10() { - if (jj_3R_72()) return true; - return false; - } - - final private boolean jj_3_13() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_10()) { - jj_scanpos = xsp; - if (jj_3_11()) { - jj_scanpos = xsp; - if (jj_3_12()) return true; - } - } - return false; - } - - final private boolean jj_3_1490() { + final private boolean jj_3_1513() { if (jj_scan_token(BINARY)) return true; return false; } - final private boolean jj_3_1489() { + final private boolean jj_3_1512() { if (jj_scan_token(BEGIN_FRAME)) return true; return false; } - final private boolean jj_3R_406() { - return false; - } - - final private boolean jj_3_1488() { + final private boolean jj_3_1511() { if (jj_scan_token(AUTHORIZATION)) return true; return false; } - final private boolean jj_3_1487() { - if (jj_scan_token(ASOF)) return true; + final private boolean jj_3_29() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_79()) return true; return false; } - final private boolean jj_3_5() { - if (jj_3R_70()) return true; + final private boolean jj_3_1510() { + if (jj_scan_token(ASOF)) return true; return false; } - final private boolean jj_3_1486() { + final private boolean jj_3_1509() { if (jj_scan_token(ARE)) return true; return false; } - final private boolean jj_3_1485() { + final private boolean jj_3_1508() { if (jj_scan_token(ABS)) return true; return false; } - final private boolean jj_3_1484() { + final private boolean jj_3_1507() { if (jj_scan_token(ANALYZE)) return true; return false; } - final private boolean jj_3R_288() { - if (jj_3R_84()) return true; + final private boolean jj_3_1506() { + if (jj_scan_token(QUERY)) return true; return false; } - final private boolean jj_3_1483() { - if (jj_scan_token(QUERY)) return true; + final private boolean jj_3_346() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_192()) return true; return false; } - final private boolean jj_3_1482() { + final private boolean jj_3_1505() { if (jj_scan_token(SERVICE)) return true; return false; } - final private boolean jj_3_1481() { + final private boolean jj_3_1504() { if (jj_scan_token(KILL)) return true; return false; } - final private boolean jj_3R_348() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_5()) { - jj_scanpos = xsp; - if (jj_3R_406()) return true; - } - xsp = jj_scanpos; - if (jj_3_13()) jj_scanpos = xsp; + final private boolean jj_3_1503() { + if (jj_scan_token(LOGGING)) return true; return false; } - final private boolean jj_3_1480() { - if (jj_scan_token(LOGGING)) return true; + final private boolean jj_3_1502() { + if (jj_scan_token(ENCRYPTED)) return true; return false; } - final private boolean jj_3_1479() { - if (jj_scan_token(ENCRYPTED)) return true; + final private boolean jj_3R_292() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_1478() { + final private boolean jj_3_1501() { if (jj_scan_token(VALUE_TYPE)) return true; return false; } - final private boolean jj_3R_373() { - if (jj_3R_411()) return true; + final private boolean jj_3_347() { + if (jj_scan_token(AS)) return true; + if (jj_3R_163()) return true; return false; } - final private boolean jj_3_1477() { + final private boolean jj_3_1500() { if (jj_scan_token(CACHE_GROUP)) return true; return false; } - final private boolean jj_3_1476() { + final private boolean jj_3_1499() { if (jj_scan_token(AFFINITY_KEY)) return true; return false; } - final private boolean jj_3_1475() { + final private boolean jj_3_1498() { if (jj_scan_token(ZONE)) return true; return false; } - final private boolean jj_3_1474() { + final private boolean jj_3_1497() { if (jj_scan_token(WRITE)) return true; return false; } - final private boolean jj_3_790() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_288()) return true; - return false; - } - - final private boolean jj_3_1473() { + final private boolean jj_3_1496() { if (jj_scan_token(WEEKS)) return true; return false; } - final private boolean jj_3_1472() { - if (jj_scan_token(VERSION)) return true; + final private boolean jj_3R_192() { + if (jj_3R_135()) return true; return false; } - final private boolean jj_3R_417() { - if (jj_3R_288()) return true; + final private boolean jj_3_1495() { + if (jj_scan_token(VERSION)) return true; return false; } - final private boolean jj_3_1471() { + final private boolean jj_3_1494() { if (jj_scan_token(UTF16)) return true; return false; } - final private boolean jj_3_1470() { + final private boolean jj_3_1493() { if (jj_scan_token(USER_DEFINED_TYPE_CODE)) return true; return false; } - final private boolean jj_3_1469() { + final private boolean jj_3_1492() { if (jj_scan_token(UNNAMED)) return true; return false; } - final private boolean jj_3_1468() { - if (jj_scan_token(UNCONDITIONAL)) return true; + final private boolean jj_3_810() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_292()) return true; return false; } - final private boolean jj_3_1467() { - if (jj_scan_token(TYPE)) return true; + final private boolean jj_3R_174() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_80()) return true; return false; } - final private boolean jj_3_1466() { - if (jj_scan_token(TRIGGER_NAME)) return true; + final private boolean jj_3_1491() { + if (jj_scan_token(UNCONDITIONAL)) return true; return false; } - final private boolean jj_3_1465() { - if (jj_scan_token(TRANSFORM)) return true; + final private boolean jj_3_1490() { + if (jj_scan_token(TYPE)) return true; return false; } - final private boolean jj_3_332() { - if (jj_scan_token(NULLS)) return true; - if (jj_scan_token(LAST)) return true; + final private boolean jj_3R_430() { + if (jj_3R_292()) return true; return false; } - final private boolean jj_3R_79() { - if (jj_3R_347()) return true; - if (jj_3R_348()) return true; + final private boolean jj_3_1489() { + if (jj_scan_token(TRIGGER_NAME)) return true; return false; } - final private boolean jj_3_1464() { + final private boolean jj_3_1488() { + if (jj_scan_token(TRANSFORM)) return true; + return false; + } + + final private boolean jj_3_1487() { if (jj_scan_token(TRANSACTIONS_ACTIVE)) return true; return false; } - final private boolean jj_3_1463() { + final private boolean jj_3_1486() { if (jj_scan_token(TIMESTAMP_TRUNC)) return true; return false; } - final private boolean jj_3_1462() { + final private boolean jj_3_1485() { if (jj_scan_token(TIMESTAMPADD)) return true; return false; } - final private boolean jj_3_1461() { + final private boolean jj_3_1484() { if (jj_scan_token(TIES)) return true; return false; } - final private boolean jj_3_1460() { + final private boolean jj_3_1483() { if (jj_scan_token(SUBSTITUTE)) return true; return false; } - final private boolean jj_3_333() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_331()) { - jj_scanpos = xsp; - if (jj_3_332()) return true; - } - return false; - } - - final private boolean jj_3_331() { - if (jj_scan_token(NULLS)) return true; - if (jj_scan_token(FIRST)) return true; - return false; - } - - final private boolean jj_3R_377() { + final private boolean jj_3_1482() { + if (jj_scan_token(STRUCTURE)) return true; return false; } - final private boolean jj_3_1459() { - if (jj_scan_token(STRUCTURE)) return true; + final private boolean jj_3_1481() { + if (jj_scan_token(STATE)) return true; return false; } - final private boolean jj_3_1458() { - if (jj_scan_token(STATE)) return true; + final private boolean jj_3_1480() { + if (jj_scan_token(SQL_TSI_YEAR)) return true; return false; } - final private boolean jj_3R_181() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_789()) { - jj_scanpos = xsp; - if (jj_3R_377()) return true; - } + final private boolean jj_3_1479() { + if (jj_scan_token(SQL_TSI_QUARTER)) return true; return false; } - final private boolean jj_3_1457() { - if (jj_scan_token(SQL_TSI_YEAR)) return true; + final private boolean jj_3_1478() { + if (jj_scan_token(SQL_TSI_MICROSECOND)) return true; return false; } - final private boolean jj_3_789() { - if (jj_scan_token(NOT)) return true; - if (jj_scan_token(NULL)) return true; + final private boolean jj_3R_386() { return false; } - final private boolean jj_3_1456() { - if (jj_scan_token(SQL_TSI_QUARTER)) return true; + final private boolean jj_3R_385() { return false; } - final private boolean jj_3_1455() { - if (jj_scan_token(SQL_TSI_MICROSECOND)) return true; + final private boolean jj_3_1477() { + if (jj_scan_token(SQL_TSI_DAY)) return true; return false; } - final private boolean jj_3_329() { - if (jj_scan_token(DESC)) return true; + final private boolean jj_3_1476() { + if (jj_scan_token(SQL_TIME)) return true; return false; } - final private boolean jj_3_1454() { - if (jj_scan_token(SQL_TSI_DAY)) return true; + final private boolean jj_3_345() { + if (jj_scan_token(EXCLUDE)) return true; + if (jj_scan_token(NULLS)) return true; return false; } - final private boolean jj_3_330() { + final private boolean jj_3R_182() { Token xsp; xsp = jj_scanpos; - if (jj_3_328()) { + if (jj_3_809()) { jj_scanpos = xsp; - if (jj_3_329()) return true; + if (jj_3R_386()) return true; } return false; } - final private boolean jj_3_328() { - if (jj_scan_token(ASC)) return true; + final private boolean jj_3_1475() { + if (jj_scan_token(SQL_NVARCHAR)) return true; return false; } - final private boolean jj_3_1453() { - if (jj_scan_token(SQL_TIME)) return true; + final private boolean jj_3_344() { + if (jj_scan_token(INCLUDE)) return true; + if (jj_scan_token(NULLS)) return true; return false; } - final private boolean jj_3_1452() { - if (jj_scan_token(SQL_NVARCHAR)) return true; + final private boolean jj_3_809() { + if (jj_scan_token(NOT)) return true; + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_1451() { + final private boolean jj_3_1474() { if (jj_scan_token(SQL_NCHAR)) return true; return false; } - final private boolean jj_3_1450() { + final private boolean jj_3_1473() { if (jj_scan_token(SQL_LONGVARBINARY)) return true; return false; } - final private boolean jj_3_1449() { + final private boolean jj_3_1472() { if (jj_scan_token(SQL_INTERVAL_SECOND)) return true; return false; } - final private boolean jj_3R_156() { - if (jj_3R_81()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_330()) jj_scanpos = xsp; - xsp = jj_scanpos; - if (jj_3_333()) jj_scanpos = xsp; - return false; - } - - final private boolean jj_3_1448() { + final private boolean jj_3_1471() { if (jj_scan_token(SQL_INTERVAL_MINUTE)) return true; return false; } - final private boolean jj_3_1447() { + final private boolean jj_3_1470() { if (jj_scan_token(SQL_INTERVAL_HOUR)) return true; return false; } - final private boolean jj_3_788() { - if (jj_scan_token(NOT)) return true; - if (jj_scan_token(NULL)) return true; + final private boolean jj_3R_178() { + if (jj_scan_token(UNPIVOT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_344()) { + jj_scanpos = xsp; + if (jj_3_345()) { + jj_scanpos = xsp; + if (jj_3R_385()) return true; + } + } + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_1446() { + final private boolean jj_3_1469() { if (jj_scan_token(SQL_INTERVAL_DAY_TO_HOUR)) return true; return false; } - final private boolean jj_3_1445() { + final private boolean jj_3_1468() { if (jj_scan_token(SQL_FLOAT)) return true; return false; } - final private boolean jj_3_787() { - if (jj_scan_token(NULL)) return true; - return false; - } - - final private boolean jj_3_1444() { + final private boolean jj_3_1467() { if (jj_scan_token(SQL_DATE)) return true; return false; } - final private boolean jj_3_1443() { + final private boolean jj_3_1466() { if (jj_scan_token(SQL_BOOLEAN)) return true; return false; } - final private boolean jj_3_1442() { + final private boolean jj_3_1465() { if (jj_scan_token(SQL_BINARY)) return true; return false; } - final private boolean jj_3_1441() { - if (jj_scan_token(SPACE)) return true; + final private boolean jj_3_808() { + if (jj_scan_token(NOT)) return true; + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_1440() { + final private boolean jj_3_1464() { + if (jj_scan_token(SPACE)) return true; + return false; + } + + final private boolean jj_3_1463() { if (jj_scan_token(SIMPLE)) return true; return false; } - final private boolean jj_3_1439() { - if (jj_scan_token(SERVER_NAME)) return true; + final private boolean jj_3_807() { + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_1438() { - if (jj_scan_token(SEQUENCE)) return true; + final private boolean jj_3_1462() { + if (jj_scan_token(SERVER_NAME)) return true; return false; } - final private boolean jj_3_1437() { - if (jj_scan_token(SECURITY)) return true; + final private boolean jj_3_1461() { + if (jj_scan_token(SEQUENCE)) return true; return false; } - final private boolean jj_3_327() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_156()) return true; + final private boolean jj_3_1460() { + if (jj_scan_token(SECURITY)) return true; return false; } - final private boolean jj_3_1436() { + final private boolean jj_3_1459() { if (jj_scan_token(SCOPE_SCHEMA)) return true; return false; } - final private boolean jj_3_1435() { + final private boolean jj_3_1458() { if (jj_scan_token(SCHEMA_NAME)) return true; return false; } - final private boolean jj_3_1434() { - if (jj_scan_token(SCALAR)) return true; + final private boolean jj_3R_388() { return false; } - final private boolean jj_3_1433() { - if (jj_scan_token(ROUTINE_NAME)) return true; + final private boolean jj_3_1457() { + if (jj_scan_token(SCALAR)) return true; return false; } - final private boolean jj_3_786() { - if (jj_scan_token(NOT)) return true; - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_1456() { + if (jj_scan_token(ROUTINE_NAME)) return true; return false; } - final private boolean jj_3_1432() { + final private boolean jj_3_1455() { if (jj_scan_token(ROLE)) return true; return false; } - final private boolean jj_3_1431() { + final private boolean jj_3_1454() { if (jj_scan_token(RETURNED_SQLSTATE)) return true; return false; } - final private boolean jj_3_785() { - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_1453() { + if (jj_scan_token(RETURNED_CARDINALITY)) return true; return false; } - final private boolean jj_3_1430() { - if (jj_scan_token(RETURNED_CARDINALITY)) return true; + final private boolean jj_3_342() { + if (jj_scan_token(AS)) return true; return false; } - final private boolean jj_3_1429() { + final private boolean jj_3_1452() { if (jj_scan_token(RESPECT)) return true; return false; } - final private boolean jj_3_2() { - if (jj_3R_67()) return true; + final private boolean jj_3_1451() { + if (jj_scan_token(RELATIVE)) return true; return false; } - final private boolean jj_3_1428() { - if (jj_scan_token(RELATIVE)) return true; + final private boolean jj_3_343() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_342()) jj_scanpos = xsp; + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_1427() { - if (jj_scan_token(QUARTER)) return true; + final private boolean jj_3_806() { + if (jj_scan_token(NOT)) return true; + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_1() { - if (jj_3R_66()) return true; + final private boolean jj_3_1450() { + if (jj_scan_token(QUARTER)) return true; return false; } - final private boolean jj_3_1426() { + final private boolean jj_3_1449() { if (jj_scan_token(PRIOR)) return true; return false; } - final private boolean jj_3_1425() { - if (jj_scan_token(PLI)) return true; + final private boolean jj_3_805() { + if (jj_scan_token(NULL)) return true; return false; } - final private boolean jj_3_1424() { - if (jj_scan_token(PIVOT)) return true; + final private boolean jj_3_1448() { + if (jj_scan_token(PLI)) return true; return false; } - final private boolean jj_3_4() { - if (jj_3R_69()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_1()) { jj_scanpos = xsp; break; } - } - while (true) { - xsp = jj_scanpos; - if (jj_3_2()) { jj_scanpos = xsp; break; } - } + final private boolean jj_3_1447() { + if (jj_scan_token(PIVOT)) return true; return false; } - final private boolean jj_3_1423() { + final private boolean jj_3_1446() { if (jj_scan_token(PASSTHROUGH)) return true; return false; } - final private boolean jj_3_1422() { - if (jj_scan_token(PARTIAL)) return true; + final private boolean jj_3R_191() { + if (jj_3R_163()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_343()) { + jj_scanpos = xsp; + if (jj_3R_388()) return true; + } return false; } - final private boolean jj_3_1421() { - if (jj_scan_token(PARAMETER_SPECIFIC_CATALOG)) return true; + final private boolean jj_3_1445() { + if (jj_scan_token(PARTIAL)) return true; return false; } - final private boolean jj_3R_70() { - if (jj_scan_token(ORDER)) return true; - if (jj_scan_token(BY)) return true; + final private boolean jj_3_1444() { + if (jj_scan_token(PARAMETER_SPECIFIC_CATALOG)) return true; return false; } - final private boolean jj_3_1420() { + final private boolean jj_3_1443() { if (jj_scan_token(PARAMETER_MODE)) return true; return false; } - final private boolean jj_3_784() { - if (jj_scan_token(ARRAY)) return true; + final private boolean jj_3_1442() { + if (jj_scan_token(OUTPUT)) return true; return false; } - final private boolean jj_3_1419() { - if (jj_scan_token(OUTPUT)) return true; + final private boolean jj_3_1441() { + if (jj_scan_token(ORDERING)) return true; return false; } - final private boolean jj_3_3() { - if (jj_3R_68()) return true; + final private boolean jj_3_1440() { + if (jj_scan_token(OCTETS)) return true; return false; } - final private boolean jj_3_1418() { - if (jj_scan_token(ORDERING)) return true; + final private boolean jj_3_1439() { + if (jj_scan_token(NULLS)) return true; return false; } - final private boolean jj_3_783() { - if (jj_scan_token(MULTISET)) return true; + final private boolean jj_3_1438() { + if (jj_scan_token(NESTING)) return true; return false; } - final private boolean jj_3_1417() { - if (jj_scan_token(OCTETS)) return true; + final private boolean jj_3_804() { + if (jj_scan_token(ARRAY)) return true; return false; } - final private boolean jj_3_1416() { - if (jj_scan_token(NULLS)) return true; + final private boolean jj_3R_173() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_383()) return true; return false; } - final private boolean jj_3_1415() { - if (jj_scan_token(NESTING)) return true; + final private boolean jj_3_1437() { + if (jj_scan_token(NAME)) return true; return false; } - final private boolean jj_3R_374() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_3()) { - jj_scanpos = xsp; - if (jj_3_4()) return true; - } + final private boolean jj_3_1436() { + if (jj_scan_token(MONTHS)) return true; return false; } - final private boolean jj_3_1414() { - if (jj_scan_token(NAME)) return true; + final private boolean jj_3_803() { + if (jj_scan_token(MULTISET)) return true; return false; } - final private boolean jj_3R_277() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_783()) { - jj_scanpos = xsp; - if (jj_3_784()) return true; - } + final private boolean jj_3_1435() { + if (jj_scan_token(MILLISECOND)) return true; return false; } - final private boolean jj_3_1413() { - if (jj_scan_token(MONTHS)) return true; + final private boolean jj_3_339() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_191()) return true; return false; } - final private boolean jj_3_1412() { - if (jj_scan_token(MILLISECOND)) return true; + final private boolean jj_3_1434() { + if (jj_scan_token(MESSAGE_TEXT)) return true; return false; } - final private boolean jj_3_1411() { - if (jj_scan_token(MESSAGE_TEXT)) return true; + final private boolean jj_3_341() { + if (jj_scan_token(AS)) return true; return false; } - final private boolean jj_3_1410() { + final private boolean jj_3_1433() { if (jj_scan_token(MAXVALUE)) return true; return false; } - final private boolean jj_3_1409() { + final private boolean jj_3_1432() { if (jj_scan_token(M)) return true; return false; } - final private boolean jj_3R_149() { - if (jj_scan_token(QUALIFY)) return true; - if (jj_3R_81()) return true; + final private boolean jj_3R_281() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_803()) { + jj_scanpos = xsp; + if (jj_3_804()) return true; + } return false; } - final private boolean jj_3_1408() { + final private boolean jj_3_1431() { if (jj_scan_token(LEVEL)) return true; return false; } - final private boolean jj_3_1407() { + final private boolean jj_3_1430() { if (jj_scan_token(LABEL)) return true; return false; } - final private boolean jj_3_1406() { + final private boolean jj_3_1429() { if (jj_scan_token(KEY)) return true; return false; } - final private boolean jj_3_1405() { + final private boolean jj_3_1428() { if (jj_scan_token(JAVA)) return true; return false; } - final private boolean jj_3_1404() { + final private boolean jj_3_1427() { if (jj_scan_token(ISODOW)) return true; return false; } - final private boolean jj_3_1403() { + final private boolean jj_3_1426() { if (jj_scan_token(INSTANCE)) return true; return false; } - final private boolean jj_3_325() { - if (jj_scan_token(TIES)) return true; + final private boolean jj_3_338() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_190()) return true; return false; } - final private boolean jj_3_1402() { + final private boolean jj_3_1425() { if (jj_scan_token(INCREMENT)) return true; return false; } - final private boolean jj_3_1401() { - if (jj_scan_token(IMPLEMENTATION)) return true; + final private boolean jj_3_28() { + if (jj_3R_78()) return true; return false; } - final private boolean jj_3_324() { - if (jj_scan_token(GROUP)) return true; + final private boolean jj_3R_190() { + if (jj_3R_387()) return true; return false; } - final private boolean jj_3_1400() { + final private boolean jj_3_1424() { + if (jj_scan_token(IMPLEMENTATION)) return true; + return false; + } + + final private boolean jj_3_1423() { if (jj_scan_token(ILIKE)) return true; return false; } - final private boolean jj_3_1399() { - if (jj_scan_token(HOP)) return true; + final private boolean jj_3_27() { + if (jj_3R_77()) return true; return false; } - final private boolean jj_3_323() { - if (jj_scan_token(NO)) return true; - if (jj_scan_token(OTHERS)) return true; + final private boolean jj_3_1422() { + if (jj_scan_token(HOP)) return true; return false; } - final private boolean jj_3_1398() { + final private boolean jj_3_1421() { if (jj_scan_token(GRANTED)) return true; return false; } - final private boolean jj_3_1397() { + final private boolean jj_3_1420() { if (jj_scan_token(GEOMETRY)) return true; return false; } - final private boolean jj_3_322() { - if (jj_scan_token(CURRENT)) return true; - if (jj_scan_token(ROW)) return true; + final private boolean jj_3_1419() { + if (jj_scan_token(G)) return true; return false; } - final private boolean jj_3_1396() { - if (jj_scan_token(G)) return true; + final private boolean jj_3_1418() { + if (jj_scan_token(FORTRAN)) return true; return false; } - final private boolean jj_3_1395() { - if (jj_scan_token(FORTRAN)) return true; + final private boolean jj_3R_207() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_26()) { + jj_scanpos = xsp; + if (jj_3_27()) { + jj_scanpos = xsp; + if (jj_3_28()) return true; + } + } return false; } - final private boolean jj_3_1394() { + final private boolean jj_3_1417() { if (jj_scan_token(FIRST)) return true; return false; } - final private boolean jj_3_1393() { + final private boolean jj_3_26() { + if (jj_3R_76()) return true; + return false; + } + + final private boolean jj_3_1416() { if (jj_scan_token(EXCLUDE)) return true; return false; } - final private boolean jj_3_750() { + final private boolean jj_3_1415() { + if (jj_scan_token(EPOCH)) return true; + return false; + } + + final private boolean jj_3_1414() { + if (jj_scan_token(DYNAMIC_FUNCTION)) return true; + return false; + } + + final private boolean jj_3_1413() { + if (jj_scan_token(DOW)) return true; + return false; + } + + final private boolean jj_3_1412() { + if (jj_scan_token(DIAGNOSTICS)) return true; + return false; + } + + final private boolean jj_3_1411() { + if (jj_scan_token(DESC)) return true; + return false; + } + + final private boolean jj_3_770() { if (jj_scan_token(DOUBLE)) return true; return false; } - final private boolean jj_3_752() { + final private boolean jj_3_772() { if (jj_scan_token(FLOAT)) return true; return false; } - final private boolean jj_3_1392() { - if (jj_scan_token(EPOCH)) return true; + final private boolean jj_3_1410() { + if (jj_scan_token(DEGREE)) return true; return false; } - final private boolean jj_3_744() { + final private boolean jj_3_764() { if (jj_scan_token(SMALLINT)) return true; return false; } - final private boolean jj_3_1391() { - if (jj_scan_token(DYNAMIC_FUNCTION)) return true; + final private boolean jj_3_1409() { + if (jj_scan_token(DEFERRED)) return true; return false; } - final private boolean jj_3_326() { - if (jj_scan_token(EXCLUDE)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_322()) { - jj_scanpos = xsp; - if (jj_3_323()) { - jj_scanpos = xsp; - if (jj_3_324()) { - jj_scanpos = xsp; - if (jj_3_325()) return true; - } - } - } + final private boolean jj_3_25() { + if (jj_scan_token(ALL)) return true; return false; } - final private boolean jj_3_740() { + final private boolean jj_3_760() { if (jj_scan_token(VARBINARY)) return true; return false; } - final private boolean jj_3_746() { + final private boolean jj_3_766() { if (jj_scan_token(BIGINT)) return true; return false; } - final private boolean jj_3_782() { + final private boolean jj_3_802() { if (jj_scan_token(SQL_INTERVAL_SECOND)) return true; return false; } - final private boolean jj_3_1390() { - if (jj_scan_token(DOW)) return true; + final private boolean jj_3_1408() { + if (jj_scan_token(DECADE)) return true; return false; } - final private boolean jj_3_742() { + final private boolean jj_3_340() { + if (jj_3R_191()) return true; + return false; + } + + final private boolean jj_3_762() { if (jj_scan_token(TINYINT)) return true; return false; } - final private boolean jj_3_781() { + final private boolean jj_3_801() { if (jj_scan_token(SQL_INTERVAL_MINUTE_TO_SECOND)) return true; return false; } - final private boolean jj_3_1389() { - if (jj_scan_token(DIAGNOSTICS)) return true; + final private boolean jj_3_1407() { + if (jj_scan_token(DAYOFWEEK)) return true; return false; } - final private boolean jj_3_748() { + final private boolean jj_3_24() { + if (jj_3R_75()) return true; + return false; + } + + final private boolean jj_3_768() { if (jj_scan_token(REAL)) return true; return false; } - final private boolean jj_3_780() { + final private boolean jj_3_800() { if (jj_scan_token(SQL_INTERVAL_MINUTE)) return true; return false; } - final private boolean jj_3_1388() { - if (jj_scan_token(DESC)) return true; + final private boolean jj_3_1406() { + if (jj_scan_token(DATETIME_INTERVAL_CODE)) return true; return false; } - final private boolean jj_3_779() { + final private boolean jj_3_799() { if (jj_scan_token(SQL_INTERVAL_HOUR_TO_SECOND)) return true; return false; } - final private boolean jj_3_1387() { - if (jj_scan_token(DEGREE)) return true; + final private boolean jj_3_1405() { + if (jj_scan_token(DATE_DIFF)) return true; return false; } - final private boolean jj_3_736() { + final private boolean jj_3_756() { if (jj_scan_token(INTEGER)) return true; return false; } - final private boolean jj_3_738() { + final private boolean jj_3_758() { if (jj_scan_token(BINARY)) return true; return false; } - final private boolean jj_3_778() { + final private boolean jj_3_798() { if (jj_scan_token(SQL_INTERVAL_HOUR_TO_MINUTE)) return true; return false; } - final private boolean jj_3_1386() { - if (jj_scan_token(DEFERRED)) return true; + final private boolean jj_3_1404() { + if (jj_scan_token(CURSOR_NAME)) return true; return false; } - final private boolean jj_3_734() { + final private boolean jj_3_754() { if (jj_scan_token(BOOLEAN)) return true; return false; } - final private boolean jj_3_777() { + final private boolean jj_3_797() { if (jj_scan_token(SQL_INTERVAL_HOUR)) return true; return false; } - final private boolean jj_3_1385() { - if (jj_scan_token(DECADE)) return true; + final private boolean jj_3_1403() { + if (jj_scan_token(CONSTRUCTOR)) return true; return false; } - final private boolean jj_3_728() { + final private boolean jj_3_748() { if (jj_scan_token(TIMESTAMP)) return true; return false; } - final private boolean jj_3_732() { + final private boolean jj_3_752() { if (jj_scan_token(NUMERIC)) return true; return false; } - final private boolean jj_3_776() { + final private boolean jj_3_796() { if (jj_scan_token(SQL_INTERVAL_DAY_TO_SECOND)) return true; return false; } - final private boolean jj_3_1384() { - if (jj_scan_token(DAYOFWEEK)) return true; + final private boolean jj_3_1402() { + if (jj_scan_token(CONSTRAINT_NAME)) return true; return false; } - final private boolean jj_3_730() { + final private boolean jj_3_750() { if (jj_scan_token(DECIMAL)) return true; return false; } - final private boolean jj_3_775() { + final private boolean jj_3_795() { if (jj_scan_token(SQL_INTERVAL_DAY_TO_MINUTE)) return true; return false; } - final private boolean jj_3_1383() { - if (jj_scan_token(DATETIME_INTERVAL_CODE)) return true; + final private boolean jj_3R_177() { + if (jj_scan_token(PIVOT)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_774() { + final private boolean jj_3_1401() { + if (jj_scan_token(CONNECTION)) return true; + return false; + } + + final private boolean jj_3_22() { + if (jj_scan_token(ALL)) return true; + return false; + } + + final private boolean jj_3_794() { if (jj_scan_token(SQL_INTERVAL_DAY_TO_HOUR)) return true; return false; } - final private boolean jj_3_1382() { - if (jj_scan_token(DATE_DIFF)) return true; + final private boolean jj_3_1400() { + if (jj_scan_token(COMMITTED)) return true; return false; } - final private boolean jj_3_773() { + final private boolean jj_3_793() { if (jj_scan_token(SQL_INTERVAL_DAY)) return true; return false; } - final private boolean jj_3_1381() { - if (jj_scan_token(CURSOR_NAME)) return true; + final private boolean jj_3_1399() { + if (jj_scan_token(COLUMN_NAME)) return true; return false; } - final private boolean jj_3_772() { + final private boolean jj_3_792() { if (jj_scan_token(SQL_INTERVAL_MONTH)) return true; return false; } - final private boolean jj_3_1380() { - if (jj_scan_token(CONSTRUCTOR)) return true; + final private boolean jj_3_1398() { + if (jj_scan_token(COLLATION_CATALOG)) return true; return false; } - final private boolean jj_3_722() { + final private boolean jj_3_742() { if (jj_scan_token(VARCHAR)) return true; return false; } - final private boolean jj_3_771() { + final private boolean jj_3_791() { if (jj_scan_token(SQL_INTERVAL_YEAR_TO_MONTH)) return true; return false; } - final private boolean jj_3_1379() { - if (jj_scan_token(CONSTRAINT_NAME)) return true; + final private boolean jj_3_1397() { + if (jj_scan_token(CLASS_ORIGIN)) return true; return false; } - final private boolean jj_3_318() { - if (jj_scan_token(FOLLOWING)) return true; + final private boolean jj_3_21() { + if (jj_3R_75()) return true; return false; } - final private boolean jj_3_726() { + final private boolean jj_3_746() { if (jj_scan_token(TIME)) return true; return false; } - final private boolean jj_3_751() { + final private boolean jj_3_771() { if (jj_scan_token(SQL_FLOAT)) return true; return false; } - final private boolean jj_3_770() { + final private boolean jj_3_790() { if (jj_scan_token(SQL_INTERVAL_YEAR)) return true; return false; } - final private boolean jj_3_1378() { - if (jj_scan_token(CONNECTION)) return true; + final private boolean jj_3_1396() { + if (jj_scan_token(CHARACTER_SET_CATALOG)) return true; return false; } - final private boolean jj_3_724() { + final private boolean jj_3_744() { if (jj_scan_token(DATE)) return true; return false; } - final private boolean jj_3_749() { + final private boolean jj_3_769() { if (jj_scan_token(SQL_DOUBLE)) return true; return false; } - final private boolean jj_3_769() { + final private boolean jj_3_789() { Token xsp; xsp = jj_scanpos; - if (jj_3_751()) { + if (jj_3_771()) { jj_scanpos = xsp; - if (jj_3_752()) return true; + if (jj_3_772()) return true; } return false; } - final private boolean jj_3_1377() { - if (jj_scan_token(COMMITTED)) return true; + final private boolean jj_3_1395() { + if (jj_scan_token(CHAIN)) return true; return false; } - final private boolean jj_3_747() { + final private boolean jj_3_767() { if (jj_scan_token(SQL_REAL)) return true; return false; } - final private boolean jj_3_768() { + final private boolean jj_3_788() { Token xsp; xsp = jj_scanpos; - if (jj_3_749()) { + if (jj_3_769()) { jj_scanpos = xsp; - if (jj_3_750()) return true; + if (jj_3_770()) return true; } return false; } - final private boolean jj_3_1376() { - if (jj_scan_token(COLUMN_NAME)) return true; + final private boolean jj_3_1394() { + if (jj_scan_token(CATALOG)) return true; return false; } - final private boolean jj_3_720() { + final private boolean jj_3_740() { if (jj_scan_token(CHAR)) return true; return false; } - final private boolean jj_3_745() { + final private boolean jj_3_765() { if (jj_scan_token(SQL_BIGINT)) return true; return false; } - final private boolean jj_3_767() { + final private boolean jj_3_787() { Token xsp; xsp = jj_scanpos; - if (jj_3_747()) { + if (jj_3_767()) { jj_scanpos = xsp; - if (jj_3_748()) return true; + if (jj_3_768()) return true; } return false; } - final private boolean jj_3_1375() { - if (jj_scan_token(COLLATION_CATALOG)) return true; - return false; - } - - final private boolean jj_3_317() { - if (jj_scan_token(PRECEDING)) return true; + final private boolean jj_3_1393() { + if (jj_scan_token(BREADTH)) return true; return false; } - final private boolean jj_3_743() { + final private boolean jj_3_763() { if (jj_scan_token(SQL_SMALLINT)) return true; return false; } - final private boolean jj_3_766() { + final private boolean jj_3_786() { Token xsp; xsp = jj_scanpos; - if (jj_3_745()) { + if (jj_3_765()) { jj_scanpos = xsp; - if (jj_3_746()) return true; + if (jj_3_766()) return true; } return false; } - final private boolean jj_3_1374() { - if (jj_scan_token(CLASS_ORIGIN)) return true; + final private boolean jj_3_1392() { + if (jj_scan_token(ATTRIBUTES)) return true; return false; } - final private boolean jj_3_741() { + final private boolean jj_3_761() { if (jj_scan_token(SQL_TINYINT)) return true; return false; } - final private boolean jj_3_765() { + final private boolean jj_3_785() { Token xsp; xsp = jj_scanpos; - if (jj_3_743()) { + if (jj_3_763()) { jj_scanpos = xsp; - if (jj_3_744()) return true; + if (jj_3_764()) return true; } return false; } - final private boolean jj_3_1373() { - if (jj_scan_token(CHARACTER_SET_CATALOG)) return true; - return false; + final private boolean jj_3_1391() { + if (jj_scan_token(ASSERTION)) return true; + return false; } - final private boolean jj_3_739() { + final private boolean jj_3_759() { if (jj_scan_token(SQL_VARBINARY)) return true; return false; } - final private boolean jj_3_764() { + final private boolean jj_3_784() { Token xsp; xsp = jj_scanpos; - if (jj_3_741()) { + if (jj_3_761()) { jj_scanpos = xsp; - if (jj_3_742()) return true; + if (jj_3_762()) return true; } return false; } - final private boolean jj_3_1372() { - if (jj_scan_token(CHAIN)) return true; + final private boolean jj_3_1390() { + if (jj_scan_token(ARRAY_AGG)) return true; return false; } - final private boolean jj_3_737() { + final private boolean jj_3_757() { if (jj_scan_token(SQL_BINARY)) return true; return false; } - final private boolean jj_3_763() { + final private boolean jj_3_783() { Token xsp; xsp = jj_scanpos; - if (jj_3_739()) { + if (jj_3_759()) { jj_scanpos = xsp; - if (jj_3_740()) return true; + if (jj_3_760()) return true; } return false; } - final private boolean jj_3_1371() { - if (jj_scan_token(CATALOG)) return true; + final private boolean jj_3_1389() { + if (jj_scan_token(AFTER)) return true; return false; } - final private boolean jj_3_735() { + final private boolean jj_3_23() { + if (jj_3R_75()) return true; + if (jj_scan_token(COMMA)) return true; + return false; + } + + final private boolean jj_3_18() { + if (jj_scan_token(NEXT)) return true; + return false; + } + + final private boolean jj_3_755() { if (jj_scan_token(SQL_INTEGER)) return true; return false; } - final private boolean jj_3_762() { + final private boolean jj_3_782() { Token xsp; xsp = jj_scanpos; - if (jj_3_737()) { + if (jj_3_757()) { jj_scanpos = xsp; - if (jj_3_738()) return true; + if (jj_3_758()) return true; } return false; } - final private boolean jj_3_1370() { - if (jj_scan_token(BREADTH)) return true; + final private boolean jj_3_1388() { + if (jj_scan_token(ADA)) return true; return false; } - final private boolean jj_3_733() { + final private boolean jj_3_753() { if (jj_scan_token(SQL_BOOLEAN)) return true; return false; } - final private boolean jj_3_761() { + final private boolean jj_3_781() { Token xsp; xsp = jj_scanpos; - if (jj_3_735()) { + if (jj_3_755()) { jj_scanpos = xsp; - if (jj_3_736()) return true; + if (jj_3_756()) return true; } return false; } - final private boolean jj_3_1369() { - if (jj_scan_token(ATTRIBUTES)) return true; - return false; - } - - final private boolean jj_3_321() { - if (jj_3R_81()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_317()) { - jj_scanpos = xsp; - if (jj_3_318()) return true; - } + final private boolean jj_3_1387() { + if (jj_scan_token(ABSENT)) return true; return false; } - final private boolean jj_3_731() { + final private boolean jj_3_751() { if (jj_scan_token(SQL_NUMERIC)) return true; return false; } - final private boolean jj_3_760() { + final private boolean jj_3_780() { Token xsp; xsp = jj_scanpos; - if (jj_3_733()) { + if (jj_3_753()) { jj_scanpos = xsp; - if (jj_3_734()) return true; + if (jj_3_754()) return true; } return false; } - final private boolean jj_3_1368() { - if (jj_scan_token(ASSERTION)) return true; - return false; - } - - final private boolean jj_3_316() { - if (jj_scan_token(FOLLOWING)) return true; - return false; - } - - final private boolean jj_3_729() { + final private boolean jj_3_749() { if (jj_scan_token(SQL_DECIMAL)) return true; return false; } - final private boolean jj_3_759() { + final private boolean jj_3_779() { Token xsp; xsp = jj_scanpos; - if (jj_3_731()) { + if (jj_3_751()) { jj_scanpos = xsp; - if (jj_3_732()) return true; + if (jj_3_752()) return true; } return false; } - final private boolean jj_3_1367() { - if (jj_scan_token(ARRAY_AGG)) return true; - return false; - } - - final private boolean jj_3_727() { + final private boolean jj_3_747() { if (jj_scan_token(SQL_TIMESTAMP)) return true; return false; } - final private boolean jj_3_758() { + final private boolean jj_3_778() { Token xsp; xsp = jj_scanpos; - if (jj_3_729()) { + if (jj_3_749()) { jj_scanpos = xsp; - if (jj_3_730()) return true; + if (jj_3_750()) return true; } return false; } - final private boolean jj_3_1366() { - if (jj_scan_token(AFTER)) return true; - return false; - } - - final private boolean jj_3_725() { + final private boolean jj_3_745() { if (jj_scan_token(SQL_TIME)) return true; return false; } - final private boolean jj_3_757() { + final private boolean jj_3_777() { Token xsp; xsp = jj_scanpos; - if (jj_3_727()) { + if (jj_3_747()) { jj_scanpos = xsp; - if (jj_3_728()) return true; + if (jj_3_748()) return true; } return false; } - final private boolean jj_3_1365() { - if (jj_scan_token(ADA)) return true; - return false; - } - - final private boolean jj_3_723() { + final private boolean jj_3_743() { if (jj_scan_token(SQL_DATE)) return true; return false; } - final private boolean jj_3_756() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_725()) { - jj_scanpos = xsp; - if (jj_3_726()) return true; - } - return false; - } - - final private boolean jj_3_1364() { - if (jj_scan_token(ABSENT)) return true; - return false; - } - - final private boolean jj_3_315() { - if (jj_scan_token(PRECEDING)) return true; - return false; - } - - final private boolean jj_3_714() { - if (jj_scan_token(NUMERIC)) return true; - return false; - } - - final private boolean jj_3_721() { - if (jj_scan_token(SQL_VARCHAR)) return true; - return false; - } - - final private boolean jj_3_755() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_723()) { - jj_scanpos = xsp; - if (jj_3_724()) return true; - } - return false; - } - - final private boolean jj_3_719() { - if (jj_scan_token(SQL_CHAR)) return true; - return false; - } - - final private boolean jj_3_754() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_721()) { - jj_scanpos = xsp; - if (jj_3_722()) return true; - } - return false; - } - - final private boolean jj_3_753() { + final private boolean jj_3_776() { Token xsp; xsp = jj_scanpos; - if (jj_3_719()) { + if (jj_3_745()) { jj_scanpos = xsp; - if (jj_3_720()) return true; + if (jj_3_746()) return true; } return false; } - final private boolean jj_3R_342() { + final private boolean jj_3R_346() { Token xsp; xsp = jj_scanpos; - if (jj_3_1364()) { - jj_scanpos = xsp; - if (jj_3_1365()) { - jj_scanpos = xsp; - if (jj_3_1366()) { - jj_scanpos = xsp; - if (jj_3_1367()) { - jj_scanpos = xsp; - if (jj_3_1368()) { - jj_scanpos = xsp; - if (jj_3_1369()) { - jj_scanpos = xsp; - if (jj_3_1370()) { - jj_scanpos = xsp; - if (jj_3_1371()) { - jj_scanpos = xsp; - if (jj_3_1372()) { - jj_scanpos = xsp; - if (jj_3_1373()) { - jj_scanpos = xsp; - if (jj_3_1374()) { - jj_scanpos = xsp; - if (jj_3_1375()) { - jj_scanpos = xsp; - if (jj_3_1376()) { - jj_scanpos = xsp; - if (jj_3_1377()) { - jj_scanpos = xsp; - if (jj_3_1378()) { - jj_scanpos = xsp; - if (jj_3_1379()) { - jj_scanpos = xsp; - if (jj_3_1380()) { - jj_scanpos = xsp; - if (jj_3_1381()) { - jj_scanpos = xsp; - if (jj_3_1382()) { - jj_scanpos = xsp; - if (jj_3_1383()) { - jj_scanpos = xsp; - if (jj_3_1384()) { - jj_scanpos = xsp; - if (jj_3_1385()) { - jj_scanpos = xsp; - if (jj_3_1386()) { - jj_scanpos = xsp; if (jj_3_1387()) { jj_scanpos = xsp; if (jj_3_1388()) { @@ -36791,7 +36463,56 @@ final private boolean jj_3R_342() { jj_scanpos = xsp; if (jj_3_1583()) { jj_scanpos = xsp; - if (jj_3_1584()) return true; + if (jj_3_1584()) { + jj_scanpos = xsp; + if (jj_3_1585()) { + jj_scanpos = xsp; + if (jj_3_1586()) { + jj_scanpos = xsp; + if (jj_3_1587()) { + jj_scanpos = xsp; + if (jj_3_1588()) { + jj_scanpos = xsp; + if (jj_3_1589()) { + jj_scanpos = xsp; + if (jj_3_1590()) { + jj_scanpos = xsp; + if (jj_3_1591()) { + jj_scanpos = xsp; + if (jj_3_1592()) { + jj_scanpos = xsp; + if (jj_3_1593()) { + jj_scanpos = xsp; + if (jj_3_1594()) { + jj_scanpos = xsp; + if (jj_3_1595()) { + jj_scanpos = xsp; + if (jj_3_1596()) { + jj_scanpos = xsp; + if (jj_3_1597()) { + jj_scanpos = xsp; + if (jj_3_1598()) { + jj_scanpos = xsp; + if (jj_3_1599()) { + jj_scanpos = xsp; + if (jj_3_1600()) { + jj_scanpos = xsp; + if (jj_3_1601()) { + jj_scanpos = xsp; + if (jj_3_1602()) { + jj_scanpos = xsp; + if (jj_3_1603()) { + jj_scanpos = xsp; + if (jj_3_1604()) { + jj_scanpos = xsp; + if (jj_3_1605()) { + jj_scanpos = xsp; + if (jj_3_1606()) { + jj_scanpos = xsp; + if (jj_3_1607()) { + jj_scanpos = xsp; + if (jj_3_1608()) return true; + } } } } @@ -37015,1786 +36736,2027 @@ final private boolean jj_3R_342() { return false; } - final private boolean jj_3_320() { - if (jj_scan_token(UNBOUNDED)) return true; + final private boolean jj_3R_73() { + if (jj_scan_token(LIMIT)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_315()) { + if (jj_3_23()) { + jj_scanpos = xsp; + if (jj_3_24()) { jj_scanpos = xsp; - if (jj_3_316()) return true; + if (jj_3_25()) return true; + } } return false; } - final private boolean jj_3_713() { - if (jj_scan_token(DEC)) return true; + final private boolean jj_3_734() { + if (jj_scan_token(NUMERIC)) return true; return false; } - final private boolean jj_3_717() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_287()) return true; + final private boolean jj_3_741() { + if (jj_scan_token(SQL_VARCHAR)) return true; return false; } - final private boolean jj_3_1363() { - if (jj_scan_token(SUNDAY)) return true; + final private boolean jj_3_775() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_743()) { + jj_scanpos = xsp; + if (jj_3_744()) return true; + } return false; } - final private boolean jj_3_1362() { - if (jj_scan_token(THURSDAY)) return true; + final private boolean jj_3_739() { + if (jj_scan_token(SQL_CHAR)) return true; return false; } - final private boolean jj_3R_187() { + final private boolean jj_3_774() { Token xsp; xsp = jj_scanpos; - if (jj_3_319()) { - jj_scanpos = xsp; - if (jj_3_320()) { + if (jj_3_741()) { jj_scanpos = xsp; - if (jj_3_321()) return true; - } + if (jj_3_742()) return true; } return false; } - final private boolean jj_3_1361() { - if (jj_scan_token(MONDAY)) return true; + final private boolean jj_3_20() { + if (jj_scan_token(ROWS)) return true; return false; } - final private boolean jj_3_319() { - if (jj_scan_token(CURRENT)) return true; - if (jj_scan_token(ROW)) return true; + final private boolean jj_3_773() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_739()) { + jj_scanpos = xsp; + if (jj_3_740()) return true; + } return false; } - final private boolean jj_3_1360() { - if (jj_scan_token(WITHIN)) return true; + final private boolean jj_3_17() { + if (jj_scan_token(FIRST)) return true; return false; } - final private boolean jj_3_1359() { - if (jj_scan_token(WHENEVER)) return true; + final private boolean jj_3_1386() { + if (jj_scan_token(SATURDAY)) return true; return false; } - final private boolean jj_3_1358() { - if (jj_scan_token(VAR_POP)) return true; + final private boolean jj_3_1385() { + if (jj_scan_token(WEDNESDAY)) return true; return false; } - final private boolean jj_3_1357() { - if (jj_scan_token(VARIANT)) return true; + final private boolean jj_3R_168() { + if (jj_scan_token(FOR)) return true; + if (jj_scan_token(SYSTEM_TIME)) return true; return false; } - final private boolean jj_3_718() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_260()) return true; + final private boolean jj_3_1384() { + if (jj_scan_token(YEAR)) return true; return false; } - final private boolean jj_3_1356() { - if (jj_scan_token(VALUE)) return true; + final private boolean jj_3_1383() { + if (jj_scan_token(WINDOW)) return true; return false; } - final private boolean jj_3_1355() { - if (jj_scan_token(UPPER)) return true; + final private boolean jj_3_733() { + if (jj_scan_token(DEC)) return true; return false; } - final private boolean jj_3_1354() { - if (jj_scan_token(UESCAPE)) return true; + final private boolean jj_3_1382() { + if (jj_scan_token(VERSIONING)) return true; return false; } - final private boolean jj_3_716() { - if (jj_scan_token(ANY)) return true; + final private boolean jj_3_737() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_291()) return true; return false; } - final private boolean jj_3_1353() { - if (jj_scan_token(TRIM_ARRAY)) return true; + final private boolean jj_3_1381() { + if (jj_scan_token(VARYING)) return true; return false; } - final private boolean jj_3_712() { - if (jj_scan_token(DECIMAL)) return true; + final private boolean jj_3_19() { + if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_1352() { - if (jj_scan_token(TREAT)) return true; + final private boolean jj_3_1380() { + if (jj_scan_token(VARBINARY)) return true; return false; } - final private boolean jj_3_715() { + final private boolean jj_3_1379() { + if (jj_scan_token(UUID)) return true; + return false; + } + + final private boolean jj_3R_74() { + if (jj_scan_token(FETCH)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_712()) { - jj_scanpos = xsp; - if (jj_3_713()) { + if (jj_3_17()) { jj_scanpos = xsp; - if (jj_3_714()) return true; - } + if (jj_3_18()) return true; } return false; } - final private boolean jj_3_1351() { + final private boolean jj_3_1378() { + if (jj_scan_token(UNSIGNED)) return true; + return false; + } + + final private boolean jj_3_1377() { + if (jj_scan_token(UESCAPE)) return true; + return false; + } + + final private boolean jj_3_1376() { + if (jj_scan_token(TRIM_ARRAY)) return true; + return false; + } + + final private boolean jj_3_15() { + if (jj_scan_token(ROWS)) return true; + return false; + } + + final private boolean jj_3_1375() { + if (jj_scan_token(TREAT)) return true; + return false; + } + + final private boolean jj_3_738() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_264()) return true; + return false; + } + + final private boolean jj_3_1374() { if (jj_scan_token(TRANSLATE)) return true; return false; } - final private boolean jj_3_1350() { + final private boolean jj_3_1373() { if (jj_scan_token(TIMEZONE_HOUR)) return true; return false; } - final private boolean jj_3_1349() { + final private boolean jj_3_1372() { if (jj_scan_token(TABLESAMPLE)) return true; return false; } - final private boolean jj_3_1348() { + final private boolean jj_3_736() { + if (jj_scan_token(ANY)) return true; + return false; + } + + final private boolean jj_3_1371() { if (jj_scan_token(SYSTEM)) return true; return false; } - final private boolean jj_3R_283() { + final private boolean jj_3_732() { + if (jj_scan_token(DECIMAL)) return true; + return false; + } + + final private boolean jj_3_1370() { + if (jj_scan_token(SUBSTRING_REGEX)) return true; + return false; + } + + final private boolean jj_3_735() { Token xsp; xsp = jj_scanpos; - if (jj_3_715()) { + if (jj_3_732()) { + jj_scanpos = xsp; + if (jj_3_733()) { jj_scanpos = xsp; - if (jj_3_716()) return true; + if (jj_3_734()) return true; + } } - xsp = jj_scanpos; - if (jj_3_718()) jj_scanpos = xsp; return false; } - final private boolean jj_3_1347() { - if (jj_scan_token(SUBSTRING_REGEX)) return true; + final private boolean jj_3_1369() { + if (jj_scan_token(SUBMULTISET)) return true; return false; } - final private boolean jj_3_314() { - if (jj_scan_token(DISALLOW)) return true; - if (jj_scan_token(PARTIAL)) return true; + final private boolean jj_3_1368() { + if (jj_scan_token(STDDEV_POP)) return true; return false; } - final private boolean jj_3_1346() { - if (jj_scan_token(SUBMULTISET)) return true; + final private boolean jj_3_14() { + if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_1345() { - if (jj_scan_token(STDDEV_POP)) return true; + final private boolean jj_3_16() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_14()) { + jj_scanpos = xsp; + if (jj_3_15()) return true; + } return false; } - final private boolean jj_3_1344() { + final private boolean jj_3_1367() { if (jj_scan_token(SQRT)) return true; return false; } - final private boolean jj_3_1343() { + final private boolean jj_3_1366() { if (jj_scan_token(SQLEXCEPTION)) return true; return false; } - final private boolean jj_3_313() { - if (jj_scan_token(ALLOW)) return true; - if (jj_scan_token(PARTIAL)) return true; + final private boolean jj_3R_287() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_735()) { + jj_scanpos = xsp; + if (jj_3_736()) return true; + } + xsp = jj_scanpos; + if (jj_3_738()) jj_scanpos = xsp; return false; } - final private boolean jj_3_1342() { + final private boolean jj_3_1365() { if (jj_scan_token(SPECIFIC)) return true; return false; } - final private boolean jj_3_1341() { + final private boolean jj_3R_72() { + if (jj_scan_token(OFFSET)) return true; + if (jj_3R_75()) return true; + return false; + } + + final private boolean jj_3_1364() { if (jj_scan_token(SIMILAR)) return true; return false; } - final private boolean jj_3_1340() { + final private boolean jj_3_1363() { if (jj_scan_token(SENSITIVE)) return true; return false; } - final private boolean jj_3_1339() { + final private boolean jj_3_1362() { if (jj_scan_token(SEARCH)) return true; return false; } - final private boolean jj_3_1338() { + final private boolean jj_3_1361() { if (jj_scan_token(SAVEPOINT)) return true; return false; } - final private boolean jj_3_1337() { + final private boolean jj_3_1360() { if (jj_scan_token(SAFE_CAST)) return true; return false; } - final private boolean jj_3R_286() { - return false; - } - - final private boolean jj_3_1336() { + final private boolean jj_3_1359() { if (jj_scan_token(ROWS)) return true; return false; } - final private boolean jj_3_1335() { + final private boolean jj_3_1358() { if (jj_scan_token(REVOKE)) return true; return false; } - final private boolean jj_3_311() { - if (jj_3R_187()) return true; - return false; - } - - final private boolean jj_3_711() { - if (jj_scan_token(VARBINARY)) return true; + final private boolean jj_3R_382() { + if (jj_3R_423()) return true; return false; } - final private boolean jj_3_1334() { + final private boolean jj_3_1357() { if (jj_scan_token(RESULT)) return true; return false; } - final private boolean jj_3_709() { - if (jj_scan_token(VARYING)) return true; - return false; - } - - final private boolean jj_3_1333() { + final private boolean jj_3_1356() { if (jj_scan_token(REGR_SYY)) return true; return false; } - final private boolean jj_3_1332() { + final private boolean jj_3_1355() { if (jj_scan_token(REGR_SLOPE)) return true; return false; } - final private boolean jj_3_310() { - if (jj_scan_token(BETWEEN)) return true; - if (jj_3R_187()) return true; + final private boolean jj_3R_290() { return false; } - final private boolean jj_3_1331() { + final private boolean jj_3_1354() { if (jj_scan_token(REGR_COUNT)) return true; return false; } - final private boolean jj_3_1330() { + final private boolean jj_3_1353() { if (jj_scan_token(REFERENCING)) return true; return false; } - final private boolean jj_3_1329() { - if (jj_scan_token(RECURSIVE)) return true; + final private boolean jj_3_731() { + if (jj_scan_token(VARBINARY)) return true; return false; } - final private boolean jj_3_309() { - if (jj_scan_token(RANGE)) return true; + final private boolean jj_3_1352() { + if (jj_scan_token(RECURSIVE)) return true; return false; } - final private boolean jj_3_1328() { - if (jj_scan_token(RANK)) return true; + final private boolean jj_3_729() { + if (jj_scan_token(VARYING)) return true; return false; } - final private boolean jj_3_710() { - if (jj_scan_token(BINARY)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_709()) { - jj_scanpos = xsp; - if (jj_3R_286()) return true; - } + final private boolean jj_3_1351() { + if (jj_scan_token(RANK)) return true; return false; } - final private boolean jj_3_1327() { + final private boolean jj_3_1350() { if (jj_scan_token(PROCEDURE)) return true; return false; } - final private boolean jj_3_308() { - if (jj_scan_token(ROWS)) return true; - return false; - } - - final private boolean jj_3_1326() { + final private boolean jj_3_1349() { if (jj_scan_token(PRECISION)) return true; return false; } - final private boolean jj_3_1325() { + final private boolean jj_3_1348() { if (jj_scan_token(POSITION_REGEX)) return true; return false; } - final private boolean jj_3_1324() { + final private boolean jj_3_1347() { if (jj_scan_token(PERMUTE)) return true; return false; } - final private boolean jj_3R_282() { + final private boolean jj_3_1346() { + if (jj_scan_token(PERCENTILE_DISC)) return true; + return false; + } + + final private boolean jj_3_730() { + if (jj_scan_token(BINARY)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_710()) { + if (jj_3_729()) { jj_scanpos = xsp; - if (jj_3_711()) return true; + if (jj_3R_290()) return true; } - if (jj_3R_259()) return true; - return false; - } - - final private boolean jj_3_1323() { - if (jj_scan_token(PERCENTILE_DISC)) return true; return false; } - final private boolean jj_3_1322() { + final private boolean jj_3_1345() { if (jj_scan_token(PER)) return true; return false; } - final private boolean jj_3_312() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_308()) { - jj_scanpos = xsp; - if (jj_3_309()) return true; - } - xsp = jj_scanpos; - if (jj_3_310()) { - jj_scanpos = xsp; - if (jj_3_311()) return true; - } + final private boolean jj_3_336() { + if (jj_scan_token(NULLS)) return true; + if (jj_scan_token(LAST)) return true; return false; } - final private boolean jj_3_1321() { + final private boolean jj_3_1344() { if (jj_scan_token(OVERLAY)) return true; return false; } - final private boolean jj_3_1320() { + final private boolean jj_3_1343() { if (jj_scan_token(OUT)) return true; return false; } - final private boolean jj_3_1319() { + final private boolean jj_3_1342() { if (jj_scan_token(ONLY)) return true; return false; } - final private boolean jj_3_1318() { + final private boolean jj_3_8() { + if (jj_3R_74()) return true; + return false; + } + + final private boolean jj_3R_286() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_730()) { + jj_scanpos = xsp; + if (jj_3_731()) return true; + } + if (jj_3R_263()) return true; + return false; + } + + final private boolean jj_3_1341() { if (jj_scan_token(OLD)) return true; return false; } - final private boolean jj_3_307() { - if (jj_3R_70()) return true; + final private boolean jj_3_12() { + if (jj_3R_74()) return true; return false; } - final private boolean jj_3_1317() { + final private boolean jj_3_1340() { if (jj_scan_token(OCCURRENCES_REGEX)) return true; return false; } - final private boolean jj_3_1316() { + final private boolean jj_3_337() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_335()) { + jj_scanpos = xsp; + if (jj_3_336()) return true; + } + return false; + } + + final private boolean jj_3_335() { + if (jj_scan_token(NULLS)) return true; + if (jj_scan_token(FIRST)) return true; + return false; + } + + final private boolean jj_3_1339() { if (jj_scan_token(NTILE)) return true; return false; } - final private boolean jj_3_1315() { + final private boolean jj_3_1338() { if (jj_scan_token(NONE)) return true; return false; } - final private boolean jj_3_1314() { + final private boolean jj_3_1337() { if (jj_scan_token(NEW)) return true; return false; } - final private boolean jj_3_1313() { + final private boolean jj_3_1336() { if (jj_scan_token(NATIONAL)) return true; return false; } - final private boolean jj_3_708() { - if (jj_scan_token(UUID)) return true; + final private boolean jj_3R_189() { + if (jj_3R_374()) return true; return false; } - final private boolean jj_3_1312() { + final private boolean jj_3_1335() { if (jj_scan_token(MODULE)) return true; return false; } - final private boolean jj_3_306() { - if (jj_scan_token(PARTITION)) return true; - if (jj_scan_token(BY)) return true; + final private boolean jj_3_7() { + if (jj_3R_73()) return true; return false; } - final private boolean jj_3_1311() { - if (jj_scan_token(MINUTE)) return true; + final private boolean jj_3_9() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_7()) { + jj_scanpos = xsp; + if (jj_3_8()) return true; + } return false; } - final private boolean jj_3_707() { - if (jj_scan_token(VARIANT)) return true; + final private boolean jj_3_333() { + if (jj_scan_token(DESC)) return true; return false; } - final private boolean jj_3_1310() { - if (jj_scan_token(MEMBER)) return true; + final private boolean jj_3_1334() { + if (jj_scan_token(MINUTE)) return true; return false; } - final private boolean jj_3_696() { - if (jj_scan_token(INT)) return true; + final private boolean jj_3_334() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_332()) { + jj_scanpos = xsp; + if (jj_3_333()) return true; + } return false; } - final private boolean jj_3R_405() { + final private boolean jj_3_332() { + if (jj_scan_token(ASC)) return true; return false; } - final private boolean jj_3_1309() { - if (jj_scan_token(MAX)) return true; + final private boolean jj_3_1333() { + if (jj_scan_token(MEMBER)) return true; return false; } - final private boolean jj_3_697() { - if (jj_scan_token(PRECISION)) return true; + final private boolean jj_3_330() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3_706() { - if (jj_scan_token(FLOAT)) return true; + final private boolean jj_3_1332() { + if (jj_scan_token(MAX)) return true; return false; } - final private boolean jj_3_1308() { + final private boolean jj_3_1331() { if (jj_scan_token(MATCH_CONDITION)) return true; return false; } - final private boolean jj_3_305() { - if (jj_3R_84()) return true; + final private boolean jj_3_728() { + if (jj_scan_token(UUID)) return true; return false; } - final private boolean jj_3_1307() { + final private boolean jj_3_1330() { if (jj_scan_token(LOWER)) return true; return false; } - final private boolean jj_3_1306() { + final private boolean jj_3_1329() { if (jj_scan_token(LIKE_REGEX)) return true; return false; } - final private boolean jj_3_705() { - if (jj_scan_token(DOUBLE)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_697()) jj_scanpos = xsp; + final private boolean jj_3_6() { + if (jj_3R_72()) return true; return false; } - final private boolean jj_3_1305() { + final private boolean jj_3_11() { + if (jj_3R_72()) return true; + return false; + } + + final private boolean jj_3_727() { + if (jj_scan_token(VARIANT)) return true; + return false; + } + + final private boolean jj_3_1328() { if (jj_scan_token(LAST_VALUE)) return true; return false; } - final private boolean jj_3_1304() { + final private boolean jj_3_1327() { if (jj_scan_token(LAG)) return true; return false; } - final private boolean jj_3_704() { - if (jj_scan_token(REAL)) return true; + final private boolean jj_3_716() { + if (jj_scan_token(PRECISION)) return true; return false; } - final private boolean jj_3_1303() { + final private boolean jj_3_726() { + if (jj_scan_token(FLOAT)) return true; + return false; + } + + final private boolean jj_3_1326() { if (jj_scan_token(JSON_QUERY)) return true; return false; } - final private boolean jj_3R_331() { - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_10() { + if (jj_3R_73()) return true; + return false; + } + + final private boolean jj_3_13() { Token xsp; xsp = jj_scanpos; - if (jj_3_305()) { + if (jj_3_10()) { + jj_scanpos = xsp; + if (jj_3_11()) { jj_scanpos = xsp; - if (jj_3R_405()) return true; + if (jj_3_12()) return true; + } } return false; } - final private boolean jj_3_1302() { + final private boolean jj_3_715() { + if (jj_scan_token(UNSIGNED)) return true; + return false; + } + + final private boolean jj_3_1325() { if (jj_scan_token(JSON_EXISTS)) return true; return false; } - final private boolean jj_3_703() { - if (jj_scan_token(BIGINT)) return true; + final private boolean jj_3_331() { + if (jj_scan_token(AS)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_330()) { + jj_scanpos = xsp; + if (jj_3R_189()) return true; + } return false; } - final private boolean jj_3_1301() { + final private boolean jj_3_1324() { if (jj_scan_token(INTERSECTION)) return true; return false; } - final private boolean jj_3_1300() { - if (jj_scan_token(INSENSITIVE)) return true; + final private boolean jj_3_725() { + if (jj_scan_token(DOUBLE)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_716()) jj_scanpos = xsp; return false; } - final private boolean jj_3_702() { - if (jj_scan_token(SMALLINT)) return true; + final private boolean jj_3R_418() { return false; } - final private boolean jj_3_1299() { + final private boolean jj_3_1323() { + if (jj_scan_token(INSENSITIVE)) return true; + return false; + } + + final private boolean jj_3_1322() { if (jj_scan_token(INDICATOR)) return true; return false; } - final private boolean jj_3_1298() { - if (jj_scan_token(HOUR)) return true; + final private boolean jj_3_5() { + if (jj_3R_71()) return true; return false; } - final private boolean jj_3_695() { - if (jj_scan_token(INTEGER)) return true; + final private boolean jj_3_724() { + if (jj_scan_token(REAL)) return true; return false; } - final private boolean jj_3_701() { - if (jj_scan_token(TINYINT)) return true; + final private boolean jj_3_1321() { + if (jj_scan_token(HOUR)) return true; return false; } - final private boolean jj_3_1297() { + final private boolean jj_3_714() { + if (jj_scan_token(UNSIGNED)) return true; + return false; + } + + final private boolean jj_3_1320() { if (jj_scan_token(GROUPING)) return true; return false; } - final private boolean jj_3_1296() { + final private boolean jj_3_1319() { if (jj_scan_token(GET)) return true; return false; } - final private boolean jj_3_700() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_695()) { - jj_scanpos = xsp; - if (jj_3_696()) return true; - } + final private boolean jj_3_1318() { + if (jj_scan_token(FREE)) return true; return false; } - final private boolean jj_3_1295() { - if (jj_scan_token(FREE)) return true; + final private boolean jj_3R_157() { + if (jj_3R_82()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_331()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_334()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_337()) jj_scanpos = xsp; return false; } - final private boolean jj_3_1294() { + final private boolean jj_3_1317() { if (jj_scan_token(FLOOR)) return true; return false; } - final private boolean jj_3_699() { - if (jj_scan_token(BOOLEAN)) return true; + final private boolean jj_3_1316() { + if (jj_scan_token(FILTER)) return true; return false; } - final private boolean jj_3_1293() { - if (jj_scan_token(FILTER)) return true; + final private boolean jj_3R_352() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_5()) { + jj_scanpos = xsp; + if (jj_3R_418()) return true; + } + xsp = jj_scanpos; + if (jj_3_13()) jj_scanpos = xsp; return false; } - final private boolean jj_3_1292() { + final private boolean jj_3_1315() { if (jj_scan_token(EXTEND)) return true; return false; } - final private boolean jj_3_1291() { + final private boolean jj_3_723() { + if (jj_scan_token(BIGINT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_715()) jj_scanpos = xsp; + return false; + } + + final private boolean jj_3_1314() { if (jj_scan_token(EXEC)) return true; return false; } - final private boolean jj_3_1290() { + final private boolean jj_3_1313() { if (jj_scan_token(EQUALS)) return true; return false; } - final private boolean jj_3_1289() { + final private boolean jj_3_713() { + if (jj_scan_token(UNSIGNED)) return true; + return false; + } + + final private boolean jj_3_1312() { if (jj_scan_token(END_EXEC)) return true; return false; } - final private boolean jj_3_1288() { + final private boolean jj_3_1311() { if (jj_scan_token(ELEMENT)) return true; return false; } - final private boolean jj_3_1287() { - if (jj_scan_token(DOUBLE)) return true; + final private boolean jj_3_712() { + if (jj_scan_token(UNSIGNED)) return true; return false; } - final private boolean jj_3_1286() { - if (jj_scan_token(DETERMINISTIC)) return true; + final private boolean jj_3_1310() { + if (jj_scan_token(DOUBLE)) return true; return false; } - final private boolean jj_3_698() { - if (jj_scan_token(GEOMETRY)) return true; + final private boolean jj_3_1309() { + if (jj_scan_token(DETERMINISTIC)) return true; return false; } - final private boolean jj_3_1285() { + final private boolean jj_3_1308() { if (jj_scan_token(DENSE_RANK)) return true; return false; } - final private boolean jj_3_1284() { - if (jj_scan_token(DECIMAL)) return true; + final private boolean jj_3_329() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_157()) return true; return false; } - final private boolean jj_3_1283() { - if (jj_scan_token(DAY)) return true; + final private boolean jj_3_722() { + if (jj_scan_token(SMALLINT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_714()) jj_scanpos = xsp; return false; } - final private boolean jj_3_1282() { - if (jj_scan_token(CYCLE)) return true; + final private boolean jj_3_1307() { + if (jj_scan_token(DECIMAL)) return true; return false; } - final private boolean jj_3R_281() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_698()) { - jj_scanpos = xsp; - if (jj_3_699()) { - jj_scanpos = xsp; - if (jj_3_700()) { - jj_scanpos = xsp; - if (jj_3_701()) { - jj_scanpos = xsp; - if (jj_3_702()) { - jj_scanpos = xsp; - if (jj_3_703()) { - jj_scanpos = xsp; - if (jj_3_704()) { - jj_scanpos = xsp; - if (jj_3_705()) { - jj_scanpos = xsp; - if (jj_3_706()) { - jj_scanpos = xsp; - if (jj_3_707()) { - jj_scanpos = xsp; - if (jj_3_708()) return true; - } - } - } - } - } - } - } - } - } - } + final private boolean jj_3_1306() { + if (jj_scan_token(DAY)) return true; return false; } - final private boolean jj_3R_186() { - if (jj_3R_84()) return true; + final private boolean jj_3_1305() { + if (jj_scan_token(CYCLE)) return true; return false; } - final private boolean jj_3_1281() { + final private boolean jj_3_1304() { if (jj_scan_token(CURRENT_ROW)) return true; return false; } - final private boolean jj_3_1280() { + final private boolean jj_3_1303() { if (jj_scan_token(CURRENT_DEFAULT_TRANSFORM_GROUP)) return true; return false; } - final private boolean jj_3_1279() { + final private boolean jj_3_1302() { if (jj_scan_token(CUME_DIST)) return true; return false; } - final private boolean jj_3_1278() { + final private boolean jj_3_1301() { if (jj_scan_token(COVAR_POP)) return true; return false; } - final private boolean jj_3_1277() { + final private boolean jj_3_711() { + if (jj_scan_token(INT)) return true; + return false; + } + + final private boolean jj_3_721() { + if (jj_scan_token(TINYINT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_713()) jj_scanpos = xsp; + return false; + } + + final private boolean jj_3_1300() { if (jj_scan_token(CORR)) return true; return false; } - final private boolean jj_3_1276() { + final private boolean jj_3R_80() { + if (jj_3R_351()) return true; + if (jj_3R_352()) return true; + return false; + } + + final private boolean jj_3_1299() { if (jj_scan_token(CONNECT)) return true; return false; } - final private boolean jj_3_1275() { + final private boolean jj_3_1298() { if (jj_scan_token(COLLECT)) return true; return false; } - final private boolean jj_3_1274() { + final private boolean jj_3_1297() { if (jj_scan_token(CLOSE)) return true; return false; } - final private boolean jj_3_1273() { + final private boolean jj_3_1296() { if (jj_scan_token(CHECK)) return true; return false; } - final private boolean jj_3_1272() { + final private boolean jj_3_1295() { if (jj_scan_token(CHARACTER)) return true; return false; } - final private boolean jj_3_1271() { + final private boolean jj_3_1294() { if (jj_scan_token(CEIL)) return true; return false; } - final private boolean jj_3_304() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_186()) return true; - return false; - } - - final private boolean jj_3_694() { - if (jj_3R_285()) return true; + final private boolean jj_3_720() { + if (jj_scan_token(UNSIGNED)) return true; return false; } - final private boolean jj_3_1270() { + final private boolean jj_3_1293() { if (jj_scan_token(CALLED)) return true; return false; } - final private boolean jj_3_1269() { + final private boolean jj_3_1292() { if (jj_scan_token(BLOB)) return true; return false; } - final private boolean jj_3_693() { - if (jj_3R_284()) return true; - return false; - } - - final private boolean jj_3_1268() { + final private boolean jj_3_1291() { if (jj_scan_token(BIGINT)) return true; return false; } - final private boolean jj_3_1267() { + final private boolean jj_3_1290() { if (jj_scan_token(BEGIN)) return true; return false; } - final private boolean jj_3_692() { - if (jj_3R_283()) return true; - return false; - } - - final private boolean jj_3_1266() { + final private boolean jj_3_1289() { if (jj_scan_token(ATOMIC)) return true; return false; } - final private boolean jj_3_1265() { - if (jj_scan_token(ASENSITIVE)) return true; + final private boolean jj_3_710() { + if (jj_scan_token(INTEGER)) return true; return false; } - final private boolean jj_3_691() { - if (jj_3R_282()) return true; + final private boolean jj_3_1288() { + if (jj_scan_token(ASENSITIVE)) return true; return false; } - final private boolean jj_3R_148() { - if (jj_scan_token(WINDOW)) return true; - if (jj_3R_186()) return true; + final private boolean jj_3_1287() { + if (jj_scan_token(ALLOW)) return true; return false; } - final private boolean jj_3_1264() { - if (jj_scan_token(ALLOW)) return true; + final private boolean jj_3_719() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_710()) { + jj_scanpos = xsp; + if (jj_3_711()) return true; + } + xsp = jj_scanpos; + if (jj_3_712()) jj_scanpos = xsp; return false; } - final private boolean jj_3_1263() { + final private boolean jj_3_1286() { if (jj_scan_token(TOTAL)) return true; return false; } - final private boolean jj_3_690() { - if (jj_3R_281()) return true; + final private boolean jj_3_1285() { + if (jj_scan_token(REFRESH)) return true; return false; } - final private boolean jj_3_1262() { - if (jj_scan_token(REFRESH)) return true; + final private boolean jj_3_718() { + if (jj_scan_token(BOOLEAN)) return true; return false; } - final private boolean jj_3_1261() { + final private boolean jj_3_1284() { if (jj_scan_token(ASYNC)) return true; return false; } - final private boolean jj_3_1260() { + final private boolean jj_3_1283() { if (jj_scan_token(CONTINUOUS)) return true; return false; } - final private boolean jj_3_1259() { + final private boolean jj_3_1282() { if (jj_scan_token(PASSWORD)) return true; return false; } - final private boolean jj_3R_278() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_690()) { - jj_scanpos = xsp; - if (jj_3_691()) { - jj_scanpos = xsp; - if (jj_3_692()) { - jj_scanpos = xsp; - if (jj_3_693()) { - jj_scanpos = xsp; - if (jj_3_694()) return true; - } - } - } - } - return false; - } - - final private boolean jj_3_1258() { + final private boolean jj_3_1281() { if (jj_scan_token(INLINE_SIZE)) return true; return false; } - final private boolean jj_3_1257() { + final private boolean jj_3_1280() { if (jj_scan_token(WRAP_VALUE)) return true; return false; } - final private boolean jj_3_1256() { + final private boolean jj_3_1279() { if (jj_scan_token(DATA_REGION)) return true; return false; } - final private boolean jj_3_1255() { - if (jj_scan_token(WRITE_SYNCHRONIZATION_MODE)) return true; + final private boolean jj_3R_71() { + if (jj_scan_token(ORDER)) return true; + if (jj_scan_token(BY)) return true; return false; } - final private boolean jj_3R_147() { - if (jj_scan_token(HAVING)) return true; - if (jj_3R_81()) return true; + final private boolean jj_3_1278() { + if (jj_scan_token(WRITE_SYNCHRONIZATION_MODE)) return true; return false; } - final private boolean jj_3_1254() { + final private boolean jj_3_1277() { if (jj_scan_token(BACKUPS)) return true; return false; } - final private boolean jj_3_1253() { + final private boolean jj_3_717() { + if (jj_scan_token(GEOMETRY)) return true; + return false; + } + + final private boolean jj_3_1276() { if (jj_scan_token(YEARS)) return true; return false; } - final private boolean jj_3_1252() { + final private boolean jj_3_1275() { if (jj_scan_token(WRAPPER)) return true; return false; } - final private boolean jj_3_1251() { + final private boolean jj_3_1274() { if (jj_scan_token(WEEK)) return true; return false; } - final private boolean jj_3_1250() { + final private boolean jj_3_1273() { if (jj_scan_token(UTF8)) return true; return false; } - final private boolean jj_3_1249() { - if (jj_scan_token(USER_DEFINED_TYPE_SCHEMA)) return true; - return false; - } - - final private boolean jj_3_1248() { - if (jj_scan_token(USER_DEFINED_TYPE_CATALOG)) return true; + final private boolean jj_3R_285() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_717()) { + jj_scanpos = xsp; + if (jj_3_718()) { + jj_scanpos = xsp; + if (jj_3_719()) { + jj_scanpos = xsp; + if (jj_3_720()) { + jj_scanpos = xsp; + if (jj_3_721()) { + jj_scanpos = xsp; + if (jj_3_722()) { + jj_scanpos = xsp; + if (jj_3_723()) { + jj_scanpos = xsp; + if (jj_3_724()) { + jj_scanpos = xsp; + if (jj_3_725()) { + jj_scanpos = xsp; + if (jj_3_726()) { + jj_scanpos = xsp; + if (jj_3_727()) { + jj_scanpos = xsp; + if (jj_3_728()) return true; + } + } + } + } + } + } + } + } + } + } + } return false; } - final private boolean jj_3_1247() { - if (jj_scan_token(UNPIVOT)) return true; + final private boolean jj_3_1272() { + if (jj_scan_token(USER_DEFINED_TYPE_SCHEMA)) return true; return false; } - final private boolean jj_3_303() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_78()) return true; + final private boolean jj_3_1271() { + if (jj_scan_token(USER_DEFINED_TYPE_CATALOG)) return true; return false; } - final private boolean jj_3_689() { - if (jj_3R_152()) return true; + final private boolean jj_3_1270() { + if (jj_scan_token(UNPIVOT)) return true; return false; } - final private boolean jj_3_1246() { + final private boolean jj_3_1269() { if (jj_scan_token(UNCOMMITTED)) return true; return false; } - final private boolean jj_3_1245() { + final private boolean jj_3_1268() { if (jj_scan_token(TUMBLE)) return true; return false; } - final private boolean jj_3_1244() { + final private boolean jj_3_1267() { if (jj_scan_token(TRIGGER_CATALOG)) return true; return false; } - final private boolean jj_3_688() { - if (jj_3R_280()) return true; + final private boolean jj_3R_150() { + if (jj_scan_token(QUALIFY)) return true; + if (jj_3R_82()) return true; return false; } - final private boolean jj_3_1243() { + final private boolean jj_3_1266() { if (jj_scan_token(TRANSACTIONS_ROLLED_BACK)) return true; return false; } - final private boolean jj_3_1242() { + final private boolean jj_3_1265() { if (jj_scan_token(TRANSACTION)) return true; return false; } - final private boolean jj_3_687() { - if (jj_3R_279()) return true; + final private boolean jj_3_1264() { + if (jj_scan_token(TIMESTAMP_DIFF)) return true; return false; } - final private boolean jj_3_1241() { - if (jj_scan_token(TIMESTAMP_DIFF)) return true; + final private boolean jj_3_2() { + if (jj_3R_68()) return true; return false; } - final private boolean jj_3_1240() { + final private boolean jj_3_1263() { if (jj_scan_token(TIME_TRUNC)) return true; return false; } - final private boolean jj_3R_396() { - if (jj_3R_78()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_303()) { jj_scanpos = xsp; break; } - } + final private boolean jj_3_1262() { + if (jj_scan_token(TEMPORARY)) return true; return false; } - final private boolean jj_3_1239() { - if (jj_scan_token(TEMPORARY)) return true; + final private boolean jj_3_1() { + if (jj_3R_67()) return true; return false; } - final private boolean jj_3_686() { - if (jj_3R_278()) return true; + final private boolean jj_3_1261() { + if (jj_scan_token(SUBCLASS_ORIGIN)) return true; return false; } - final private boolean jj_3_1238() { - if (jj_scan_token(SUBCLASS_ORIGIN)) return true; + final private boolean jj_3_327() { + if (jj_scan_token(TIES)) return true; return false; } - final private boolean jj_3_1237() { - if (jj_scan_token(STRING_AGG)) return true; + final private boolean jj_3_709() { + if (jj_3R_289()) return true; return false; } - final private boolean jj_3_1236() { - if (jj_scan_token(SQL_VARCHAR)) return true; + final private boolean jj_3_1260() { + if (jj_scan_token(STRING_AGG)) return true; return false; } - final private boolean jj_3_1235() { - if (jj_scan_token(SQL_TSI_WEEK)) return true; + final private boolean jj_3_1259() { + if (jj_scan_token(SQL_VARCHAR)) return true; return false; } - final private boolean jj_3R_360() { + final private boolean jj_3_4() { + if (jj_3R_70()) return true; Token xsp; - xsp = jj_scanpos; - if (jj_3_686()) { - jj_scanpos = xsp; - if (jj_3_687()) { - jj_scanpos = xsp; - if (jj_3_688()) { - jj_scanpos = xsp; - if (jj_3_689()) return true; - } + while (true) { + xsp = jj_scanpos; + if (jj_3_1()) { jj_scanpos = xsp; break; } } + while (true) { + xsp = jj_scanpos; + if (jj_3_2()) { jj_scanpos = xsp; break; } } return false; } - final private boolean jj_3_1234() { - if (jj_scan_token(SQL_TSI_MONTH)) return true; - return false; - } - - final private boolean jj_3_1233() { - if (jj_scan_token(SQL_TSI_HOUR)) return true; - return false; - } - - final private boolean jj_3_1232() { - if (jj_scan_token(SQL_TINYINT)) return true; + final private boolean jj_3_326() { + if (jj_scan_token(GROUP)) return true; return false; } - final private boolean jj_3_1231() { - if (jj_scan_token(SQL_SMALLINT)) return true; + final private boolean jj_3_708() { + if (jj_3R_288()) return true; return false; } - final private boolean jj_3_1230() { - if (jj_scan_token(SQL_NUMERIC)) return true; + final private boolean jj_3_1258() { + if (jj_scan_token(SQL_TSI_WEEK)) return true; return false; } - final private boolean jj_3_1229() { - if (jj_scan_token(SQL_LONGVARNCHAR)) return true; + final private boolean jj_3_1257() { + if (jj_scan_token(SQL_TSI_MONTH)) return true; return false; } - final private boolean jj_3_1228() { - if (jj_scan_token(SQL_INTERVAL_YEAR_TO_MONTH)) return true; + final private boolean jj_3_325() { + if (jj_scan_token(NO)) return true; + if (jj_scan_token(OTHERS)) return true; return false; } - final private boolean jj_3_1227() { - if (jj_scan_token(SQL_INTERVAL_MONTH)) return true; + final private boolean jj_3_707() { + if (jj_3R_287()) return true; return false; } - final private boolean jj_3R_234() { - if (jj_3R_396()) return true; + final private boolean jj_3_1256() { + if (jj_scan_token(SQL_TSI_HOUR)) return true; return false; } - final private boolean jj_3_1226() { - if (jj_scan_token(SQL_INTERVAL_HOUR_TO_SECOND)) return true; + final private boolean jj_3_1255() { + if (jj_scan_token(SQL_TINYINT)) return true; return false; } - final private boolean jj_3_1225() { - if (jj_scan_token(SQL_INTERVAL_DAY_TO_SECOND)) return true; + final private boolean jj_3_324() { + if (jj_scan_token(CURRENT)) return true; + if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_1224() { - if (jj_scan_token(SQL_INTERVAL_DAY)) return true; + final private boolean jj_3_706() { + if (jj_3R_286()) return true; return false; } - final private boolean jj_3_1223() { - if (jj_scan_token(SQL_DOUBLE)) return true; + final private boolean jj_3_1254() { + if (jj_scan_token(SQL_SMALLINT)) return true; return false; } - final private boolean jj_3_1222() { - if (jj_scan_token(SQL_CLOB)) return true; + final private boolean jj_3_3() { + if (jj_3R_69()) return true; return false; } - final private boolean jj_3_685() { - if (jj_3R_277()) return true; + final private boolean jj_3_1253() { + if (jj_scan_token(SQL_NUMERIC)) return true; return false; } - final private boolean jj_3_1221() { - if (jj_scan_token(SQL_BLOB)) return true; + final private boolean jj_3_705() { + if (jj_3R_285()) return true; return false; } - final private boolean jj_3_1220() { - if (jj_scan_token(SQL_BIGINT)) return true; + final private boolean jj_3_1252() { + if (jj_scan_token(SQL_LONGVARNCHAR)) return true; return false; } - final private boolean jj_3_1219() { - if (jj_scan_token(SOURCE)) return true; + final private boolean jj_3_1251() { + if (jj_scan_token(SQL_INTERVAL_YEAR_TO_MONTH)) return true; return false; } - final private boolean jj_3_1218() { - if (jj_scan_token(SETS)) return true; + final private boolean jj_3_1250() { + if (jj_scan_token(SQL_INTERVAL_MONTH)) return true; return false; } - final private boolean jj_3_1217() { - if (jj_scan_token(SERVER)) return true; + final private boolean jj_3R_383() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_3()) { + jj_scanpos = xsp; + if (jj_3_4()) return true; + } return false; } - final private boolean jj_3_1216() { - if (jj_scan_token(SEPARATOR)) return true; + final private boolean jj_3_1249() { + if (jj_scan_token(SQL_INTERVAL_HOUR_TO_SECOND)) return true; return false; } - final private boolean jj_3_1215() { - if (jj_scan_token(SECTION)) return true; + final private boolean jj_3_328() { + if (jj_scan_token(EXCLUDE)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_324()) { + jj_scanpos = xsp; + if (jj_3_325()) { + jj_scanpos = xsp; + if (jj_3_326()) { + jj_scanpos = xsp; + if (jj_3_327()) return true; + } + } + } return false; } - final private boolean jj_3R_120() { - if (jj_3R_360()) return true; + final private boolean jj_3R_282() { Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_685()) { jj_scanpos = xsp; break; } + xsp = jj_scanpos; + if (jj_3_705()) { + jj_scanpos = xsp; + if (jj_3_706()) { + jj_scanpos = xsp; + if (jj_3_707()) { + jj_scanpos = xsp; + if (jj_3_708()) { + jj_scanpos = xsp; + if (jj_3_709()) return true; + } + } + } } return false; } - final private boolean jj_3_1214() { + final private boolean jj_3_1248() { + if (jj_scan_token(SQL_INTERVAL_DAY_TO_SECOND)) return true; + return false; + } + + final private boolean jj_3_1247() { + if (jj_scan_token(SQL_INTERVAL_DAY)) return true; + return false; + } + + final private boolean jj_3_1246() { + if (jj_scan_token(SQL_DOUBLE)) return true; + return false; + } + + final private boolean jj_3_1245() { + if (jj_scan_token(SQL_CLOB)) return true; + return false; + } + + final private boolean jj_3_1244() { + if (jj_scan_token(SQL_BLOB)) return true; + return false; + } + + final private boolean jj_3_1243() { + if (jj_scan_token(SQL_BIGINT)) return true; + return false; + } + + final private boolean jj_3_1242() { + if (jj_scan_token(SOURCE)) return true; + return false; + } + + final private boolean jj_3_1241() { + if (jj_scan_token(SETS)) return true; + return false; + } + + final private boolean jj_3_1240() { + if (jj_scan_token(SERVER)) return true; + return false; + } + + final private boolean jj_3_1239() { + if (jj_scan_token(SEPARATOR)) return true; + return false; + } + + final private boolean jj_3_1238() { + if (jj_scan_token(SECTION)) return true; + return false; + } + + final private boolean jj_3_1237() { if (jj_scan_token(SCOPE_NAME)) return true; return false; } - final private boolean jj_3_1213() { - if (jj_scan_token(SCHEMA)) return true; + final private boolean jj_3_320() { + if (jj_scan_token(FOLLOWING)) return true; return false; } - final private boolean jj_3_302() { - if (jj_3R_78()) return true; + final private boolean jj_3_704() { + if (jj_3R_153()) return true; return false; } - final private boolean jj_3_1212() { + final private boolean jj_3_1236() { + if (jj_scan_token(SCHEMA)) return true; + return false; + } + + final private boolean jj_3_1235() { if (jj_scan_token(ROW_COUNT)) return true; return false; } - final private boolean jj_3_1211() { + final private boolean jj_3_1234() { if (jj_scan_token(ROUTINE_CATALOG)) return true; return false; } - final private boolean jj_3_1210() { + final private boolean jj_3_703() { + if (jj_3R_284()) return true; + return false; + } + + final private boolean jj_3_1233() { if (jj_scan_token(RLIKE)) return true; return false; } - final private boolean jj_3_1209() { + final private boolean jj_3_319() { + if (jj_scan_token(PRECEDING)) return true; + return false; + } + + final private boolean jj_3_1232() { if (jj_scan_token(RETURNED_OCTET_LENGTH)) return true; return false; } - final private boolean jj_3_301() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_702() { + if (jj_3R_283()) return true; return false; } - final private boolean jj_3_1208() { + final private boolean jj_3_1231() { if (jj_scan_token(RESTRICT)) return true; return false; } - final private boolean jj_3_1207() { + final private boolean jj_3_1230() { if (jj_scan_token(REPLACE)) return true; return false; } - final private boolean jj_3_1206() { + final private boolean jj_3_1229() { if (jj_scan_token(READ)) return true; return false; } - final private boolean jj_3_1205() { + final private boolean jj_3_701() { + if (jj_3R_282()) return true; + return false; + } + + final private boolean jj_3_1228() { if (jj_scan_token(PUBLIC)) return true; return false; } - final private boolean jj_3_1204() { + final private boolean jj_3_1227() { if (jj_scan_token(PRESERVE)) return true; return false; } - final private boolean jj_3_1203() { + final private boolean jj_3_323() { + if (jj_3R_82()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_319()) { + jj_scanpos = xsp; + if (jj_3_320()) return true; + } + return false; + } + + final private boolean jj_3_1226() { if (jj_scan_token(PLAN)) return true; return false; } - final private boolean jj_3_300() { - if (jj_scan_token(CUBE)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_318() { + if (jj_scan_token(FOLLOWING)) return true; return false; } - final private boolean jj_3_1202() { + final private boolean jj_3_1225() { if (jj_scan_token(PATH)) return true; return false; } - final private boolean jj_3_1201() { - if (jj_scan_token(PASSING)) return true; + final private boolean jj_3R_364() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_701()) { + jj_scanpos = xsp; + if (jj_3_702()) { + jj_scanpos = xsp; + if (jj_3_703()) { + jj_scanpos = xsp; + if (jj_3_704()) return true; + } + } + } return false; } - final private boolean jj_3_1200() { - if (jj_scan_token(PARAMETER_SPECIFIC_SCHEMA)) return true; + final private boolean jj_3_1224() { + if (jj_scan_token(PASSING)) return true; return false; } - final private boolean jj_3_1199() { - if (jj_scan_token(PARAMETER_ORDINAL_POSITION)) return true; + final private boolean jj_3_1223() { + if (jj_scan_token(PARAMETER_SPECIFIC_SCHEMA)) return true; return false; } - final private boolean jj_3_1198() { - if (jj_scan_token(PAD)) return true; + final private boolean jj_3_1222() { + if (jj_scan_token(PARAMETER_ORDINAL_POSITION)) return true; return false; } - final private boolean jj_3_1197() { - if (jj_scan_token(OTHERS)) return true; + final private boolean jj_3_317() { + if (jj_scan_token(PRECEDING)) return true; return false; } - final private boolean jj_3_299() { - if (jj_scan_token(ROLLUP)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_1221() { + if (jj_scan_token(PAD)) return true; return false; } - final private boolean jj_3_684() { - if (jj_scan_token(MINUS)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_1220() { + if (jj_scan_token(OTHERS)) return true; return false; } - final private boolean jj_3_1196() { + final private boolean jj_3_1219() { if (jj_scan_token(OPTIONS)) return true; return false; } - final private boolean jj_3_1195() { + final private boolean jj_3_1218() { if (jj_scan_token(OBJECT)) return true; return false; } - final private boolean jj_3_1194() { + final private boolean jj_3_1217() { if (jj_scan_token(NULLABLE)) return true; return false; } - final private boolean jj_3_1193() { + final private boolean jj_3_1216() { if (jj_scan_token(NANOSECOND)) return true; return false; } - final private boolean jj_3_1192() { + final private boolean jj_3_1215() { if (jj_scan_token(MUMPS)) return true; return false; } - final private boolean jj_3R_185() { + final private boolean jj_3_322() { + if (jj_scan_token(UNBOUNDED)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_298()) { - jj_scanpos = xsp; - if (jj_3_299()) { - jj_scanpos = xsp; - if (jj_3_300()) { - jj_scanpos = xsp; - if (jj_3_301()) { + if (jj_3_317()) { jj_scanpos = xsp; - if (jj_3_302()) return true; - } - } - } + if (jj_3_318()) return true; } return false; } - final private boolean jj_3_1191() { + final private boolean jj_3_1214() { if (jj_scan_token(MINVALUE)) return true; return false; } - final private boolean jj_3_298() { - if (jj_scan_token(GROUPING)) return true; - if (jj_scan_token(SETS)) return true; - return false; - } - - final private boolean jj_3_1190() { + final private boolean jj_3_1213() { if (jj_scan_token(MILLENNIUM)) return true; return false; } - final private boolean jj_3_682() { - if (jj_scan_token(PLUS)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_1212() { + if (jj_scan_token(MESSAGE_OCTET_LENGTH)) return true; return false; } - final private boolean jj_3_1189() { - if (jj_scan_token(MESSAGE_OCTET_LENGTH)) return true; + final private boolean jj_3_700() { + if (jj_3R_281()) return true; return false; } - final private boolean jj_3_1188() { + final private boolean jj_3_1211() { if (jj_scan_token(MATCHED)) return true; return false; } - final private boolean jj_3_681() { - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3R_188() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_321()) { + jj_scanpos = xsp; + if (jj_3_322()) { + jj_scanpos = xsp; + if (jj_3_323()) return true; + } + } return false; } - final private boolean jj_3_1187() { + final private boolean jj_3_1210() { if (jj_scan_token(LOCATOR)) return true; return false; } - final private boolean jj_3_1186() { - if (jj_scan_token(LENGTH)) return true; + final private boolean jj_3_321() { + if (jj_scan_token(CURRENT)) return true; + if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_1185() { - if (jj_scan_token(KEY_TYPE)) return true; + final private boolean jj_3_1209() { + if (jj_scan_token(LENGTH)) return true; return false; } - final private boolean jj_3_1184() { - if (jj_scan_token(K)) return true; + final private boolean jj_3_1208() { + if (jj_scan_token(KEY_TYPE)) return true; return false; } - final private boolean jj_3R_287() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_683()) { - jj_scanpos = xsp; - if (jj_3_684()) return true; - } + final private boolean jj_3_1207() { + if (jj_scan_token(K)) return true; return false; } - final private boolean jj_3_1183() { + final private boolean jj_3_1206() { if (jj_scan_token(ISOYEAR)) return true; return false; } - final private boolean jj_3_683() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_681()) { - jj_scanpos = xsp; - if (jj_3_682()) return true; - } - return false; - } - - final private boolean jj_3_1182() { + final private boolean jj_3_1205() { if (jj_scan_token(INVOKER)) return true; return false; } - final private boolean jj_3_297() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_185()) return true; + final private boolean jj_3R_121() { + if (jj_3R_364()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_700()) { jj_scanpos = xsp; break; } + } return false; } - final private boolean jj_3_1181() { + final private boolean jj_3_1204() { if (jj_scan_token(INPUT)) return true; return false; } - final private boolean jj_3_1180() { + final private boolean jj_3_1203() { if (jj_scan_token(INCLUDING)) return true; return false; } - final private boolean jj_3_1179() { + final private boolean jj_3_1202() { if (jj_scan_token(IMMEDIATELY)) return true; return false; } - final private boolean jj_3_1178() { + final private boolean jj_3_1201() { if (jj_scan_token(IGNORE)) return true; return false; } - final private boolean jj_3_1177() { + final private boolean jj_3_1200() { if (jj_scan_token(HIERARCHY)) return true; return false; } - final private boolean jj_3_1176() { + final private boolean jj_3_1199() { if (jj_scan_token(GOTO)) return true; return false; } - final private boolean jj_3_1175() { + final private boolean jj_3_1198() { if (jj_scan_token(GENERATED)) return true; return false; } - final private boolean jj_3_1174() { + final private boolean jj_3_1197() { if (jj_scan_token(FRAC_SECOND)) return true; return false; } - final private boolean jj_3_1173() { + final private boolean jj_3_1196() { if (jj_scan_token(FORMAT)) return true; return false; } - final private boolean jj_3_1172() { + final private boolean jj_3_316() { + if (jj_scan_token(DISALLOW)) return true; + if (jj_scan_token(PARTIAL)) return true; + return false; + } + + final private boolean jj_3_1195() { if (jj_scan_token(FINAL)) return true; return false; } - final private boolean jj_3_1171() { + final private boolean jj_3_1194() { if (jj_scan_token(EXCEPTION)) return true; return false; } - final private boolean jj_3_1170() { + final private boolean jj_3_1193() { if (jj_scan_token(ENCODING)) return true; return false; } - final private boolean jj_3_1169() { + final private boolean jj_3_1192() { if (jj_scan_token(DOT_FORMAT)) return true; return false; } - final private boolean jj_3_1168() { - if (jj_scan_token(DOMAIN)) return true; + final private boolean jj_3_315() { + if (jj_scan_token(ALLOW)) return true; + if (jj_scan_token(PARTIAL)) return true; return false; } - final private boolean jj_3R_260() { - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_1191() { + if (jj_scan_token(DOMAIN)) return true; return false; } - final private boolean jj_3_1167() { + final private boolean jj_3_1190() { if (jj_scan_token(DESCRIPTOR)) return true; return false; } - final private boolean jj_3_1166() { + final private boolean jj_3_1189() { if (jj_scan_token(DERIVED)) return true; return false; } - final private boolean jj_3_1165() { + final private boolean jj_3_1188() { if (jj_scan_token(DEFINER)) return true; return false; } - final private boolean jj_3_296() { - if (jj_scan_token(ALL)) return true; - return false; - } - - final private boolean jj_3_1164() { + final private boolean jj_3_1187() { if (jj_scan_token(DEFERRABLE)) return true; return false; } - final private boolean jj_3_295() { - if (jj_scan_token(DISTINCT)) return true; + final private boolean jj_3_699() { + if (jj_scan_token(MINUS)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } - final private boolean jj_3_1163() { + final private boolean jj_3_1186() { if (jj_scan_token(DAYS)) return true; return false; } - final private boolean jj_3_1162() { + final private boolean jj_3_1185() { if (jj_scan_token(DATETIME_TRUNC)) return true; return false; } - final private boolean jj_3_1161() { + final private boolean jj_3_1184() { if (jj_scan_token(DATETIME_DIFF)) return true; return false; } - final private boolean jj_3_1160() { + final private boolean jj_3_313() { + if (jj_3R_188()) return true; + return false; + } + + final private boolean jj_3_1183() { if (jj_scan_token(DATABASE)) return true; return false; } - final private boolean jj_3_1159() { + final private boolean jj_3_1182() { if (jj_scan_token(CONTINUE)) return true; return false; } - final private boolean jj_3_1158() { + final private boolean jj_3_1181() { if (jj_scan_token(CONSTRAINT_SCHEMA)) return true; return false; } - final private boolean jj_3R_146() { - if (jj_scan_token(GROUP)) return true; - if (jj_scan_token(BY)) return true; + final private boolean jj_3_312() { + if (jj_scan_token(BETWEEN)) return true; + if (jj_3R_188()) return true; return false; } - final private boolean jj_3_1157() { + final private boolean jj_3_1180() { if (jj_scan_token(CONSTRAINT_CATALOG)) return true; return false; } - final private boolean jj_3_1156() { + final private boolean jj_3_697() { + if (jj_scan_token(PLUS)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + return false; + } + + final private boolean jj_3_1179() { if (jj_scan_token(CONDITION_NUMBER)) return true; return false; } - final private boolean jj_3_1155() { + final private boolean jj_3_1178() { if (jj_scan_token(COMMAND_FUNCTION_CODE)) return true; return false; } - final private boolean jj_3_1154() { - if (jj_scan_token(COLLATION_SCHEMA)) return true; + final private boolean jj_3_311() { + if (jj_scan_token(RANGE)) return true; return false; } - final private boolean jj_3R_231() { - if (jj_scan_token(NEW)) return true; - if (jj_3R_358()) return true; + final private boolean jj_3_696() { + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } - final private boolean jj_3_1153() { + final private boolean jj_3_1177() { + if (jj_scan_token(COLLATION_SCHEMA)) return true; + return false; + } + + final private boolean jj_3_1176() { if (jj_scan_token(COLLATION)) return true; return false; } - final private boolean jj_3_1152() { + final private boolean jj_3_310() { + if (jj_scan_token(ROWS)) return true; + return false; + } + + final private boolean jj_3_1175() { if (jj_scan_token(CHARACTER_SET_SCHEMA)) return true; return false; } - final private boolean jj_3_1151() { + final private boolean jj_3_1174() { if (jj_scan_token(CHARACTERS)) return true; return false; } - final private boolean jj_3_1150() { + final private boolean jj_3R_291() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_698()) { + jj_scanpos = xsp; + if (jj_3_699()) return true; + } + return false; + } + + final private boolean jj_3_1173() { if (jj_scan_token(CENTURY)) return true; return false; } - final private boolean jj_3_1149() { + final private boolean jj_3_698() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_696()) { + jj_scanpos = xsp; + if (jj_3_697()) return true; + } + return false; + } + + final private boolean jj_3_1172() { if (jj_scan_token(CASCADE)) return true; return false; } - final private boolean jj_3_1148() { + final private boolean jj_3_1171() { if (jj_scan_token(BERNOULLI)) return true; return false; } - final private boolean jj_3_1147() { + final private boolean jj_3_314() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_310()) { + jj_scanpos = xsp; + if (jj_3_311()) return true; + } + xsp = jj_scanpos; + if (jj_3_312()) { + jj_scanpos = xsp; + if (jj_3_313()) return true; + } + return false; + } + + final private boolean jj_3_1170() { if (jj_scan_token(ATTRIBUTE)) return true; return false; } - final private boolean jj_3_1146() { + final private boolean jj_3_1169() { if (jj_scan_token(ASC)) return true; return false; } - final private boolean jj_3_1145() { + final private boolean jj_3_1168() { if (jj_scan_token(APPLY)) return true; return false; } - final private boolean jj_3R_145() { - if (jj_scan_token(WHERE)) return true; - if (jj_3R_81()) return true; + final private boolean jj_3_1167() { + if (jj_scan_token(ADMIN)) return true; return false; } - final private boolean jj_3_1144() { - if (jj_scan_token(ADMIN)) return true; + final private boolean jj_3_309() { + if (jj_3R_71()) return true; return false; } - final private boolean jj_3_1143() { + final private boolean jj_3_1166() { if (jj_scan_token(ACTION)) return true; return false; } - final private boolean jj_3_1142() { + final private boolean jj_3_1165() { if (jj_scan_token(A)) return true; return false; } - final private boolean jj_3R_291() { - if (jj_3R_400()) return true; + final private boolean jj_3_308() { + if (jj_scan_token(PARTITION)) return true; + if (jj_scan_token(BY)) return true; return false; } - final private boolean jj_3R_341() { + final private boolean jj_3R_345() { Token xsp; xsp = jj_scanpos; - if (jj_3_1142()) { + if (jj_3_1165()) { jj_scanpos = xsp; - if (jj_3_1143()) { + if (jj_3_1166()) { jj_scanpos = xsp; - if (jj_3_1144()) { + if (jj_3_1167()) { jj_scanpos = xsp; - if (jj_3_1145()) { + if (jj_3_1168()) { jj_scanpos = xsp; - if (jj_3_1146()) { + if (jj_3_1169()) { jj_scanpos = xsp; - if (jj_3_1147()) { + if (jj_3_1170()) { jj_scanpos = xsp; - if (jj_3_1148()) { + if (jj_3_1171()) { jj_scanpos = xsp; - if (jj_3_1149()) { + if (jj_3_1172()) { jj_scanpos = xsp; - if (jj_3_1150()) { + if (jj_3_1173()) { jj_scanpos = xsp; - if (jj_3_1151()) { + if (jj_3_1174()) { jj_scanpos = xsp; - if (jj_3_1152()) { + if (jj_3_1175()) { jj_scanpos = xsp; - if (jj_3_1153()) { + if (jj_3_1176()) { jj_scanpos = xsp; - if (jj_3_1154()) { + if (jj_3_1177()) { jj_scanpos = xsp; - if (jj_3_1155()) { + if (jj_3_1178()) { jj_scanpos = xsp; - if (jj_3_1156()) { + if (jj_3_1179()) { jj_scanpos = xsp; - if (jj_3_1157()) { + if (jj_3_1180()) { jj_scanpos = xsp; - if (jj_3_1158()) { + if (jj_3_1181()) { jj_scanpos = xsp; - if (jj_3_1159()) { + if (jj_3_1182()) { jj_scanpos = xsp; - if (jj_3_1160()) { + if (jj_3_1183()) { jj_scanpos = xsp; - if (jj_3_1161()) { + if (jj_3_1184()) { jj_scanpos = xsp; - if (jj_3_1162()) { - jj_scanpos = xsp; - if (jj_3_1163()) { - jj_scanpos = xsp; - if (jj_3_1164()) { - jj_scanpos = xsp; - if (jj_3_1165()) { - jj_scanpos = xsp; - if (jj_3_1166()) { - jj_scanpos = xsp; - if (jj_3_1167()) { - jj_scanpos = xsp; - if (jj_3_1168()) { - jj_scanpos = xsp; - if (jj_3_1169()) { - jj_scanpos = xsp; - if (jj_3_1170()) { - jj_scanpos = xsp; - if (jj_3_1171()) { - jj_scanpos = xsp; - if (jj_3_1172()) { - jj_scanpos = xsp; - if (jj_3_1173()) { - jj_scanpos = xsp; - if (jj_3_1174()) { - jj_scanpos = xsp; - if (jj_3_1175()) { - jj_scanpos = xsp; - if (jj_3_1176()) { - jj_scanpos = xsp; - if (jj_3_1177()) { - jj_scanpos = xsp; - if (jj_3_1178()) { - jj_scanpos = xsp; - if (jj_3_1179()) { - jj_scanpos = xsp; - if (jj_3_1180()) { - jj_scanpos = xsp; - if (jj_3_1181()) { - jj_scanpos = xsp; - if (jj_3_1182()) { - jj_scanpos = xsp; - if (jj_3_1183()) { - jj_scanpos = xsp; - if (jj_3_1184()) { - jj_scanpos = xsp; - if (jj_3_1185()) { + if (jj_3_1185()) { jj_scanpos = xsp; if (jj_3_1186()) { jj_scanpos = xsp; @@ -39150,7 +39112,53 @@ final private boolean jj_3R_341() { jj_scanpos = xsp; if (jj_3_1362()) { jj_scanpos = xsp; - if (jj_3_1363()) return true; + if (jj_3_1363()) { + jj_scanpos = xsp; + if (jj_3_1364()) { + jj_scanpos = xsp; + if (jj_3_1365()) { + jj_scanpos = xsp; + if (jj_3_1366()) { + jj_scanpos = xsp; + if (jj_3_1367()) { + jj_scanpos = xsp; + if (jj_3_1368()) { + jj_scanpos = xsp; + if (jj_3_1369()) { + jj_scanpos = xsp; + if (jj_3_1370()) { + jj_scanpos = xsp; + if (jj_3_1371()) { + jj_scanpos = xsp; + if (jj_3_1372()) { + jj_scanpos = xsp; + if (jj_3_1373()) { + jj_scanpos = xsp; + if (jj_3_1374()) { + jj_scanpos = xsp; + if (jj_3_1375()) { + jj_scanpos = xsp; + if (jj_3_1376()) { + jj_scanpos = xsp; + if (jj_3_1377()) { + jj_scanpos = xsp; + if (jj_3_1378()) { + jj_scanpos = xsp; + if (jj_3_1379()) { + jj_scanpos = xsp; + if (jj_3_1380()) { + jj_scanpos = xsp; + if (jj_3_1381()) { + jj_scanpos = xsp; + if (jj_3_1382()) { + jj_scanpos = xsp; + if (jj_3_1383()) { + jj_scanpos = xsp; + if (jj_3_1384()) { + jj_scanpos = xsp; + if (jj_3_1385()) { + jj_scanpos = xsp; + if (jj_3_1386()) return true; } } } @@ -39375,679 +39383,1354 @@ final private boolean jj_3R_341() { return false; } - final private boolean jj_3R_159() { + final private boolean jj_3R_417() { + return false; + } + + final private boolean jj_3R_264() { + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + return false; + } + + final private boolean jj_3_307() { + if (jj_3R_85()) return true; + return false; + } + + final private boolean jj_3_1164() { + if (jj_3R_347()) return true; + return false; + } + + final private boolean jj_3R_335() { if (jj_scan_token(LPAREN)) return true; - if (jj_3R_369()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_307()) { + jj_scanpos = xsp; + if (jj_3R_417()) return true; + } return false; } - final private boolean jj_3_1141() { - if (jj_3R_343()) return true; + final private boolean jj_3_1163() { + if (jj_3R_346()) return true; return false; } - final private boolean jj_3_1140() { - if (jj_3R_342()) return true; + final private boolean jj_3_1162() { + if (jj_3R_345()) return true; return false; } - final private boolean jj_3R_357() { - if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} + final private boolean jj_3R_277() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_1162()) { + jj_scanpos = xsp; + if (jj_3_1163()) { + jj_scanpos = xsp; + if (jj_3_1164()) return true; + } + } return false; } - final private boolean jj_3_1139() { - if (jj_3R_341()) return true; + final private boolean jj_3R_235() { + if (jj_scan_token(NEW)) return true; + if (jj_3R_362()) return true; return false; } - final private boolean jj_3_680() { + final private boolean jj_3R_187() { + if (jj_3R_85()) return true; + return false; + } + + final private boolean jj_3R_160() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_373()) return true; + return false; + } + + final private boolean jj_3_306() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_276()) return true; + if (jj_3R_187()) return true; return false; } - final private boolean jj_3R_369() { - if (jj_3R_276()) return true; + final private boolean jj_3_695() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_280()) return true; return false; } - final private boolean jj_3R_273() { + final private boolean jj_3R_149() { + if (jj_scan_token(WINDOW)) return true; + if (jj_3R_187()) return true; + return false; + } + + final private boolean jj_3R_373() { + if (jj_3R_280()) return true; + return false; + } + + final private boolean jj_3R_148() { + if (jj_scan_token(HAVING)) return true; + if (jj_3R_82()) return true; + return false; + } + + final private boolean jj_3_694() { + if (jj_scan_token(DOT)) return true; + if (jj_3R_279()) return true; + return false; + } + + final private boolean jj_3_305() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_79()) return true; + return false; + } + + final private boolean jj_3R_171() { + if (jj_3R_279()) return true; Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_694()) { jj_scanpos = xsp; break; } + } + return false; + } + + final private boolean jj_3R_408() { + if (jj_3R_79()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_305()) { jj_scanpos = xsp; break; } + } + return false; + } + + final private boolean jj_3R_238() { + if (jj_3R_408()) return true; + return false; + } + + final private boolean jj_3_693() { + if (jj_scan_token(DOT)) return true; + if (jj_scan_token(STAR)) return true; + return false; + } + + final private boolean jj_3_692() { + if (jj_scan_token(DOT)) return true; + if (jj_3R_278()) return true; + return false; + } + + final private boolean jj_3_304() { + if (jj_3R_79()) return true; + return false; + } + + final private boolean jj_3R_153() { + if (jj_3R_278()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_692()) { jj_scanpos = xsp; break; } + } xsp = jj_scanpos; - if (jj_3_1139()) { + if (jj_3_693()) jj_scanpos = xsp; + return false; + } + + final private boolean jj_3_303() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; + return false; + } + + final private boolean jj_3_302() { + if (jj_scan_token(CUBE)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3_301() { + if (jj_scan_token(ROLLUP)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + final private boolean jj_3_691() { + if (jj_3R_125()) return true; + return false; + } + + final private boolean jj_3R_135() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_690()) { jj_scanpos = xsp; - if (jj_3_1140()) { + if (jj_3_691()) return true; + } + return false; + } + + final private boolean jj_3_690() { + if (jj_3R_85()) return true; + return false; + } + + final private boolean jj_3R_186() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_300()) { + jj_scanpos = xsp; + if (jj_3_301()) { + jj_scanpos = xsp; + if (jj_3_302()) { jj_scanpos = xsp; - if (jj_3_1141()) return true; + if (jj_3_303()) { + jj_scanpos = xsp; + if (jj_3_304()) return true; + } + } } } return false; } - final private boolean jj_3R_184() { + final private boolean jj_3_300() { + if (jj_scan_token(GROUPING)) return true; + if (jj_scan_token(SETS)) return true; return false; } - final private boolean jj_3_294() { - if (jj_3R_81()) return true; + final private boolean jj_3_299() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_186()) return true; return false; } - final private boolean jj_3R_346() { - if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} + final private boolean jj_3R_125() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_365()) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_291() { - if (jj_scan_token(ROW)) return true; + final private boolean jj_3_298() { + if (jj_scan_token(ALL)) return true; + return false; + } + + final private boolean jj_3_297() { + if (jj_scan_token(DISTINCT)) return true; + return false; + } + + final private boolean jj_3_689() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_85()) return true; + return false; + } + + final private boolean jj_3R_147() { + if (jj_scan_token(GROUP)) return true; + if (jj_scan_token(BY)) return true; + return false; + } + + final private boolean jj_3R_365() { + if (jj_3R_85()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_689()) { jj_scanpos = xsp; break; } + } + return false; + } + + final private boolean jj_3R_146() { + if (jj_scan_token(WHERE)) return true; + if (jj_3R_82()) return true; + return false; + } + + final private boolean jj_3R_374() { + if (jj_scan_token(QUOTED_STRING)) return true; + return false; + } + + final private boolean jj_3R_85() { + if (jj_3R_278()) return true; + return false; + } + + final private boolean jj_3R_185() { + return false; + } + + final private boolean jj_3_296() { + if (jj_3R_82()) return true; return false; } final private boolean jj_3_293() { + if (jj_scan_token(ROW)) return true; + return false; + } + + final private boolean jj_3R_295() { + if (jj_3R_412()) return true; + return false; + } + + final private boolean jj_3_295() { Token xsp; xsp = jj_scanpos; - if (jj_3_291()) { + if (jj_3_293()) { jj_scanpos = xsp; + if (jj_3R_185()) return true; + } if (jj_3R_184()) return true; + return false; + } + + final private boolean jj_3R_339() { + if (jj_3R_278()) return true; + return false; + } + + final private boolean jj_3_294() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(ROW)) return true; + if (jj_3R_184()) return true; + return false; + } + + final private boolean jj_3R_361() { + if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} + return false; + } + + final private boolean jj_3R_163() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_294()) { + jj_scanpos = xsp; + if (jj_3_295()) { + jj_scanpos = xsp; + if (jj_3_296()) return true; + } } - if (jj_3R_183()) return true; return false; } - final private boolean jj_3_679() { - if (jj_scan_token(DOT)) return true; - if (jj_3R_275()) return true; + final private boolean jj_3R_350() { + if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} return false; } - final private boolean jj_3R_411() { + final private boolean jj_3R_423() { + return false; + } + + final private boolean jj_3R_279() { + if (jj_3R_278()) return true; + return false; + } + + final private boolean jj_3R_183() { + if (jj_3R_163()) return true; return false; } final private boolean jj_3_292() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(ROW)) return true; + if (jj_scan_token(COMMA)) return true; if (jj_3R_183()) return true; return false; } - final private boolean jj_3R_170() { - if (jj_3R_275()) return true; + final private boolean jj_3R_176() { + if (jj_3R_384()) return true; + return false; + } + + final private boolean jj_3_291() { + if (jj_scan_token(VALUE)) return true; + return false; + } + + final private boolean jj_3_290() { + if (jj_scan_token(VALUES)) return true; + return false; + } + + final private boolean jj_3_688() { + if (jj_3R_277()) return true; + return false; + } + + final private boolean jj_3R_77() { Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_679()) { jj_scanpos = xsp; break; } + xsp = jj_scanpos; + if (jj_3_290()) { + jj_scanpos = xsp; + if (jj_3_291()) return true; } + if (jj_3R_183()) return true; return false; } - final private boolean jj_3R_162() { + final private boolean jj_3_680() { + if (jj_scan_token(UESCAPE)) return true; + if (jj_scan_token(QUOTED_STRING)) return true; + return false; + } + + final private boolean jj_3_687() { + if (jj_scan_token(UNICODE_QUOTED_IDENTIFIER)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_680()) jj_scanpos = xsp; + return false; + } + + final private boolean jj_3R_78() { + if (jj_scan_token(TABLE)) return true; + if (jj_3R_153()) return true; + return false; + } + + final private boolean jj_3_686() { + if (jj_scan_token(BRACKET_QUOTED_IDENTIFIER)) return true; + return false; + } + + final private boolean jj_3_685() { + if (jj_scan_token(BIG_QUERY_BACK_QUOTED_IDENTIFIER)) return true; + return false; + } + + final private boolean jj_3_684() { + if (jj_scan_token(BACK_QUOTED_IDENTIFIER)) return true; + return false; + } + + final private boolean jj_3_683() { + if (jj_scan_token(QUOTED_IDENTIFIER)) return true; + return false; + } + + final private boolean jj_3_682() { + if (jj_scan_token(HYPHENATED_IDENTIFIER)) return true; + return false; + } + + final private boolean jj_3_289() { + if (jj_scan_token(SPECIFIC)) return true; + return false; + } + + final private boolean jj_3_681() { + if (jj_scan_token(IDENTIFIER)) return true; + return false; + } + + final private boolean jj_3R_278() { Token xsp; xsp = jj_scanpos; - if (jj_3_292()) { + if (jj_3_681()) { jj_scanpos = xsp; - if (jj_3_293()) { + if (jj_3_682()) { + jj_scanpos = xsp; + if (jj_3_683()) { + jj_scanpos = xsp; + if (jj_3_684()) { + jj_scanpos = xsp; + if (jj_3_685()) { + jj_scanpos = xsp; + if (jj_3_686()) { + jj_scanpos = xsp; + if (jj_3_687()) { jj_scanpos = xsp; - if (jj_3_294()) return true; + if (jj_3_688()) return true; + } + } + } + } + } } } return false; } final private boolean jj_3R_175() { - if (jj_3R_375()) return true; + if (jj_scan_token(TABLE)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_182() { - if (jj_3R_162()) return true; + final private boolean jj_3_287() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_84()) return true; + return false; + } + + final private boolean jj_3R_223() { + if (jj_scan_token(HOOK)) return true; + return false; + } + + final private boolean jj_3_288() { + if (jj_3R_155()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_287()) { jj_scanpos = xsp; break; } + } + return false; + } + + final private boolean jj_3_679() { + if (jj_scan_token(SATURDAY)) return true; + return false; + } + + final private boolean jj_3R_170() { + if (jj_scan_token(LPAREN)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_288()) jj_scanpos = xsp; + if (jj_scan_token(RPAREN)) return true; return false; } final private boolean jj_3_678() { - if (jj_scan_token(DOT)) return true; - if (jj_scan_token(STAR)) return true; + if (jj_scan_token(FRIDAY)) return true; return false; } final private boolean jj_3_677() { - if (jj_scan_token(DOT)) return true; - if (jj_3R_274()) return true; + if (jj_scan_token(THURSDAY)) return true; return false; } - final private boolean jj_3_290() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_182()) return true; + final private boolean jj_3_676() { + if (jj_scan_token(WEDNESDAY)) return true; return false; } - final private boolean jj_3R_152() { - if (jj_3R_274()) return true; + final private boolean jj_3_675() { + if (jj_scan_token(TUESDAY)) return true; + return false; + } + + final private boolean jj_3_674() { + if (jj_scan_token(MONDAY)) return true; + return false; + } + + final private boolean jj_3R_275() { Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_677()) { jj_scanpos = xsp; break; } + xsp = jj_scanpos; + if (jj_3_673()) { + jj_scanpos = xsp; + if (jj_3_674()) { + jj_scanpos = xsp; + if (jj_3_675()) { + jj_scanpos = xsp; + if (jj_3_676()) { + jj_scanpos = xsp; + if (jj_3_677()) { + jj_scanpos = xsp; + if (jj_3_678()) { + jj_scanpos = xsp; + if (jj_3_679()) return true; } + } + } + } + } + } + return false; + } + + final private boolean jj_3_673() { + if (jj_scan_token(SUNDAY)) return true; + return false; + } + + final private boolean jj_3_672() { + if (jj_scan_token(MILLENNIUM)) return true; + return false; + } + + final private boolean jj_3_671() { + if (jj_scan_token(CENTURY)) return true; + return false; + } + + final private boolean jj_3_670() { + if (jj_scan_token(DECADE)) return true; + return false; + } + + final private boolean jj_3_669() { + if (jj_scan_token(EPOCH)) return true; + return false; + } + + final private boolean jj_3R_276() { + return false; + } + + final private boolean jj_3_668() { + if (jj_scan_token(YEAR)) return true; + return false; + } + + final private boolean jj_3_667() { + if (jj_scan_token(QUARTER)) return true; + return false; + } + + final private boolean jj_3_666() { + if (jj_scan_token(MONTH)) return true; + return false; + } + + final private boolean jj_3_651() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_275()) return true; + return false; + } + + final private boolean jj_3_286() { + if (jj_3R_121()) return true; + if (jj_3R_182()) return true; + return false; + } + + final private boolean jj_3R_280() { + if (jj_3R_153()) return true; + return false; + } + + final private boolean jj_3_665() { + if (jj_scan_token(WEEK)) return true; + Token xsp; xsp = jj_scanpos; - if (jj_3_678()) jj_scanpos = xsp; + if (jj_3_651()) { + jj_scanpos = xsp; + if (jj_3R_276()) return true; + } return false; } - final private boolean jj_3_289() { - if (jj_scan_token(VALUE)) return true; + final private boolean jj_3_664() { + if (jj_scan_token(ISOYEAR)) return true; return false; } - final private boolean jj_3_288() { - if (jj_scan_token(VALUES)) return true; + final private boolean jj_3_663() { + if (jj_scan_token(ISODOW)) return true; return false; } - final private boolean jj_3R_76() { + final private boolean jj_3_662() { + if (jj_scan_token(DOY)) return true; + return false; + } + + final private boolean jj_3_661() { + if (jj_scan_token(DOW)) return true; + return false; + } + + final private boolean jj_3_660() { + if (jj_scan_token(DAYOFYEAR)) return true; + return false; + } + + final private boolean jj_3_659() { + if (jj_scan_token(DAYOFWEEK)) return true; + return false; + } + + final private boolean jj_3_658() { + if (jj_scan_token(DAY)) return true; + return false; + } + + final private boolean jj_3_657() { + if (jj_scan_token(HOUR)) return true; + return false; + } + + final private boolean jj_3_656() { + if (jj_scan_token(MINUTE)) return true; + return false; + } + + final private boolean jj_3_655() { + if (jj_scan_token(SECOND)) return true; + return false; + } + + final private boolean jj_3_654() { + if (jj_scan_token(MILLISECOND)) return true; + return false; + } + + final private boolean jj_3_653() { + if (jj_scan_token(MICROSECOND)) return true; + return false; + } + + final private boolean jj_3R_274() { Token xsp; xsp = jj_scanpos; - if (jj_3_288()) { + if (jj_3_652()) { jj_scanpos = xsp; - if (jj_3_289()) return true; + if (jj_3_653()) { + jj_scanpos = xsp; + if (jj_3_654()) { + jj_scanpos = xsp; + if (jj_3_655()) { + jj_scanpos = xsp; + if (jj_3_656()) { + jj_scanpos = xsp; + if (jj_3_657()) { + jj_scanpos = xsp; + if (jj_3_658()) { + jj_scanpos = xsp; + if (jj_3_659()) { + jj_scanpos = xsp; + if (jj_3_660()) { + jj_scanpos = xsp; + if (jj_3_661()) { + jj_scanpos = xsp; + if (jj_3_662()) { + jj_scanpos = xsp; + if (jj_3_663()) { + jj_scanpos = xsp; + if (jj_3_664()) { + jj_scanpos = xsp; + if (jj_3_665()) { + jj_scanpos = xsp; + if (jj_3_666()) { + jj_scanpos = xsp; + if (jj_3_667()) { + jj_scanpos = xsp; + if (jj_3_668()) { + jj_scanpos = xsp; + if (jj_3_669()) { + jj_scanpos = xsp; + if (jj_3_670()) { + jj_scanpos = xsp; + if (jj_3_671()) { + jj_scanpos = xsp; + if (jj_3_672()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } } - if (jj_3R_182()) return true; return false; } - final private boolean jj_3_676() { - if (jj_3R_124()) return true; + final private boolean jj_3_652() { + if (jj_scan_token(NANOSECOND)) return true; return false; } - final private boolean jj_3R_134() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_675()) { - jj_scanpos = xsp; - if (jj_3_676()) return true; - } + final private boolean jj_3R_181() { + if (jj_3R_153()) return true; + if (jj_3R_121()) return true; + if (jj_3R_182()) return true; return false; } - final private boolean jj_3_675() { - if (jj_3R_84()) return true; + final private boolean jj_3_285() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_181()) return true; return false; } - final private boolean jj_3R_77() { - if (jj_scan_token(TABLE)) return true; - if (jj_3R_152()) return true; + final private boolean jj_3_650() { + if (jj_3R_85()) return true; return false; } - final private boolean jj_3R_124() { + final private boolean jj_3R_372() { if (jj_scan_token(LPAREN)) return true; - if (jj_3R_361()) return true; + if (jj_3R_181()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_285()) { jj_scanpos = xsp; break; } + } if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_674() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_84()) return true; - return false; - } - - final private boolean jj_3R_361() { - if (jj_3R_84()) return true; + final private boolean jj_3R_336() { Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_674()) { jj_scanpos = xsp; break; } + xsp = jj_scanpos; + if (jj_3_649()) { + jj_scanpos = xsp; + if (jj_3_650()) return true; } return false; } - final private boolean jj_3_287() { - if (jj_scan_token(SPECIFIC)) return true; + final private boolean jj_3_649() { + if (jj_3R_274()) return true; return false; } - final private boolean jj_3R_174() { - if (jj_scan_token(TABLE)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_284() { + if (jj_scan_token(EXTEND)) return true; return false; } - final private boolean jj_3R_370() { - if (jj_scan_token(QUOTED_STRING)) return true; + final private boolean jj_3R_159() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_284()) jj_scanpos = xsp; + if (jj_3R_372()) return true; return false; } - final private boolean jj_3_285() { + final private boolean jj_3_645() { if (jj_scan_token(COMMA)) return true; - if (jj_3R_83()) return true; + if (jj_3R_264()) return true; return false; } - final private boolean jj_3R_84() { - if (jj_3R_274()) return true; + final private boolean jj_3_281() { + if (jj_scan_token(REPEATABLE)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_286() { - if (jj_3R_154()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_285()) { jj_scanpos = xsp; break; } - } + final private boolean jj_3_646() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_264()) return true; return false; } - final private boolean jj_3R_169() { - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_280() { + if (jj_scan_token(SYSTEM)) return true; + return false; + } + + final private boolean jj_3_648() { + if (jj_3R_262()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_286()) jj_scanpos = xsp; - if (jj_scan_token(RPAREN)) return true; + if (jj_3_646()) jj_scanpos = xsp; return false; } - final private boolean jj_3R_335() { - if (jj_3R_274()) return true; + final private boolean jj_3_279() { + if (jj_scan_token(BERNOULLI)) return true; return false; } - final private boolean jj_3_284() { - if (jj_3R_120()) return true; - if (jj_3R_181()) return true; + final private boolean jj_3_644() { + if (jj_3R_261()) return true; return false; } - final private boolean jj_3R_276() { - if (jj_3R_152()) return true; + final private boolean jj_3_643() { + if (jj_3R_260()) return true; return false; } - final private boolean jj_3R_275() { - if (jj_3R_274()) return true; + final private boolean jj_3_642() { + if (jj_3R_269()) return true; return false; } - final private boolean jj_3R_180() { - if (jj_3R_152()) return true; - if (jj_3R_120()) return true; - if (jj_3R_181()) return true; + final private boolean jj_3_641() { + if (jj_3R_268()) return true; return false; } - final private boolean jj_3_673() { - if (jj_3R_273()) return true; + final private boolean jj_3_640() { + if (jj_3R_259()) return true; return false; } final private boolean jj_3_283() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_180()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_279()) { + jj_scanpos = xsp; + if (jj_3_280()) return true; + } + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3_665() { - if (jj_scan_token(UESCAPE)) return true; - if (jj_scan_token(QUOTED_STRING)) return true; + final private boolean jj_3_639() { + if (jj_3R_267()) return true; return false; } - final private boolean jj_3R_368() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_180()) return true; + final private boolean jj_3_638() { + if (jj_3R_265()) return true; + return false; + } + + final private boolean jj_3_647() { Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_283()) { jj_scanpos = xsp; break; } + xsp = jj_scanpos; + if (jj_3_638()) { + jj_scanpos = xsp; + if (jj_3_639()) { + jj_scanpos = xsp; + if (jj_3_640()) { + jj_scanpos = xsp; + if (jj_3_641()) { + jj_scanpos = xsp; + if (jj_3_642()) { + jj_scanpos = xsp; + if (jj_3_643()) { + jj_scanpos = xsp; + if (jj_3_644()) return true; } - if (jj_scan_token(RPAREN)) return true; + } + } + } + } + } + if (jj_3R_263()) return true; return false; } - final private boolean jj_3_672() { - if (jj_scan_token(UNICODE_QUOTED_IDENTIFIER)) return true; + final private boolean jj_3R_258() { Token xsp; xsp = jj_scanpos; - if (jj_3_665()) jj_scanpos = xsp; + if (jj_3_647()) { + jj_scanpos = xsp; + if (jj_3_648()) return true; + } return false; } final private boolean jj_3_282() { - if (jj_scan_token(EXTEND)) return true; + if (jj_scan_token(SUBSTITUTE)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_158() { + final private boolean jj_3R_180() { + if (jj_scan_token(TABLESAMPLE)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_282()) jj_scanpos = xsp; - if (jj_3R_368()) return true; + if (jj_3_282()) { + jj_scanpos = xsp; + if (jj_3_283()) return true; + } return false; } - final private boolean jj_3_671() { - if (jj_scan_token(BRACKET_QUOTED_IDENTIFIER)) return true; + final private boolean jj_3R_273() { return false; } - final private boolean jj_3_670() { - if (jj_scan_token(BIG_QUERY_BACK_QUOTED_IDENTIFIER)) return true; + final private boolean jj_3_628() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_264()) return true; return false; } - final private boolean jj_3_669() { - if (jj_scan_token(BACK_QUOTED_IDENTIFIER)) return true; + final private boolean jj_3_629() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_264()) return true; return false; } - final private boolean jj_3_668() { - if (jj_scan_token(QUOTED_IDENTIFIER)) return true; + final private boolean jj_3_278() { + if (jj_3R_180()) return true; return false; } - final private boolean jj_3_279() { - if (jj_scan_token(REPEATABLE)) return true; + final private boolean jj_3_626() { if (jj_scan_token(LPAREN)) return true; + if (jj_3R_264()) return true; return false; } - final private boolean jj_3_667() { - if (jj_scan_token(HYPHENATED_IDENTIFIER)) return true; + final private boolean jj_3R_272() { return false; } - final private boolean jj_3_278() { - if (jj_scan_token(SYSTEM)) return true; + final private boolean jj_3_637() { + if (jj_3R_262()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_629()) { + jj_scanpos = xsp; + if (jj_3R_273()) return true; + } return false; } - final private boolean jj_3_277() { - if (jj_scan_token(BERNOULLI)) return true; + final private boolean jj_3_627() { + if (jj_scan_token(TO)) return true; + if (jj_3R_262()) return true; return false; } - final private boolean jj_3_666() { - if (jj_scan_token(IDENTIFIER)) return true; + final private boolean jj_3_622() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_264()) return true; return false; } - final private boolean jj_3_281() { + final private boolean jj_3_624() { + if (jj_3R_262()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_277()) { - jj_scanpos = xsp; - if (jj_3_278()) return true; - } - if (jj_scan_token(LPAREN)) return true; + if (jj_3_622()) jj_scanpos = xsp; return false; } - final private boolean jj_3R_274() { + final private boolean jj_3R_271() { + return false; + } + + final private boolean jj_3_623() { + if (jj_3R_261()) return true; + return false; + } + + final private boolean jj_3_636() { + if (jj_3R_261()) return true; + if (jj_3R_263()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_666()) { - jj_scanpos = xsp; - if (jj_3_667()) { - jj_scanpos = xsp; - if (jj_3_668()) { - jj_scanpos = xsp; - if (jj_3_669()) { - jj_scanpos = xsp; - if (jj_3_670()) { - jj_scanpos = xsp; - if (jj_3_671()) { - jj_scanpos = xsp; - if (jj_3_672()) { + if (jj_3_627()) { jj_scanpos = xsp; - if (jj_3_673()) return true; - } - } - } - } - } - } + if (jj_3R_272()) return true; } return false; } - final private boolean jj_3_280() { - if (jj_scan_token(SUBSTITUTE)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3R_179() { return false; } - final private boolean jj_3R_179() { - if (jj_scan_token(TABLESAMPLE)) return true; + final private boolean jj_3_625() { + if (jj_scan_token(TO)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_280()) { + if (jj_3_623()) { jj_scanpos = xsp; - if (jj_3_281()) return true; + if (jj_3_624()) return true; } return false; } - final private boolean jj_3R_219() { - if (jj_scan_token(HOOK)) return true; + final private boolean jj_3_276() { + if (jj_3R_125()) return true; return false; } - final private boolean jj_3_276() { - if (jj_3R_179()) return true; + final private boolean jj_3_620() { + if (jj_3R_262()) return true; + if (jj_3R_263()) return true; return false; } - final private boolean jj_3_664() { - if (jj_scan_token(SATURDAY)) return true; + final private boolean jj_3R_270() { return false; } - final private boolean jj_3_663() { - if (jj_scan_token(FRIDAY)) return true; + final private boolean jj_3_275() { + if (jj_scan_token(AS)) return true; return false; } - final private boolean jj_3_662() { - if (jj_scan_token(THURSDAY)) return true; + final private boolean jj_3_619() { + if (jj_3R_261()) return true; return false; } - final private boolean jj_3_661() { - if (jj_scan_token(WEDNESDAY)) return true; + final private boolean jj_3_635() { + if (jj_3R_260()) return true; + if (jj_3R_263()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_625()) { + jj_scanpos = xsp; + if (jj_3R_271()) return true; + } return false; } - final private boolean jj_3_660() { - if (jj_scan_token(TUESDAY)) return true; + final private boolean jj_3_277() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_275()) jj_scanpos = xsp; + if (jj_3R_85()) return true; + xsp = jj_scanpos; + if (jj_3_276()) { + jj_scanpos = xsp; + if (jj_3R_179()) return true; + } return false; } - final private boolean jj_3_659() { - if (jj_scan_token(MONDAY)) return true; + final private boolean jj_3_618() { + if (jj_3R_260()) return true; return false; } - final private boolean jj_3R_271() { + final private boolean jj_3_274() { + if (jj_3R_178()) return true; + return false; + } + + final private boolean jj_3_621() { + if (jj_scan_token(TO)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_658()) { - jj_scanpos = xsp; - if (jj_3_659()) { - jj_scanpos = xsp; - if (jj_3_660()) { - jj_scanpos = xsp; - if (jj_3_661()) { - jj_scanpos = xsp; - if (jj_3_662()) { + if (jj_3_618()) { jj_scanpos = xsp; - if (jj_3_663()) { + if (jj_3_619()) { jj_scanpos = xsp; - if (jj_3_664()) return true; - } - } - } - } + if (jj_3_620()) return true; } } return false; } - final private boolean jj_3_658() { - if (jj_scan_token(SUNDAY)) return true; + final private boolean jj_3R_381() { return false; } - final private boolean jj_3R_178() { + final private boolean jj_3_273() { + if (jj_3R_177()) return true; return false; } - final private boolean jj_3_657() { - if (jj_scan_token(MILLENNIUM)) return true; + final private boolean jj_3_272() { + if (jj_3R_176()) return true; return false; } - final private boolean jj_3_274() { - if (jj_3R_124()) return true; + final private boolean jj_3_634() { + if (jj_3R_269()) return true; + if (jj_3R_263()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_621()) { + jj_scanpos = xsp; + if (jj_3R_270()) return true; + } return false; } - final private boolean jj_3_656() { - if (jj_scan_token(CENTURY)) return true; + final private boolean jj_3_267() { + if (jj_scan_token(LATERAL)) return true; return false; } - final private boolean jj_3_655() { - if (jj_scan_token(DECADE)) return true; + final private boolean jj_3_271() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_267()) jj_scanpos = xsp; + if (jj_3R_175()) return true; return false; } - final private boolean jj_3_654() { - if (jj_scan_token(EPOCH)) return true; + final private boolean jj_3_633() { + if (jj_3R_268()) return true; + if (jj_3R_263()) return true; return false; } - final private boolean jj_3R_272() { + final private boolean jj_3_632() { + if (jj_3R_259()) return true; + if (jj_3R_263()) return true; return false; } - final private boolean jj_3_653() { - if (jj_scan_token(YEAR)) return true; + final private boolean jj_3_266() { + if (jj_scan_token(WITH)) return true; + if (jj_scan_token(ORDINALITY)) return true; return false; } - final private boolean jj_3_273() { - if (jj_scan_token(AS)) return true; + final private boolean jj_3R_266() { return false; } - final private boolean jj_3_652() { - if (jj_scan_token(QUARTER)) return true; + final private boolean jj_3_617() { + if (jj_scan_token(TO)) return true; + if (jj_3R_259()) return true; return false; } - final private boolean jj_3_651() { - if (jj_scan_token(MONTH)) return true; + final private boolean jj_3_631() { + if (jj_3R_267()) return true; + if (jj_3R_263()) return true; return false; } - final private boolean jj_3_275() { + final private boolean jj_3_265() { + if (jj_scan_token(LATERAL)) return true; + return false; + } + + final private boolean jj_3_630() { + if (jj_3R_265()) return true; + if (jj_3R_263()) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_273()) jj_scanpos = xsp; - if (jj_3R_84()) return true; - xsp = jj_scanpos; - if (jj_3_274()) { + if (jj_3_617()) { jj_scanpos = xsp; - if (jj_3R_178()) return true; + if (jj_3R_266()) return true; } return false; } - final private boolean jj_3R_372() { - return false; - } - - final private boolean jj_3_636() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_271()) return true; - return false; - } - - final private boolean jj_3_272() { - if (jj_3R_177()) return true; + final private boolean jj_3_270() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_265()) jj_scanpos = xsp; + if (jj_scan_token(UNNEST)) return true; + if (jj_3R_174()) return true; return false; } - final private boolean jj_3_271() { - if (jj_3R_176()) return true; + final private boolean jj_3_264() { + if (jj_3R_169()) return true; return false; } - final private boolean jj_3_650() { - if (jj_scan_token(WEEK)) return true; + final private boolean jj_3R_219() { Token xsp; xsp = jj_scanpos; + if (jj_3_630()) { + jj_scanpos = xsp; + if (jj_3_631()) { + jj_scanpos = xsp; + if (jj_3_632()) { + jj_scanpos = xsp; + if (jj_3_633()) { + jj_scanpos = xsp; + if (jj_3_634()) { + jj_scanpos = xsp; + if (jj_3_635()) { + jj_scanpos = xsp; if (jj_3_636()) { jj_scanpos = xsp; - if (jj_3R_272()) return true; + if (jj_3_637()) return true; + } + } + } + } + } + } } return false; } - final private boolean jj_3_270() { - if (jj_3R_175()) return true; + final private boolean jj_3_263() { + if (jj_scan_token(LATERAL)) return true; return false; } - final private boolean jj_3_649() { - if (jj_scan_token(ISOYEAR)) return true; + final private boolean jj_3_261() { + if (jj_3R_169()) return true; return false; } - final private boolean jj_3_648() { - if (jj_scan_token(ISODOW)) return true; + final private boolean jj_3_269() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_263()) jj_scanpos = xsp; + if (jj_3R_173()) return true; return false; } - final private boolean jj_3_265() { - if (jj_scan_token(LATERAL)) return true; + final private boolean jj_3_260() { + if (jj_3R_168()) return true; return false; } - final private boolean jj_3_647() { - if (jj_scan_token(DOY)) return true; + final private boolean jj_3_259() { + if (jj_3R_159()) return true; return false; } - final private boolean jj_3_646() { - if (jj_scan_token(DOW)) return true; + final private boolean jj_3_258() { + if (jj_3R_158()) return true; return false; } - final private boolean jj_3_269() { + final private boolean jj_3R_172() { Token xsp; xsp = jj_scanpos; - if (jj_3_265()) jj_scanpos = xsp; - if (jj_3R_174()) return true; + if (jj_3_258()) { + jj_scanpos = xsp; + if (jj_3R_381()) return true; + } + xsp = jj_scanpos; + if (jj_3_259()) jj_scanpos = xsp; + if (jj_3R_382()) return true; + xsp = jj_scanpos; + if (jj_3_260()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_261()) jj_scanpos = xsp; return false; } - final private boolean jj_3_645() { - if (jj_scan_token(DAYOFYEAR)) return true; + final private boolean jj_3_262() { + if (jj_3R_170()) return true; return false; } - final private boolean jj_3_644() { - if (jj_scan_token(DAYOFWEEK)) return true; + final private boolean jj_3_268() { + if (jj_3R_171()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_262()) { + jj_scanpos = xsp; + if (jj_3R_172()) return true; + } return false; } - final private boolean jj_3_643() { - if (jj_scan_token(DAY)) return true; + final private boolean jj_3_616() { + if (jj_scan_token(SECONDS)) return true; return false; } @@ -40060,7 +40743,7 @@ final private boolean jj_3_643() { public boolean lookingAhead = false; private boolean jj_semLA; private int jj_gen; - final private int[] jj_la1 = new int[10]; + final private int[] jj_la1 = new int[11]; static private int[] jj_la1_0; static private int[] jj_la1_1; static private int[] jj_la1_2; @@ -40116,84 +40799,84 @@ final private boolean jj_3_643() { jj_la1_25(); } private static void jj_la1_0() { - jj_la1_0 = new int[] {0x0,0x0,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_0 = new int[] {0x0,0x0,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_1() { - jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_2() { - jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_3() { - jj_la1_3 = new int[] {0x0,0x0,0x100000,0x0,0x0,0x0,0x0,0x0,0x0,0x800,}; + jj_la1_3 = new int[] {0x0,0x0,0x100000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,}; } private static void jj_la1_4() { - jj_la1_4 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1600,}; + jj_la1_4 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1600,}; } private static void jj_la1_5() { - jj_la1_5 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_5 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_6() { - jj_la1_6 = new int[] {0x0,0x0,0x0,0x0,0x2000,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_6 = new int[] {0x0,0x0,0x0,0x0,0x0,0x2000,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_7() { - jj_la1_7 = new int[] {0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_7 = new int[] {0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_8() { - jj_la1_8 = new int[] {0x0,0x0,0x40000800,0x0,0x0,0x0,0x0,0x0,0x8000,0x0,}; + jj_la1_8 = new int[] {0x0,0x0,0x40000800,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x0,}; } private static void jj_la1_9() { - jj_la1_9 = new int[] {0x0,0x0,0x200000,0x0,0x0,0x0,0x0,0x0,0x200000,0x0,}; + jj_la1_9 = new int[] {0x0,0x0,0x200000,0x0,0x0,0x0,0x0,0x0,0x0,0x200000,0x0,}; } private static void jj_la1_10() { - jj_la1_10 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_10 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_11() { - jj_la1_11 = new int[] {0x0,0x0,0x100,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_11 = new int[] {0x0,0x0,0x100,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_12() { - jj_la1_12 = new int[] {0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_12 = new int[] {0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_13() { - jj_la1_13 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x300,0x0,0x0,}; + jj_la1_13 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x300,0x0,0x0,}; } private static void jj_la1_14() { - jj_la1_14 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_14 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_15() { - jj_la1_15 = new int[] {0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x40,0x0,}; + jj_la1_15 = new int[] {0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,}; } private static void jj_la1_16() { - jj_la1_16 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_16 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_17() { - jj_la1_17 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_17 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_18() { - jj_la1_18 = new int[] {0x2000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_18 = new int[] {0x2000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_19() { - jj_la1_19 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1ac00000,}; + jj_la1_19 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1ac00000,}; } private static void jj_la1_20() { - jj_la1_20 = new int[] {0x0,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x100000,0x0,}; + jj_la1_20 = new int[] {0x0,0x0,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x100000,0x0,}; } private static void jj_la1_21() { - jj_la1_21 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_21 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_22() { - jj_la1_22 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_22 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_23() { - jj_la1_23 = new int[] {0x0,0x400000,0x0,0x0,0x0,0x400000,0x400000,0x0,0x0,0x0,}; + jj_la1_23 = new int[] {0x0,0x800000,0x0,0x800000,0x0,0x0,0x800000,0x800000,0x0,0x0,0x0,}; } private static void jj_la1_24() { - jj_la1_24 = new int[] {0x0,0x0,0x400,0x904010,0x300000,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_24 = new int[] {0x0,0x0,0x800,0x0,0x1208020,0x600000,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_25() { - jj_la1_25 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_25 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } - final private JJCalls[] jj_2_rtns = new JJCalls[1805]; + final private JJCalls[] jj_2_rtns = new JJCalls[1829]; private boolean jj_rescan = false; private int jj_gc = 0; @@ -40206,7 +40889,7 @@ public IgniteSqlParserImpl(java.io.InputStream stream, String encoding) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 10; i++) jj_la1[i] = -1; + for (int i = 0; i < 11; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -40219,7 +40902,7 @@ public void ReInit(java.io.InputStream stream, String encoding) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 10; i++) jj_la1[i] = -1; + for (int i = 0; i < 11; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -40229,7 +40912,7 @@ public IgniteSqlParserImpl(java.io.Reader stream) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 10; i++) jj_la1[i] = -1; + for (int i = 0; i < 11; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -40239,7 +40922,7 @@ public void ReInit(java.io.Reader stream) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 10; i++) jj_la1[i] = -1; + for (int i = 0; i < 11; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -40248,7 +40931,7 @@ public IgniteSqlParserImpl(IgniteSqlParserImplTokenManager tm) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 10; i++) jj_la1[i] = -1; + for (int i = 0; i < 11; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -40257,7 +40940,7 @@ public void ReInit(IgniteSqlParserImplTokenManager tm) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 10; i++) jj_la1[i] = -1; + for (int i = 0; i < 11; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -40368,15 +41051,15 @@ private void jj_add_error_token(int kind, int pos) { public ParseException generateParseException() { jj_expentries.removeAllElements(); - boolean[] la1tokens = new boolean[827]; - for (int i = 0; i < 827; i++) { + boolean[] la1tokens = new boolean[830]; + for (int i = 0; i < 830; i++) { la1tokens[i] = false; } if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 11; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1<", + "", "\"/*\"", "", "", "", - "", + "", "", "", "", diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImplTokenManager.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImplTokenManager.java index c40a22919dfc5..6b58d3d52d45d 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImplTokenManager.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImplTokenManager.java @@ -67,7 +67,10 @@ import org.apache.calcite.sql.SqlRowTypeNameSpec; import org.apache.calcite.sql.SqlSampleSpec; import org.apache.calcite.sql.SqlSelect; +import org.apache.calcite.sql.SqlByRewriter; import org.apache.calcite.sql.SqlSelectKeyword; +import org.apache.calcite.sql.SqlStarExclude; +import org.apache.calcite.sql.SqlStarReplace; import org.apache.calcite.sql.SqlSetOption; import org.apache.calcite.sql.SqlSnapshot; import org.apache.calcite.sql.SqlTableRef; @@ -144,205 +147,205 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, switch (pos) { case 0: - if ((active2 & 0xfe00000000000000L) != 0L || (active3 & 0x7ffffL) != 0L || (active11 & 0x10000000L) != 0L) - { - jjmatchedKind = 821; - return 16; - } - if ((active12 & 0x10L) != 0L) + if ((active12 & 0x20L) != 0L) return 94; - if ((active12 & 0x20000000L) != 0L) + if ((active12 & 0x40000000L) != 0L) return 63; - if ((active5 & 0x7fffff000000000L) != 0L || (active11 & 0x200000000L) != 0L) + if ((active12 & 0x480002000000L) != 0L) + return 92; + if ((active5 & 0x7fffff000000000L) != 0L || (active11 & 0x400000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 95; } - if ((active12 & 0x90001000000L) != 0L) - return 92; - if ((active11 & 0x1000L) != 0L) + if ((active11 & 0x2000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 1; } - if ((active12 & 0x40000000L) != 0L) + if ((active12 & 0x80000000L) != 0L) return 96; - if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0x1ffffffffffffc0L) != 0L || (active3 & 0xff8001fffff80000L) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xf800000000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffc000001ffffffL) != 0L || (active11 & 0x4e55ef27efffL) != 0L) + if ((active2 & 0xfe00000000000000L) != 0L || (active3 & 0x7ffffL) != 0L || (active11 & 0x20000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; + return 16; + } + if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x635001b00000L) != 0L || (active12 & 0x1000000000L) != 0L) + return 97; + if ((active12 & 0x20000400L) != 0L) + return 98; + if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0x1ffffffffffffc0L) != 0L || (active3 & 0xff8001fffff80000L) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xf800000000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfff8000001ffffffL) != 0L || (active11 & 0x9cabde4fdfffL) != 0L) + { + jjmatchedKind = 824; return 97; } - if ((active10 & 0x3fffffe000000L) != 0L) + if ((active10 & 0x7fffffe000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 66; } - if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x31a800d80000L) != 0L || (active12 & 0x200000000L) != 0L) - return 97; - if ((active12 & 0x10000200L) != 0L) - return 98; - if ((active12 & 0x600000L) != 0L) + if ((active12 & 0xc00000L) != 0L) return 23; return -1; case 1: - if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x3efd5feeffffL) != 0L) + if ((active12 & 0x480000000000L) != 0L) + return 90; + if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x820540220000L) != 0L) + return 97; + if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x7dfabfddffffL) != 0L) { if (jjmatchedPos != 1) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 1; } return 97; } - if ((active12 & 0x90000000000L) != 0L) - return 90; - if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x4102a0110000L) != 0L) - return 97; return -1; case 2: - if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0x57fffffeefffL) != 0L) + if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x500000002000L) != 0L) + return 97; + if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0xaffffffddfffL) != 0L) { if (jjmatchedPos != 2) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 2; } return 97; } - if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x280000001000L) != 0L) - return 97; return -1; case 3: - if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0xa0025f00010e0000L) != 0L || (active11 & 0x180100e3c7L) != 0L) - return 97; - if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0x5ffda0fffef1fffeL) != 0L || (active11 & 0x7fe7fefe0c38L) != 0L) + if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0xbffb41fffef1fffeL) != 0L || (active11 & 0xffcffdfc1870L) != 0L) { if (jjmatchedPos != 3) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 3; } return 97; } + if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0x4004be00010e0000L) != 0L || (active11 & 0x300201c78fL) != 0L) + return 97; if ((active2 & 0x8000000000000000L) != 0L) return 99; return -1; case 4: - if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x1da0a060001000L) != 0L || (active11 & 0x430022204809L) != 0L) - return 97; - if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0x5fe01e5f9ef5effeL) != 0L || (active11 & 0x3ce7ddde05b4L) != 0L) + if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0xbfc03cbf9ef5effeL) != 0L || (active11 & 0x79cfbbbc0b68L) != 0L) { if (jjmatchedPos != 4) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 4; } return 97; } + if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x3b414060001000L) != 0L || (active11 & 0x860044409012L) != 0L) + return 97; if ((active2 & 0x8000000000000000L) != 0L) return 99; return -1; case 5: - if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0x5ff01e071e75effeL) != 0L || (active11 & 0x3ce7dfee0514L) != 0L) + if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x1000a880800000L) != 0L || (active11 & 0x200140L) != 0L) + return 97; + if ((active2 & 0x8000000000000000L) != 0L) + return 99; + if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0xbfe03c171e75effeL) != 0L || (active11 & 0x79cfbfdc0a28L) != 0L) { if (jjmatchedPos != 5) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 5; } return 97; } - if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x8005880800000L) != 0L || (active11 & 0x1000a0L) != 0L) - return 97; - if ((active2 & 0x8000000000000000L) != 0L) - return 99; return -1; case 6: - if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x1f2000070241e000L) != 0L || (active11 & 0x18c100040500L) != 0L) + if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x3e4000070241e000L) != 0L || (active11 & 0x318200080a00L) != 0L) return 97; - if ((active2 & 0x8000000000000000L) != 0L) - return 99; - if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x40d01e001c340ffeL) != 0L || (active11 & 0x2426dffa0014L) != 0L) + if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x81a03c101c340ffeL) != 0L || (active11 & 0x484dbff40028L) != 0L) { if (jjmatchedPos != 6) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 6; } return 97; } - return -1; - case 7: - if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0x50000000300004L) != 0L || (active11 & 0x444020004L) != 0L) - return 97; if ((active2 & 0x8000000000000000L) != 0L) return 99; - if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0x50801e001c05cffaL) != 0L || (active11 & 0x24229bf80010L) != 0L) + return -1; + case 7: + if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0xa1003c001c05cffaL) != 0L || (active11 & 0x484537f00020L) != 0L) { if (jjmatchedPos != 7) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 7; } return 97; } + if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0xa0001000300004L) != 0L || (active11 & 0x888040008L) != 0L) + return 97; + if ((active2 & 0x8000000000000000L) != 0L) + return 99; return -1; case 8: - if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x10001e001805c87aL) != 0L || (active11 & 0x24208be80010L) != 0L) + if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x20003c001805c87aL) != 0L || (active11 & 0x484117d00020L) != 0L) { if (jjmatchedPos != 8) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 8; } return 97; } - if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x4080000004000780L) != 0L || (active11 & 0x210100000L) != 0L) + if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x8100000004000780L) != 0L || (active11 & 0x420200000L) != 0L) return 97; return -1; case 9: - if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x1e001801cc7aL) != 0L || (active11 & 0x200081680010L) != 0L) + if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x2000000000040100L) != 0L || (active11 & 0x84015000000L) != 0L) + return 97; + if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x3c001801cc7aL) != 0L || (active11 & 0x400102d00020L) != 0L) { if (jjmatchedPos != 9) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 9; } return 97; } - if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x1000000000040100L) != 0L || (active11 & 0x4200a800000L) != 0L) - return 97; return -1; case 10: - if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x81400000L) != 0L) + if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x102800000L) != 0L) return 97; - if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x1e001001c402L) != 0L || (active11 & 0x200000280010L) != 0L) + if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x3c001001c402L) != 0L || (active11 & 0x400000500020L) != 0L) { if (jjmatchedPos != 10) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 10; } return 97; } return -1; case 11: - if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x1e0010014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x3c0010014472L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 11) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 11; } return 97; } - if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x80010L) != 0L) + if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x100020L) != 0L) return 97; return -1; case 12: - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x1e0000014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x3c0000014472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 12; return 97; } @@ -352,9 +355,9 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, case 13: if ((active1 & 0x4000000000200000L) != 0L || (active2 & 0x8000L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x10000L) != 0L || (active6 & 0x8000003000000L) != 0L || (active7 & 0x4000400000008000L) != 0L || (active9 & 0x800000000024000L) != 0L || (active10 & 0x10000L) != 0L) return 97; - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x1e0000004472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x3c0000004472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 13; return 97; } @@ -362,19 +365,19 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, case 14: if ((active0 & 0x20000000000L) != 0L || (active1 & 0x100084800000200L) != 0L || (active5 & 0x280L) != 0L || (active6 & 0x30000000000L) != 0L || (active7 & 0x100100000000L) != 0L || (active8 & 0x8000000000000000L) != 0L || (active9 & 0x5000004200010000L) != 0L || (active10 & 0x4402L) != 0L) return 97; - if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 14; return 97; } return -1; case 15: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 15) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 15; } return 97; @@ -383,11 +386,11 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, return 97; return -1; case 16: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 16) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 16; } return 97; @@ -398,9 +401,9 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, case 17: if ((active1 & 0x2000000080L) != 0L || (active8 & 0x400000000000000L) != 0L) return 97; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 17; return 97; } @@ -408,20 +411,20 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, case 18: if ((active8 & 0xb00000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x10L) != 0L) return 97; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 18) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 18; } return 97; } return -1; case 19: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 19; return 97; } @@ -431,27 +434,27 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, case 20: if ((active0 & 0x1000000L) != 0L || (active1 & 0x8000040L) != 0L || (active2 & 0x100000000000000L) != 0L || (active7 & 0x200000000L) != 0L) return 97; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 20; return 97; } return -1; case 21: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 21; return 97; } - if ((active2 & 0x2000L) != 0L || (active10 & 0xc0000000020L) != 0L) + if ((active2 & 0x2000L) != 0L || (active10 & 0x180000000020L) != 0L) return 97; return -1; case 22: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 22; return 97; } @@ -459,39 +462,39 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, return 97; return -1; case 23: - if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x100000000040L) != 0L) + if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x200000000040L) != 0L) return 97; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x20000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x40000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 23; return 97; } return -1; case 24: - if ((active6 & 0x20000000L) != 0L || (active10 & 0x20000000000L) != 0L) + if ((active6 & 0x20000000L) != 0L || (active10 & 0x40000000000L) != 0L) return 97; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 24; return 97; } return -1; case 25: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 25; return 97; } - if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x200000L) != 0L) + if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x400000L) != 0L) return 97; return -1; case 26: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 26; return 97; } @@ -499,9 +502,9 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, return 97; return -1; case 27: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 27; return 97; } @@ -509,17 +512,17 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, case 28: if ((active8 & 0x200000000000000L) != 0L) return 97; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 28; return 97; } return -1; case 29: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 29; return 97; } @@ -527,17 +530,17 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, case 30: if ((active1 & 0x400000000000000L) != 0L) return 97; - if ((active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 30; return 97; } return -1; case 31: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 31; return 97; } @@ -545,9 +548,9 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1, return 97; return -1; case 32: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 32; return 97; } @@ -580,74 +583,76 @@ private final int jjMoveStringLiteralDfa0_1() { case 33: jjmatchedKind = 1; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000L); case 34: - return jjStartNfaWithStates_1(0, 798, 96); + return jjStartNfaWithStates_1(0, 799, 96); case 36: - return jjStartNfaWithStates_1(0, 801, 97); + return jjStartNfaWithStates_1(0, 804, 97); case 37: - return jjStopAtPos(0, 793); + return jjStopAtPos(0, 794); + case 38: + return jjStopAtPos(0, 802); case 39: - return jjStartNfaWithStates_1(0, 797, 63); + return jjStartNfaWithStates_1(0, 798, 63); case 40: - return jjStopAtPos(0, 766); - case 41: return jjStopAtPos(0, 767); + case 41: + return jjStopAtPos(0, 768); case 42: - jjmatchedKind = 791; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000000L); + jjmatchedKind = 792; + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000000L); case 43: - return jjStopAtPos(0, 788); + return jjStopAtPos(0, 789); case 44: - return jjStopAtPos(0, 778); + return jjStopAtPos(0, 779); case 45: - jjmatchedKind = 789; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000L); + jjmatchedKind = 790; + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000L); case 46: - jjmatchedKind = 777; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + jjmatchedKind = 778; + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L); case 47: - jjmatchedKind = 792; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x90000000000L); + jjmatchedKind = 793; + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x480000000000L); case 58: - jjmatchedKind = 783; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L); + jjmatchedKind = 784; + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000000L); case 59: - return jjStopAtPos(0, 776); + return jjStopAtPos(0, 777); case 60: - jjmatchedKind = 781; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x50000L); + jjmatchedKind = 782; + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000a0000L); case 61: - jjmatchedKind = 779; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); - case 62: jjmatchedKind = 780; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + case 62: + jjmatchedKind = 781; + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L); case 63: - return jjStopAtPos(0, 782); + return jjStopAtPos(0, 783); case 91: - return jjStopAtPos(0, 774); - case 93: return jjStopAtPos(0, 775); + case 93: + return jjStopAtPos(0, 776); case 94: - return jjStopAtPos(0, 800); + return jjStopAtPos(0, 801); case 65: case 97: jjmatchedKind = 3; - return jjMoveStringLiteralDfa1_1(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x110000180000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x220000300000L, 0x0L); case 66: case 98: - return jjMoveStringLiteralDfa1_1(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L, 0x0L); case 67: case 99: jjmatchedKind = 52; - return jjMoveStringLiteralDfa1_1(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa000c00000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x14001800000L, 0x0L); case 68: case 100: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000L, 0x0L); case 69: case 101: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L, 0x0L); case 70: case 102: return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x1fffff80000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); @@ -660,67 +665,67 @@ private final int jjMoveStringLiteralDfa0_1() return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x1f80000000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 73: case 105: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa0010000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x140020000L, 0x0L); case 74: case 106: return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0xffe0000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 75: case 107: jjmatchedKind = 296; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000000L, 0x0L); case 76: case 108: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); case 77: case 109: jjmatchedKind = 322; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x200000000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x400000000000L, 0x0L); case 78: case 110: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L, 0x0L); case 79: case 111: return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xf800000000000000L, 0x3fffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 80: case 112: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x440000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x880000000L, 0x0L); case 81: case 113: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x20000000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x40000000000L, 0x0L); case 82: case 114: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x80000000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x100000000000L, 0x0L); case 83: case 115: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x45000000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x8a000000000L, 0x0L); case 84: case 116: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x400000020000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x800000040000L, 0x0L); case 85: case 117: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3fffffe000000L, 0x0L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffffe000000L, 0x0L, 0x0L); case 86: case 118: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3ffc000000000000L, 0x2000000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7ff8000000000000L, 0x4000000L, 0x0L); case 87: case 119: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000000000000000L, 0xc200fffL, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000000000000L, 0x18401fffL, 0x0L); case 88: case 120: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000L, 0x0L); case 89: case 121: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x6000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000L, 0x0L); case 90: case 122: - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000L, 0x0L); + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000L, 0x0L); case 123: - return jjStartNfaWithStates_1(0, 772, 94); + return jjStartNfaWithStates_1(0, 773, 94); case 124: - jjmatchedKind = 799; - return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x4000000L); + jjmatchedKind = 800; + return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); case 125: - return jjStopAtPos(0, 773); + return jjStopAtPos(0, 774); case 126: return jjStopAtPos(0, 2); default : @@ -737,55 +742,59 @@ private final int jjMoveStringLiteralDfa1_1(long active0, long active1, long act switch(curChar) { case 42: - if ((active12 & 0x80000000000L) != 0L) + if ((active12 & 0x400000000000L) != 0L) { - jjmatchedKind = 811; + jjmatchedKind = 814; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x10000000000L); + return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x80000000000L); case 46: - if ((active12 & 0x10000000L) != 0L) - return jjStopAtPos(1, 796); + if ((active12 & 0x20000000L) != 0L) + return jjStopAtPos(1, 797); break; case 47: - if ((active12 & 0x20000000000L) != 0L) - return jjStopAtPos(1, 809); + if ((active12 & 0x100000000000L) != 0L) + return jjStopAtPos(1, 812); break; case 58: - if ((active12 & 0x400000000L) != 0L) - return jjStopAtPos(1, 802); + if ((active12 & 0x2000000000L) != 0L) + return jjStopAtPos(1, 805); + break; + case 60: + if ((active12 & 0x800000000L) != 0L) + return jjStopAtPos(1, 803); break; case 61: - if ((active12 & 0x10000L) != 0L) - return jjStopAtPos(1, 784); - else if ((active12 & 0x20000L) != 0L) + if ((active12 & 0x20000L) != 0L) return jjStopAtPos(1, 785); - else if ((active12 & 0x80000L) != 0L) - return jjStopAtPos(1, 787); + else if ((active12 & 0x40000L) != 0L) + return jjStopAtPos(1, 786); + else if ((active12 & 0x100000L) != 0L) + return jjStopAtPos(1, 788); break; case 62: - if ((active12 & 0x40000L) != 0L) - return jjStopAtPos(1, 786); - else if ((active12 & 0x400000L) != 0L) - return jjStopAtPos(1, 790); - else if ((active12 & 0x8000000L) != 0L) - return jjStopAtPos(1, 795); + if ((active12 & 0x80000L) != 0L) + return jjStopAtPos(1, 787); + else if ((active12 & 0x800000L) != 0L) + return jjStopAtPos(1, 791); + else if ((active12 & 0x10000000L) != 0L) + return jjStopAtPos(1, 796); break; case 65: case 97: - return jjMoveStringLiteralDfa2_1(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0x7fc000000000000L, active11, 0x200443c40000L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0xff8000000000000L, active11, 0x400887880000L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa2_1(active0, 0x70L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 67: case 99: - return jjMoveStringLiteralDfa2_1(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x1000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x2000000000L, active12, 0L); case 68: case 100: return jjMoveStringLiteralDfa2_1(active0, 0x700L, active1, 0L, active2, 0L, active3, 0x2000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 69: case 101: - return jjMoveStringLiteralDfa2_1(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xd800000002000000L, active11, 0x84000026001L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xb000000002000000L, active11, 0x10800004c003L, active12, 0L); case 70: case 102: if ((active5 & 0x8000000000000000L) != 0L) @@ -793,18 +802,18 @@ else if ((active12 & 0x8000000L) != 0L) jjmatchedKind = 383; jjmatchedPos = 1; } - else if ((active11 & 0x10000L) != 0L) - return jjStartNfaWithStates_1(1, 720, 97); - return jjMoveStringLiteralDfa2_1(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000L, active12, 0L); + else if ((active11 & 0x20000L) != 0L) + return jjStartNfaWithStates_1(1, 721, 97); + return jjMoveStringLiteralDfa2_1(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); case 71: case 103: return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 72: case 104: - return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0xeL, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0x1cL, active12, 0L); case 73: case 105: - return jjMoveStringLiteralDfa2_1(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x2000000000000000L, active11, 0x8000001f0L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x4000000000000000L, active11, 0x10000003e0L, active12, 0L); case 75: case 107: return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -813,7 +822,7 @@ else if ((active11 & 0x10000L) != 0L) return jjMoveStringLiteralDfa2_1(active0, 0x80000001f000L, active1, 0xf000L, active2, 0xc00000000000000L, active3, 0x8000400006000000L, active4, 0L, active5, 0L, active6, 0x1c00000000002L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 77: case 109: - return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x1000L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x2000L, active12, 0L); case 78: case 110: if ((active4 & 0x10L) != 0L) @@ -828,7 +837,7 @@ else if ((active6 & 0x8L) != 0L) jjmatchedKind = 387; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_1(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0xffc000000L, active11, 0x1000b0000000L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1ffc000000L, active11, 0x200160000000L, active12, 0L); case 79: case 111: if ((active3 & 0x800000000000L) != 0L) @@ -846,10 +855,10 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 640; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_1(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x40a300008200L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x814600010400L, active12, 0L); case 80: case 112: - return jjMoveStringLiteralDfa2_1(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0x7000000000L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0xe000000000L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x8L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xfffffffe00000000L, active9, 0x7fffffL, active10, 0L, active11, 0L, active12, 0L); @@ -860,7 +869,7 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 393; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_1(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0xc200c00L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0x18401800L, active12, 0L); case 83: case 115: if ((active0 & 0x2000000L) != 0L) @@ -873,7 +882,7 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 281; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_1(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3f8000000000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x7f0000000000L, active11, 0x20000000000L, active12, 0L); case 84: case 116: if ((active0 & 0x100000000L) != 0L) @@ -881,10 +890,10 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 32; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_1(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x1c00000000000L, active11, 0x40000100000L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x3800000000000L, active11, 0x80000200000L, active12, 0L); case 85: case 117: - return jjMoveStringLiteralDfa2_1(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x2000000c00000L, active11, 0x20000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_1(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x4000000c00000L, active11, 0x40000000000L, active12, 0L); case 86: case 118: return jjMoveStringLiteralDfa2_1(active0, 0x2000000000L, active1, 0L, active2, 0L, active3, 0x40L, active4, 0L, active5, 0L, active6, 0x3c0000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -897,8 +906,8 @@ else if ((active4 & 0x2000000L) != 0L) return jjStartNfaWithStates_1(1, 51, 97); return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0x1c0000000000020L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x3c0000000000L, active10, 0x1000000L, active11, 0L, active12, 0L); case 124: - if ((active12 & 0x4000000L) != 0L) - return jjStopAtPos(1, 794); + if ((active12 & 0x8000000L) != 0L) + return jjStopAtPos(1, 795); break; default : break; @@ -917,14 +926,14 @@ private final int jjMoveStringLiteralDfa2_1(long old0, long active0, long old1, switch(curChar) { case 43: - if ((active12 & 0x10000000000L) != 0L) - return jjStopAtPos(2, 808); + if ((active12 & 0x80000000000L) != 0L) + return jjStopAtPos(2, 811); break; case 65: case 97: if ((active0 & 0x100L) != 0L) return jjStartNfaWithStates_1(2, 8, 97); - return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x8000000ffcL, active11, 0x14100c006400L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x10000000ffcL, active11, 0x28201800c800L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0x20000000020000L, active2, 0L, active3, 0L, active4, 0x100100000000000L, active5, 0L, active6, 0x8000000000000000L, active7, 0L, active8, 0L, active9, 0x1c07e00000000L, active10, 0x4000000L, active11, 0L, active12, 0L); @@ -937,7 +946,7 @@ else if ((active2 & 0x200000L) != 0L) jjmatchedKind = 149; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x10c40000L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x21880000L, active12, 0L); case 68: case 100: if ((active0 & 0x200L) != 0L) @@ -958,14 +967,14 @@ else if ((active6 & 0x2L) != 0L) return jjStartNfaWithStates_1(2, 385, 97); else if ((active6 & 0x400000L) != 0L) return jjStartNfaWithStates_1(2, 406, 97); - return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x4000001020000000L, active11, 0x20000010L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x8000002020000000L, active11, 0x40000020L, active12, 0L); case 69: case 101: if ((active0 & 0x100000L) != 0L) return jjStartNfaWithStates_1(2, 20, 97); else if ((active6 & 0x10L) != 0L) return jjStartNfaWithStates_1(2, 388, 97); - return jjMoveStringLiteralDfa3_1(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0xa0001f0000401000L, active11, 0x2000000000fL, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0x40003e0000401000L, active11, 0x4000000001fL, active12, 0L); case 70: case 102: if ((active7 & 0x200L) != 0L) @@ -973,14 +982,14 @@ else if ((active6 & 0x10L) != 0L) jjmatchedKind = 457; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_1(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x1c00000000000L, active11, 0x80000080000L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x3800000000000L, active11, 0x100000100000L, active12, 0L); case 71: case 103: if ((active0 & 0x2000000000L) != 0L) return jjStartNfaWithStates_1(2, 37, 97); else if ((active4 & 0x200000000000L) != 0L) return jjStartNfaWithStates_1(2, 301, 97); - return jjMoveStringLiteralDfa3_1(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000L, active12, 0L); case 72: case 104: return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x8020000000000L, active6, 0x4000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -988,7 +997,7 @@ else if ((active4 & 0x200000000000L) != 0L) case 105: if ((active6 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_1(2, 432, 97); - return jjMoveStringLiteralDfa3_1(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x22000c007e000L, active11, 0x200800L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x44000c007e000L, active11, 0x401000L, active12, 0L); case 74: case 106: return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -1007,14 +1016,14 @@ else if ((active8 & 0x200000000L) != 0L) jjmatchedKind = 545; jjmatchedPos = 2; } - else if ((active11 & 0x1000L) != 0L) - return jjStartNfaWithStates_1(2, 716, 97); - return jjMoveStringLiteralDfa3_1(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x1c000000000000L, active11, 0xa82000000L, active12, 0L); + else if ((active11 & 0x2000L) != 0L) + return jjStartNfaWithStates_1(2, 717, 97); + return jjMoveStringLiteralDfa3_1(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x38000000000000L, active11, 0x1504000000L, active12, 0L); case 77: case 109: if ((active9 & 0x10000000000L) != 0L) return jjStartNfaWithStates_1(2, 616, 97); - return jjMoveStringLiteralDfa3_1(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x8000020000L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x10000040000L, active12, 0L); case 78: case 110: if ((active5 & 0x800000L) != 0L) @@ -1022,10 +1031,10 @@ else if ((active11 & 0x1000L) != 0L) jjmatchedKind = 343; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_1(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x2000008020L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x4000010040L, active12, 0L); case 79: case 111: - return jjMoveStringLiteralDfa3_1(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x200000L, active12, 0L); case 80: case 112: if ((active3 & 0x4000L) != 0L) @@ -1037,7 +1046,7 @@ else if ((active3 & 0x400000000000000L) != 0L) return jjStartNfaWithStates_1(2, 250, 97); else if ((active5 & 0x8L) != 0L) return jjStartNfaWithStates_1(2, 323, 97); - return jjMoveStringLiteralDfa3_1(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x2201000002L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x4201000002L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -1053,7 +1062,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 422; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_1(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x1fe0000000000000L, active11, 0x4040000200L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x3fc0000000000000L, active11, 0x8080000400L, active12, 0L); case 83: case 115: if ((active0 & 0x10L) != 0L) @@ -1061,7 +1070,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 4; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_1(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x4002000000L, active11, 0x400000000L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x9002000000L, active11, 0x800000000L, active12, 0L); case 84: case 116: if ((active0 & 0x400000000000L) != 0L) @@ -1087,7 +1096,7 @@ else if ((active8 & 0x40000L) != 0L) jjmatchedKind = 530; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_1(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x4000010001c0L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x800002000380L, active12, 0L); case 85: case 117: return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0x1000000000000L, active2, 0x4000000000000L, active3, 0x1800000100000008L, active4, 0L, active5, 0L, active6, 0L, active7, 0x780000000000L, active8, 0x10000000L, active9, 0x8000000000000L, active10, 0x180000L, active11, 0L, active12, 0L); @@ -1113,7 +1122,7 @@ else if ((active7 & 0x800000000000L) != 0L) jjmatchedKind = 330; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L, active12, 0L); case 89: case 121: if ((active0 & 0x40000L) != 0L) @@ -1130,7 +1139,7 @@ else if ((active4 & 0x20000000000L) != 0L) jjmatchedKind = 297; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_1(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_1(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x20000000000L, active12, 0L); case 90: case 122: return jjMoveStringLiteralDfa3_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -1153,15 +1162,15 @@ private final int jjMoveStringLiteralDfa3_1(long old0, long active0, long old1, case 45: return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 49: - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x800000000000L, active11, 0L); - case 51: return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1000000000000L, active11, 0L); + case 51: + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000000000L, active11, 0L); case 56: - if ((active10 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_1(3, 686, 97); + if ((active10 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_1(3, 687, 97); break; case 95: - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0x60000000200002L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0xc0000000200002L, active11, 0x400000000000L); case 65: case 97: if ((active2 & 0x40L) != 0L) @@ -1171,14 +1180,14 @@ private final int jjMoveStringLiteralDfa3_1(long old0, long active0, long old1, } else if ((active4 & 0x20000000L) != 0L) return jjStartNfaWithStates_1(3, 285, 97); - return jjMoveStringLiteralDfa4_1(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x1400001000L, active11, 0x400041000000L); + return jjMoveStringLiteralDfa4_1(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x2400001000L, active11, 0x800082000000L); case 66: case 98: if ((active0 & 0x800000000000L) != 0L) return jjStartNfaWithStates_1(3, 47, 97); else if ((active1 & 0x4000L) != 0L) return jjStartNfaWithStates_1(3, 78, 97); - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000800000L, active11, 0L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000800000L, active11, 0L); case 67: case 99: if ((active2 & 0x4000000000L) != 0L) @@ -1191,7 +1200,7 @@ else if ((active3 & 0x800L) != 0L) jjmatchedKind = 203; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_1(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x100000002000000L, active11, 0L); + return jjMoveStringLiteralDfa4_1(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x200000002000000L, active11, 0L); case 68: case 100: if ((active3 & 0x200000000000000L) != 0L) @@ -1206,9 +1215,9 @@ else if ((active7 & 0x20L) != 0L) jjmatchedKind = 453; jjmatchedPos = 3; } - else if ((active10 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_1(3, 689, 97); - return jjMoveStringLiteralDfa4_1(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x20L); + else if ((active10 & 0x4000000000000L) != 0L) + return jjStartNfaWithStates_1(3, 690, 97); + return jjMoveStringLiteralDfa4_1(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x40L); case 69: case 101: if ((active0 & 0x400000000000000L) != 0L) @@ -1253,9 +1262,9 @@ else if ((active10 & 0x80000L) != 0L) return jjStartNfaWithStates_1(3, 659, 97); else if ((active10 & 0x1000000L) != 0L) return jjStartNfaWithStates_1(3, 664, 97); - else if ((active11 & 0x8000L) != 0L) - return jjStartNfaWithStates_1(3, 719, 97); - return jjMoveStringLiteralDfa4_1(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0x6820000000L, active11, 0x20000000L); + else if ((active11 & 0x10000L) != 0L) + return jjStartNfaWithStates_1(3, 720, 97); + return jjMoveStringLiteralDfa4_1(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0xc820000000L, active11, 0x40000000L); case 70: case 102: if ((active0 & 0x4000000L) != 0L) @@ -1265,7 +1274,7 @@ else if ((active8 & 0x200L) != 0L) break; case 71: case 103: - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x800001e000L, active11, 0x100000000L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x1000001e000L, active11, 0x200000000L); case 72: case 104: if ((active0 & 0x2000000000000L) != 0L) @@ -1274,29 +1283,29 @@ else if ((active2 & 0x200000000000000L) != 0L) return jjStartNfaWithStates_1(3, 185, 97); else if ((active6 & 0x1000000000L) != 0L) return jjStartNfaWithStates_1(3, 420, 97); - else if ((active11 & 0x40L) != 0L) + else if ((active11 & 0x80L) != 0L) { - jjmatchedKind = 710; + jjmatchedKind = 711; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_1(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0xc00180L); + return jjMoveStringLiteralDfa4_1(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x1800300L); case 73: case 105: - return jjMoveStringLiteralDfa4_1(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x200000200000004L, active11, 0x80080000L); + return jjMoveStringLiteralDfa4_1(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x400001200000004L, active11, 0x100100000L); case 75: case 107: if ((active7 & 0x10L) != 0L) return jjStartNfaWithStates_1(3, 452, 97); else if ((active8 & 0x80L) != 0L) return jjStartNfaWithStates_1(3, 519, 97); - else if ((active10 & 0x8000000000000000L) != 0L) + else if ((active11 & 0x1L) != 0L) { - jjmatchedKind = 703; + jjmatchedKind = 704; jjmatchedPos = 3; } - else if ((active11 & 0x200L) != 0L) - return jjStartNfaWithStates_1(3, 713, 97); - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x40001L); + else if ((active11 & 0x400L) != 0L) + return jjStartNfaWithStates_1(3, 714, 97); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80002L); case 76: case 108: if ((active0 & 0x20000000000000L) != 0L) @@ -1318,9 +1327,9 @@ else if ((active5 & 0x20000000000000L) != 0L) } else if ((active7 & 0x80L) != 0L) return jjStartNfaWithStates_1(3, 455, 97); - else if ((active11 & 0x800000000L) != 0L) - return jjStartNfaWithStates_1(3, 739, 97); - return jjMoveStringLiteralDfa4_1(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x100000000000L); + else if ((active11 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_1(3, 740, 97); + return jjMoveStringLiteralDfa4_1(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x200000000000L); case 77: case 109: if ((active3 & 0x2000000000L) != 0L) @@ -1330,7 +1339,7 @@ else if ((active10 & 0x20000L) != 0L) jjmatchedKind = 657; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_1(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x100000L); + return jjMoveStringLiteralDfa4_1(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x200000L); case 78: case 110: if ((active4 & 0x40000000L) != 0L) @@ -1346,28 +1355,28 @@ else if ((active6 & 0x800000000000L) != 0L) return jjStartNfaWithStates_1(3, 431, 97); else if ((active9 & 0x4000000000000L) != 0L) return jjStartNfaWithStates_1(3, 626, 97); - else if ((active11 & 0x2L) != 0L) + else if ((active11 & 0x4L) != 0L) { - jjmatchedKind = 705; + jjmatchedKind = 706; jjmatchedPos = 3; } - else if ((active11 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_1(3, 740, 97); - return jjMoveStringLiteralDfa4_1(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x4000200100100ff8L, active11, 0x10000000004L); + else if ((active11 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_1(3, 741, 97); + return jjMoveStringLiteralDfa4_1(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x8000400100100ff8L, active11, 0x20000000008L); case 79: case 111: if ((active3 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_1(3, 240, 97); else if ((active4 & 0x800000L) != 0L) return jjStartNfaWithStates_1(3, 279, 97); - return jjMoveStringLiteralDfa4_1(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x200000000L); + return jjMoveStringLiteralDfa4_1(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x400000000L); case 80: case 112: if ((active2 & 0x20000000000000L) != 0L) return jjStartNfaWithStates_1(3, 181, 97); else if ((active8 & 0x2000000L) != 0L) return jjStartNfaWithStates_1(3, 537, 97); - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x800c020400L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x10018040800L); case 81: case 113: return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000L, active11, 0L); @@ -1393,17 +1402,17 @@ else if ((active6 & 0x40000L) != 0L) jjmatchedKind = 402; jjmatchedPos = 3; } - else if ((active10 & 0x10000000000L) != 0L) + else if ((active10 & 0x20000000000L) != 0L) { - jjmatchedKind = 680; + jjmatchedKind = 681; jjmatchedPos = 3; } - else if ((active11 & 0x2000L) != 0L) + else if ((active11 & 0x4000L) != 0L) { - jjmatchedKind = 717; + jjmatchedKind = 718; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_1(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x1e0000000000L, active11, 0xa0010004008L); + return jjMoveStringLiteralDfa4_1(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x3c0000000000L, active11, 0x140020008010L); case 83: case 115: if ((active2 & 0x80000L) != 0L) @@ -1414,7 +1423,7 @@ else if ((active8 & 0x80000L) != 0L) return jjStartNfaWithStates_1(3, 531, 97); else if ((active9 & 0x10000000000000L) != 0L) return jjStartNfaWithStates_1(3, 628, 97); - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x1800000000400000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x3000000000400000L, active11, 0x800000000L); case 84: case 116: if ((active0 & 0x800000000000000L) != 0L) @@ -1434,27 +1443,27 @@ else if ((active6 & 0x800000000L) != 0L) return jjStartNfaWithStates_1(3, 419, 97); else if ((active9 & 0x400000L) != 0L) return jjStartNfaWithStates_1(3, 598, 97); - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x42000200810L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x84000401020L); case 85: case 117: - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x1c000000000000L, active11, 0x2000000L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x38000000000000L, active11, 0x4000000L); case 86: case 118: if ((active6 & 0x400000000000000L) != 0L) return jjStartNfaWithStates_1(3, 442, 97); - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x4000000000L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x8000000000L); case 87: case 119: if ((active8 & 0x200000L) != 0L) return jjStartNfaWithStates_1(3, 533, 97); - else if ((active10 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_1(3, 701, 97); + else if ((active10 & 0x4000000000000000L) != 0L) + return jjStartNfaWithStates_1(3, 702, 97); return jjMoveStringLiteralDfa4_1(active0, 0x80000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: if ((active6 & 0x20L) != 0L) return jjStartNfaWithStates_1(3, 389, 97); - return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x400000000000000L, active11, 0L); + return jjMoveStringLiteralDfa4_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x800000000000000L, active11, 0L); default : break; } @@ -1472,18 +1481,18 @@ private final int jjMoveStringLiteralDfa4_1(long old0, long active0, long old1, switch(curChar) { case 50: - if ((active10 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_1(4, 688, 97); + if ((active10 & 0x2000000000000L) != 0L) + return jjStartNfaWithStates_1(4, 689, 97); break; case 54: - if ((active10 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_1(4, 687, 97); + if ((active10 & 0x1000000000000L) != 0L) + return jjStartNfaWithStates_1(4, 688, 97); break; case 95: - return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x1e0000040000L, active11, 0xd000000L); + return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x3c0000040000L, active11, 0x1a000000L); case 65: case 97: - return jjMoveStringLiteralDfa5_1(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x200000002000000L, active11, 0L); + return jjMoveStringLiteralDfa5_1(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x400000002000000L, active11, 0L); case 66: case 98: if ((active5 & 0x40000000000L) != 0L) @@ -1491,9 +1500,9 @@ private final int jjMoveStringLiteralDfa4_1(long old0, long active0, long old1, return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0x80L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000L, active8, 0x3e000000000L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - if ((active11 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_1(4, 744, 97); - return jjMoveStringLiteralDfa5_1(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x200000000000L); + if ((active11 & 0x20000000000L) != 0L) + return jjStartNfaWithStates_1(4, 745, 97); + return jjMoveStringLiteralDfa5_1(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x400000000000L); case 68: case 100: if ((active3 & 0x100000000L) != 0L) @@ -1540,21 +1549,21 @@ else if ((active9 & 0x400000000000L) != 0L) jjmatchedKind = 622; jjmatchedPos = 4; } - else if ((active10 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_1(4, 679, 97); - else if ((active10 & 0x4000000000000L) != 0L) + else if ((active10 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_1(4, 680, 97); + else if ((active10 & 0x8000000000000L) != 0L) { - jjmatchedKind = 690; + jjmatchedKind = 691; jjmatchedPos = 4; } - else if ((active11 & 0x8L) != 0L) - return jjStartNfaWithStates_1(4, 707, 97); - else if ((active11 & 0x800L) != 0L) + else if ((active11 & 0x10L) != 0L) + return jjStartNfaWithStates_1(4, 708, 97); + else if ((active11 & 0x1000L) != 0L) { - jjmatchedKind = 715; + jjmatchedKind = 716; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_1(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x4018000000000000L, active11, 0x80002e00004L); + return jjMoveStringLiteralDfa5_1(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x8030000000000000L, active11, 0x100005c00008L); case 70: case 102: if ((active2 & 0x1000000000L) != 0L) @@ -1562,9 +1571,9 @@ else if ((active11 & 0x800L) != 0L) return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0x60000L, active3, 0x1L, active4, 0L, active5, 0x10000000L, active6, 0L, active7, 0L, active8, 0x800000000000L, active9, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_1(4, 685, 97); - return jjMoveStringLiteralDfa5_1(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e000L, active11, 0x200000000L); + if ((active10 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_1(4, 686, 97); + return jjMoveStringLiteralDfa5_1(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100001e000L, active11, 0x400000000L); case 72: case 104: if ((active2 & 0x800000000L) != 0L) @@ -1583,10 +1592,10 @@ else if ((active5 & 0x80000000L) != 0L) jjmatchedKind = 351; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000000L, active11, 0x10L); + return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000000L, active11, 0x20L); case 73: case 105: - return jjMoveStringLiteralDfa5_1(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x1c80000000000000L, active11, 0x46100100080L); + return jjMoveStringLiteralDfa5_1(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x3900000000000000L, active11, 0x8c200200100L); case 75: case 107: if ((active1 & 0x800L) != 0L) @@ -1607,9 +1616,9 @@ else if ((active4 & 0x2000000000000000L) != 0L) jjmatchedKind = 317; jjmatchedPos = 4; } - else if ((active11 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_1(4, 750, 97); - return jjMoveStringLiteralDfa5_1(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x40020000L); + else if ((active11 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_1(4, 751, 97); + return jjMoveStringLiteralDfa5_1(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x80040000L); case 77: case 109: return jjMoveStringLiteralDfa5_1(active0, 0x80000000L, active1, 0x3000000L, active2, 0x1c0000000800000L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0x3f800000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0x408000000L, active11, 0L); @@ -1626,10 +1635,10 @@ else if ((active1 & 0x2L) != 0L) return jjStartNfaWithStates_1(4, 65, 97); else if ((active10 & 0x40000000L) != 0L) return jjStartNfaWithStates_1(4, 670, 97); - return jjMoveStringLiteralDfa5_1(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x80080000L); + return jjMoveStringLiteralDfa5_1(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x100100000L); case 79: case 111: - return jjMoveStringLiteralDfa5_1(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x120L); + return jjMoveStringLiteralDfa5_1(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x240L); case 80: case 112: if ((active3 & 0x8000000000000L) != 0L) @@ -1637,7 +1646,7 @@ else if ((active10 & 0x40000000L) != 0L) jjmatchedKind = 243; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x20000000000000L, active11, 0x400L); + return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x40000000000000L, active11, 0x800L); case 82: case 114: if ((active0 & 0x800L) != 0L) @@ -1667,9 +1676,9 @@ else if ((active6 & 0x1000000000000000L) != 0L) return jjStartNfaWithStates_1(4, 444, 97); else if ((active10 & 0x20000000L) != 0L) return jjStartNfaWithStates_1(4, 669, 97); - else if ((active10 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_1(4, 677, 97); - return jjMoveStringLiteralDfa5_1(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x4000000000L, active11, 0L); + else if ((active10 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_1(4, 678, 97); + return jjMoveStringLiteralDfa5_1(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x8000000000L, active11, 0L); case 83: case 115: if ((active1 & 0x10000000000000L) != 0L) @@ -1686,11 +1695,11 @@ else if ((active7 & 0x40L) != 0L) return jjStartNfaWithStates_1(4, 454, 97); else if ((active8 & 0x100000L) != 0L) return jjStartNfaWithStates_1(4, 532, 97); - else if ((active11 & 0x1L) != 0L) - return jjStartNfaWithStates_1(4, 704, 97); - else if ((active11 & 0x4000L) != 0L) - return jjStartNfaWithStates_1(4, 718, 97); - return jjMoveStringLiteralDfa5_1(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x40000800000ff8L, active11, 0L); + else if ((active11 & 0x2L) != 0L) + return jjStartNfaWithStates_1(4, 705, 97); + else if ((active11 & 0x8000L) != 0L) + return jjStartNfaWithStates_1(4, 719, 97); + return jjMoveStringLiteralDfa5_1(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x80000800000ff8L, active11, 0L); case 84: case 116: if ((active1 & 0x1000000000000L) != 0L) @@ -1723,10 +1732,10 @@ else if ((active9 & 0x800000L) != 0L) return jjStartNfaWithStates_1(4, 599, 97); else if ((active10 & 0x1000L) != 0L) return jjStartNfaWithStates_1(4, 652, 97); - return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x1000000000L, active11, 0L); + return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x2000000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x8000040000L); + return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x10000080000L); case 86: case 118: return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0x2000000000L, active3, 0L, active4, 0L, active5, 0x8000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x300000L, active10, 0x200000000L, active11, 0L); @@ -1734,11 +1743,11 @@ else if ((active10 & 0x1000L) != 0L) case 119: if ((active0 & 0x4000L) != 0L) return jjStartNfaWithStates_1(4, 14, 97); - return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000L); + return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x800000000L); case 88: case 120: - if ((active11 & 0x20000000L) != 0L) - return jjStartNfaWithStates_1(4, 733, 97); + if ((active11 & 0x40000000L) != 0L) + return jjStartNfaWithStates_1(4, 734, 97); return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: @@ -1753,9 +1762,9 @@ else if ((active2 & 0x1000000000000000L) != 0L) return jjStartNfaWithStates_1(4, 188, 97); else if ((active3 & 0x40L) != 0L) return jjStartNfaWithStates_1(4, 198, 97); - else if ((active11 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_1(4, 745, 97); - return jjMoveStringLiteralDfa5_1(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100010000000L); + else if ((active11 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_1(4, 746, 97); + return jjMoveStringLiteralDfa5_1(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200020000000L); case 90: case 122: return jjMoveStringLiteralDfa5_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x6000000000000000L, active10, 0L, active11, 0L); @@ -1776,7 +1785,7 @@ private final int jjMoveStringLiteralDfa5_1(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa6_1(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x10000000000000L, active11, 0x2e00010L); + return jjMoveStringLiteralDfa6_1(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x20000000000000L, active11, 0x5c00020L); case 65: case 97: if ((active7 & 0x800000000000000L) != 0L) @@ -1784,7 +1793,7 @@ private final int jjMoveStringLiteralDfa5_1(long old0, long active0, long old1, jjmatchedKind = 507; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_1(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x140000000740078L, active11, 0x20000L); + return jjMoveStringLiteralDfa6_1(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x280000000740078L, active11, 0x40000L); case 66: case 98: return jjMoveStringLiteralDfa6_1(active0, 0xc00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x40000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -1799,7 +1808,7 @@ else if ((active6 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_1(5, 447, 97); else if ((active9 & 0x4000000L) != 0L) return jjStartNfaWithStates_1(5, 602, 97); - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x4000100000L); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x8000200000L); case 68: case 100: if ((active0 & 0x40000000000000L) != 0L) @@ -1815,7 +1824,7 @@ else if ((active8 & 0x8L) != 0L) jjmatchedKind = 515; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_1(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x1e0010000000L, active11, 0L); + return jjMoveStringLiteralDfa6_1(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x3c0010000000L, active11, 0L); case 69: case 101: if ((active0 & 0x4000000000L) != 0L) @@ -1856,9 +1865,9 @@ else if ((active10 & 0x800000L) != 0L) return jjStartNfaWithStates_1(5, 663, 97); else if ((active10 & 0x80000000L) != 0L) return jjStartNfaWithStates_1(5, 671, 97); - else if ((active10 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_1(5, 676, 97); - return jjMoveStringLiteralDfa6_1(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x80000400L); + else if ((active10 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_1(5, 677, 97); + return jjMoveStringLiteralDfa6_1(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x100000800L); case 70: case 102: if ((active5 & 0x80000000000000L) != 0L) @@ -1868,20 +1877,20 @@ else if ((active10 & 0x1000000000L) != 0L) case 103: if ((active3 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_1(5, 247, 97); - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x200000000L); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x400000000L); case 72: case 104: if ((active4 & 0x40000000000000L) != 0L) return jjStartNfaWithStates_1(5, 310, 97); else if ((active8 & 0x4L) != 0L) return jjStartNfaWithStates_1(5, 514, 97); - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 73: case 105: - return jjMoveStringLiteralDfa6_1(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x80000L); + return jjMoveStringLiteralDfa6_1(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x100000L); case 75: case 107: - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x4000000L); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x8000000L); case 76: case 108: if ((active3 & 0x400000000000L) != 0L) @@ -1890,7 +1899,7 @@ else if ((active6 & 0x100000000L) != 0L) return jjStartNfaWithStates_1(5, 416, 97); else if ((active8 & 0x2L) != 0L) return jjStartNfaWithStates_1(5, 513, 97); - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x40000000L); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x80000000L); case 77: case 109: if ((active9 & 0x20000000L) != 0L) @@ -1924,17 +1933,17 @@ else if ((active7 & 0x40000000L) != 0L) jjmatchedKind = 478; jjmatchedPos = 5; } - else if ((active11 & 0x80L) != 0L) - return jjStartNfaWithStates_1(5, 711, 97); - return jjMoveStringLiteralDfa6_1(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0x680000004000000L, active11, 0x2100000000L); + else if ((active11 & 0x100L) != 0L) + return jjStartNfaWithStates_1(5, 712, 97); + return jjMoveStringLiteralDfa6_1(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0xd00001004000000L, active11, 0x4200000000L); case 79: case 111: - return jjMoveStringLiteralDfa6_1(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x1820000200000000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa6_1(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x3040000200000000L, active11, 0x800000000L); case 80: case 112: if ((active7 & 0x40000000000L) != 0L) return jjStartNfaWithStates_1(5, 490, 97); - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x10040000L); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x20080000L); case 81: case 113: return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -1958,7 +1967,7 @@ else if ((active8 & 0x4000L) != 0L) jjmatchedKind = 526; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_1(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa6_1(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x2000000L); case 83: case 115: if ((active0 & 0x10000L) != 0L) @@ -1975,9 +1984,9 @@ else if ((active5 & 0x4000000000000000L) != 0L) return jjStartNfaWithStates_1(5, 382, 97); else if ((active6 & 0x4000L) != 0L) return jjStartNfaWithStates_1(5, 398, 97); - else if ((active10 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_1(5, 691, 97); - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x4000000000000000L, active11, 0xc0000000000L); + else if ((active10 & 0x10000000000000L) != 0L) + return jjStartNfaWithStates_1(5, 692, 97); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x8000000000000000L, active11, 0x180000000000L); case 84: case 116: if ((active0 & 0x20L) != 0L) @@ -2014,21 +2023,21 @@ else if ((active9 & 0x800000000L) != 0L) return jjStartNfaWithStates_1(5, 611, 97); else if ((active10 & 0x800000000L) != 0L) return jjStartNfaWithStates_1(5, 675, 97); - else if ((active10 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_1(5, 678, 97); - return jjMoveStringLiteralDfa6_1(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x8000000000L); + else if ((active10 & 0x8000000000L) != 0L) + return jjStartNfaWithStates_1(5, 679, 97); + return jjMoveStringLiteralDfa6_1(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x10000000000L); case 85: case 117: - return jjMoveStringLiteralDfa6_1(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x100L); + return jjMoveStringLiteralDfa6_1(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x200L); case 86: case 118: - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x8000004L); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x10000008L); case 87: case 119: if ((active4 & 0x4000000L) != 0L) return jjStartNfaWithStates_1(5, 282, 97); - else if ((active11 & 0x20L) != 0L) - return jjStartNfaWithStates_1(5, 709, 97); + else if ((active11 & 0x40L) != 0L) + return jjStartNfaWithStates_1(5, 710, 97); return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0x20000L, active3, 0x8000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000L, active11, 0L); case 88: case 120: @@ -2046,7 +2055,7 @@ else if ((active9 & 0x20000000000L) != 0L) return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0x40000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000000L); + return jjMoveStringLiteralDfa6_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); default : break; } @@ -2068,13 +2077,13 @@ private final int jjMoveStringLiteralDfa6_1(long old0, long active0, long old1, return jjStartNfaWithStates_1(6, 464, 97); break; case 95: - return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x100000000L); case 65: case 97: - return jjMoveStringLiteralDfa7_1(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x80000000000e00L, active11, 0x200008000000L); + return jjMoveStringLiteralDfa7_1(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x100000000000e00L, active11, 0x400010000000L); case 66: case 98: - return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x20L); case 67: case 99: if ((active2 & 0x40000000000000L) != 0L) @@ -2097,7 +2106,7 @@ else if ((active5 & 0x20L) != 0L) return jjStartNfaWithStates_1(6, 325, 97); else if ((active10 & 0x400000000L) != 0L) return jjStartNfaWithStates_1(6, 674, 97); - return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x4000000004000000L, active11, 0L); + return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x8000000004000000L, active11, 0L); case 69: case 101: if ((active0 & 0x100000000000000L) != 0L) @@ -2135,13 +2144,13 @@ else if ((active7 & 0x80000000000L) != 0L) } else if ((active10 & 0x2000000L) != 0L) return jjStartNfaWithStates_1(6, 665, 97); - else if ((active11 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_1(6, 742, 97); else if ((active11 & 0x8000000000L) != 0L) return jjStartNfaWithStates_1(6, 743, 97); - else if ((active11 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_1(6, 748, 97); - return jjMoveStringLiteralDfa7_1(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x1e0000000000L, active11, 0x45000004L); + else if ((active11 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_1(6, 744, 97); + else if ((active11 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_1(6, 749, 97); + return jjMoveStringLiteralDfa7_1(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x3c1000000000L, active11, 0x8a000008L); case 70: case 102: return jjMoveStringLiteralDfa7_1(active0, 0x10000000000L, active1, 0x1000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -2164,21 +2173,21 @@ else if ((active6 & 0x400000000000L) != 0L) return jjStartNfaWithStates_1(6, 430, 97); else if ((active7 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_1(6, 499, 97); - else if ((active10 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_1(6, 698, 97); - else if ((active11 & 0x100000000L) != 0L) - return jjStartNfaWithStates_1(6, 736, 97); - return jjMoveStringLiteralDfa7_1(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x400000L); + else if ((active10 & 0x800000000000000L) != 0L) + return jjStartNfaWithStates_1(6, 699, 97); + else if ((active11 & 0x200000000L) != 0L) + return jjStartNfaWithStates_1(6, 737, 97); + return jjMoveStringLiteralDfa7_1(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x800000L); case 72: case 104: if ((active0 & 0x4000000000000L) != 0L) return jjStartNfaWithStates_1(6, 50, 97); - else if ((active11 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_1(6, 747, 97); + else if ((active11 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_1(6, 748, 97); return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa7_1(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x200100000L); + return jjMoveStringLiteralDfa7_1(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x400200000L); case 76: case 108: if ((active2 & 0x800000L) != 0L) @@ -2204,7 +2213,7 @@ else if ((active6 & 0x40000000L) != 0L) return jjMoveStringLiteralDfa7_1(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400L, active5, 0x2048000000000000L, active6, 0x2000L, active7, 0x20000L, active8, 0L, active9, 0x4L, active10, 0L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa7_1(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x40000000000000L, active11, 0L); + return jjMoveStringLiteralDfa7_1(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x80000000000000L, active11, 0L); case 78: case 110: if ((active0 & 0x80000000000L) != 0L) @@ -2230,19 +2239,19 @@ else if ((active8 & 0x10000L) != 0L) } else if ((active10 & 0x100000000L) != 0L) return jjStartNfaWithStates_1(6, 672, 97); - else if ((active10 & 0x800000000000000L) != 0L) + else if ((active10 & 0x1000000000000000L) != 0L) { - jjmatchedKind = 699; + jjmatchedKind = 700; jjmatchedPos = 6; } - return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x1000000000000004L, active11, 0x800000L); + return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x2000000000000004L, active11, 0x1000000L); case 79: case 111: - return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x10000000000180L, active11, 0L); + return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x20000000000180L, active11, 0L); case 80: case 112: - if ((active10 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_1(6, 693, 97); + if ((active10 & 0x40000000000000L) != 0L) + return jjStartNfaWithStates_1(6, 694, 97); return jjMoveStringLiteralDfa7_1(active0, 0x20000000000L, active1, 0x2800000000000L, active2, 0x30000000000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0x80000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 82: case 114: @@ -2268,11 +2277,11 @@ else if ((active10 & 0x2000L) != 0L) jjmatchedKind = 653; jjmatchedPos = 6; } - else if ((active10 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_1(6, 696, 97); - else if ((active11 & 0x400L) != 0L) - return jjStartNfaWithStates_1(6, 714, 97); - return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x400000000L); + else if ((active10 & 0x200000000000000L) != 0L) + return jjStartNfaWithStates_1(6, 697, 97); + else if ((active11 & 0x800L) != 0L) + return jjStartNfaWithStates_1(6, 715, 97); + return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x800000000L); case 83: case 115: if ((active5 & 0x40L) != 0L) @@ -2285,9 +2294,9 @@ else if ((active7 & 0x1000000000L) != 0L) return jjStartNfaWithStates_1(6, 484, 97); else if ((active8 & 0x10L) != 0L) return jjStartNfaWithStates_1(6, 516, 97); - else if ((active11 & 0x40000L) != 0L) - return jjStartNfaWithStates_1(6, 722, 97); - return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x200000L); + else if ((active11 & 0x80000L) != 0L) + return jjStartNfaWithStates_1(6, 723, 97); + return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x400000L); case 84: case 116: if ((active1 & 0x800000L) != 0L) @@ -2328,14 +2337,14 @@ else if ((active9 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_1(6, 639, 97); else if ((active10 & 0x200000000L) != 0L) return jjStartNfaWithStates_1(6, 673, 97); - else if ((active10 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_1(6, 697, 97); - else if ((active11 & 0x100L) != 0L) - return jjStartNfaWithStates_1(6, 712, 97); - return jjMoveStringLiteralDfa7_1(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x400120a0000L); + else if ((active10 & 0x400000000000000L) != 0L) + return jjStartNfaWithStates_1(6, 698, 97); + else if ((active11 & 0x200L) != 0L) + return jjStartNfaWithStates_1(6, 713, 97); + return jjMoveStringLiteralDfa7_1(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x80024140000L); case 85: case 117: - return jjMoveStringLiteralDfa7_1(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa7_1(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x4000000000L); case 86: case 118: return jjMoveStringLiteralDfa7_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0x200000000000000L, active7, 0x203000L, active8, 0L, active9, 0L, active10, 0x2L, active11, 0L); @@ -2377,7 +2386,7 @@ private final int jjMoveStringLiteralDfa7_1(long old0, long active0, long old1, return jjMoveStringLiteralDfa8_1(active0, 0x2000000000000000L, active1, 0xff0000000c000000L, active2, 0x180000000000007L, active3, 0L, active4, 0L, active5, 0x70000L, active6, 0x40000000000L, active7, 0x700000000000L, active8, 0x20000L, active9, 0xffc00L, active10, 0x1c000L, active11, 0L); case 65: case 97: - return jjMoveStringLiteralDfa8_1(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x4000000000000000L, active11, 0x800000L); + return jjMoveStringLiteralDfa8_1(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x8000000000000000L, active11, 0x1000000L); case 66: case 98: if ((active8 & 0x10000000000L) != 0L) @@ -2401,8 +2410,10 @@ else if ((active8 & 0x40000000L) != 0L) return jjStartNfaWithStates_1(7, 57, 97); else if ((active2 & 0x10000000L) != 0L) return jjStartNfaWithStates_1(7, 156, 97); - else if ((active11 & 0x400000000L) != 0L) - return jjStartNfaWithStates_1(7, 738, 97); + else if ((active10 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_1(7, 676, 97); + else if ((active11 & 0x800000000L) != 0L) + return jjStartNfaWithStates_1(7, 739, 97); return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40000780000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 69: case 101: @@ -2452,14 +2463,14 @@ else if ((active9 & 0x80L) != 0L) } else if ((active10 & 0x100000L) != 0L) return jjStartNfaWithStates_1(7, 660, 97); - else if ((active11 & 0x20000L) != 0L) - return jjStartNfaWithStates_1(7, 721, 97); - return jjMoveStringLiteralDfa8_1(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x10000000L); + else if ((active11 & 0x40000L) != 0L) + return jjStartNfaWithStates_1(7, 722, 97); + return jjMoveStringLiteralDfa8_1(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x20000000L); case 70: case 102: - if ((active10 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_1(7, 692, 97); - return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x1e0000000000L, active11, 0L); + if ((active10 & 0x20000000000000L) != 0L) + return jjStartNfaWithStates_1(7, 693, 97); + return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active2 & 0x2000000000000000L) != 0L) @@ -2470,7 +2481,7 @@ else if ((active6 & 0x800L) != 0L) return jjStartNfaWithStates_1(7, 395, 97); else if ((active10 & 0x4L) != 0L) return jjStartNfaWithStates_1(7, 642, 97); - return jjMoveStringLiteralDfa8_1(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa8_1(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x2000000L); case 72: case 104: if ((active2 & 0x400000000000L) != 0L) @@ -2478,7 +2489,7 @@ else if ((active10 & 0x4L) != 0L) return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa8_1(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x1000000000000000L, active11, 0x40000000000L); + return jjMoveStringLiteralDfa8_1(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x2000000000000000L, active11, 0x80000000000L); case 74: case 106: return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -2497,9 +2508,9 @@ else if ((active5 & 0x8000000000L) != 0L) return jjStartNfaWithStates_1(7, 359, 97); else if ((active9 & 0x20L) != 0L) return jjStartNfaWithStates_1(7, 581, 97); - else if ((active11 & 0x40000000L) != 0L) - return jjStartNfaWithStates_1(7, 734, 97); - return jjMoveStringLiteralDfa8_1(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x8000000L); + else if ((active11 & 0x80000000L) != 0L) + return jjStartNfaWithStates_1(7, 735, 97); + return jjMoveStringLiteralDfa8_1(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x10000000L); case 77: case 109: return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0L, active3, 0x1L, active4, 0xc000000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f01000000000000L, active10, 0L, active11, 0L); @@ -2512,22 +2523,22 @@ else if ((active6 & 0x4000000000000L) != 0L) jjmatchedKind = 434; jjmatchedPos = 7; } - return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x200200000000L); + return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x400400000000L); case 79: case 111: - return jjMoveStringLiteralDfa8_1(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa8_1(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x4000000000L); case 80: case 112: - if ((active10 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_1(7, 694, 97); + if ((active10 & 0x80000000000000L) != 0L) + return jjStartNfaWithStates_1(7, 695, 97); return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0x8000000L, active10, 0L, active11, 0L); case 82: case 114: if ((active8 & 0x40000000000L) != 0L) return jjStartNfaWithStates_1(7, 554, 97); - else if ((active11 & 0x4L) != 0L) - return jjStartNfaWithStates_1(7, 706, 97); - return jjMoveStringLiteralDfa8_1(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x80000000040180L, active11, 0x400000L); + else if ((active11 & 0x8L) != 0L) + return jjStartNfaWithStates_1(7, 707, 97); + return jjMoveStringLiteralDfa8_1(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x100000000040180L, active11, 0x800000L); case 83: case 115: if ((active1 & 0x40000000000L) != 0L) @@ -2549,7 +2560,7 @@ else if ((active7 & 0x4L) != 0L) return jjStartNfaWithStates_1(7, 450, 97); else if ((active9 & 0x8000000000L) != 0L) return jjStartNfaWithStates_1(7, 615, 97); - return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x100000000L); case 84: case 116: if ((active2 & 0x800000000000L) != 0L) @@ -2562,10 +2573,10 @@ else if ((active8 & 0x4000000L) != 0L) return jjStartNfaWithStates_1(7, 538, 97); else if ((active10 & 0x200000L) != 0L) return jjStartNfaWithStates_1(7, 661, 97); - return jjMoveStringLiteralDfa8_1(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x100000L); + return jjMoveStringLiteralDfa8_1(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x200000L); case 85: case 117: - return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x20L); case 86: case 118: return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100L, active8, 0x400L, active9, 0L, active10, 0L, active11, 0L); @@ -2595,9 +2606,9 @@ else if ((active8 & 0x40L) != 0L) return jjStartNfaWithStates_1(7, 518, 97); else if ((active9 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_1(7, 627, 97); - else if ((active11 & 0x4000000L) != 0L) - return jjStartNfaWithStates_1(7, 730, 97); - return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x2280000L); + else if ((active11 & 0x8000000L) != 0L) + return jjStartNfaWithStates_1(7, 731, 97); + return jjMoveStringLiteralDfa8_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x4500000L); case 90: case 122: return jjMoveStringLiteralDfa8_1(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x3000000000000L, active6, 0L, active7, 0L, active8, 0x2000L, active9, 0L, active10, 0L, active11, 0L); @@ -2618,7 +2629,7 @@ private final int jjMoveStringLiteralDfa8_1(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x80000L); + return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x100000L); case 65: case 97: return jjMoveStringLiteralDfa9_1(active0, 0x11000000000L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0x300020000L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0xa000L, active9, 0x10000000L, active10, 0x40000L, active11, 0L); @@ -2631,7 +2642,7 @@ private final int jjMoveStringLiteralDfa8_1(long old0, long active0, long old1, case 99: if ((active9 & 0x40000000000L) != 0L) return jjStartNfaWithStates_1(8, 618, 97); - return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x40000000010L); + return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x80000000020L); case 68: case 100: if ((active1 & 0x20000000L) != 0L) @@ -2640,8 +2651,8 @@ else if ((active3 & 0x80000000000L) != 0L) return jjStartNfaWithStates_1(8, 235, 97); else if ((active10 & 0x4000000L) != 0L) return jjStartNfaWithStates_1(8, 666, 97); - else if ((active11 & 0x10000000L) != 0L) - return jjStartNfaWithStates_1(8, 732, 97); + else if ((active11 & 0x20000000L) != 0L) + return jjStartNfaWithStates_1(8, 733, 97); return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x600000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x400L, active10, 0L, active11, 0L); case 69: case 101: @@ -2709,9 +2720,9 @@ else if ((active9 & 0x2000000000L) != 0L) jjmatchedKind = 613; jjmatchedPos = 8; } - else if ((active11 & 0x200000000L) != 0L) - return jjStartNfaWithStates_1(8, 737, 97); - return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x200000000000L); + else if ((active11 & 0x400000000L) != 0L) + return jjStartNfaWithStates_1(8, 738, 97); + return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x400000000000L); case 72: case 104: return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x201000L, active10, 0L, active11, 0L); @@ -2719,7 +2730,7 @@ else if ((active11 & 0x200000000L) != 0L) case 105: if ((active0 & 0x40000000000L) != 0L) return jjStartNfaWithStates_1(8, 42, 97); - return jjMoveStringLiteralDfa9_1(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x1e0010000878L, active11, 0x81000000L); + return jjMoveStringLiteralDfa9_1(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x3c0010000878L, active11, 0x102000000L); case 75: case 107: if ((active2 & 0x20000L) != 0L) @@ -2735,7 +2746,7 @@ else if ((active11 & 0x200000000L) != 0L) jjmatchedKind = 647; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x800000L); + return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x1000000L); case 78: case 110: if ((active0 & 0x20000000L) != 0L) @@ -2758,10 +2769,10 @@ else if ((active6 & 0x80000000L) != 0L) return jjStartNfaWithStates_1(8, 415, 97); else if ((active6 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_1(8, 439, 97); - return jjMoveStringLiteralDfa9_1(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x1000000000008000L, active11, 0x200000L); + return jjMoveStringLiteralDfa9_1(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x2000000000008000L, active11, 0x400000L); case 79: case 111: - return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x800000L); case 80: case 112: if ((active1 & 0x2000000000000L) != 0L) @@ -2771,7 +2782,7 @@ else if ((active9 & 0x100000000000000L) != 0L) jjmatchedKind = 632; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x2000000L); + return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x4000000L); case 81: case 113: return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0L); @@ -2823,7 +2834,7 @@ else if ((active9 & 0x2000000L) != 0L) return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0x8000020000000000L, active2, 0x100003L, active3, 0L, active4, 0x200004L, active5, 0x40000L, active6, 0x2000L, active7, 0x4000000000000000L, active8, 0x500000000L, active9, 0x1000000000L, active10, 0x8000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x2008000000L); + return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x4010000000L); case 86: case 118: return jjMoveStringLiteralDfa9_1(active0, 0x10000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0L); @@ -2847,12 +2858,12 @@ else if ((active7 & 0x2000L) != 0L) return jjStartNfaWithStates_1(8, 461, 97); else if ((active9 & 0x2000000000000L) != 0L) return jjStartNfaWithStates_1(8, 625, 97); - else if ((active10 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_1(8, 695, 97); - else if ((active10 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_1(8, 702, 97); - else if ((active11 & 0x100000L) != 0L) - return jjStartNfaWithStates_1(8, 724, 97); + else if ((active10 & 0x100000000000000L) != 0L) + return jjStartNfaWithStates_1(8, 696, 97); + else if ((active10 & 0x8000000000000000L) != 0L) + return jjStartNfaWithStates_1(8, 703, 97); + else if ((active11 & 0x200000L) != 0L) + return jjStartNfaWithStates_1(8, 725, 97); return jjMoveStringLiteralDfa9_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x80000L, active10, 0L, active11, 0L); default : break; @@ -2886,7 +2897,7 @@ else if ((active2 & 0x400L) != 0L) return jjStartNfaWithStates_1(9, 138, 97); else if ((active9 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_1(9, 631, 97); - return jjMoveStringLiteralDfa10_1(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjMoveStringLiteralDfa10_1(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 68: case 100: if ((active5 & 0x4000000000L) != 0L) @@ -2920,13 +2931,13 @@ else if ((active9 & 0x1000000000L) != 0L) return jjStartNfaWithStates_1(9, 612, 97); else if ((active9 & 0x800000000000L) != 0L) return jjStartNfaWithStates_1(9, 623, 97); - else if ((active11 & 0x800000L) != 0L) - return jjStartNfaWithStates_1(9, 727, 97); - else if ((active11 & 0x2000000L) != 0L) - return jjStartNfaWithStates_1(9, 729, 97); - else if ((active11 & 0x8000000L) != 0L) - return jjStartNfaWithStates_1(9, 731, 97); - return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x200000000000L); + else if ((active11 & 0x1000000L) != 0L) + return jjStartNfaWithStates_1(9, 728, 97); + else if ((active11 & 0x4000000L) != 0L) + return jjStartNfaWithStates_1(9, 730, 97); + else if ((active11 & 0x10000000L) != 0L) + return jjStartNfaWithStates_1(9, 732, 97); + return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x400000000000L); case 71: case 103: if ((active6 & 0x200000L) != 0L) @@ -2935,8 +2946,8 @@ else if ((active8 & 0x1000000000L) != 0L) return jjStartNfaWithStates_1(9, 548, 97); else if ((active9 & 0x40000000L) != 0L) return jjStartNfaWithStates_1(9, 606, 97); - else if ((active10 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_1(9, 700, 97); + else if ((active10 & 0x2000000000000000L) != 0L) + return jjStartNfaWithStates_1(9, 701, 97); return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x2000000000000000L, active6, 0x400000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: @@ -2948,7 +2959,7 @@ else if ((active10 & 0x1000000000000000L) != 0L) case 107: if ((active2 & 0x400000000L) != 0L) return jjStartNfaWithStates_1(9, 162, 97); - return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80010L); + return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100020L); case 76: case 108: return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2L, active5, 0L, active6, 0L, active7, 0x100000000L, active8, 0L, active9, 0x1000000000000L, active10, 0L, active11, 0L); @@ -2964,10 +2975,10 @@ else if ((active10 & 0x1000000000000000L) != 0L) jjmatchedKind = 98; jjmatchedPos = 9; } - return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x3c0000000000L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x1000000L); + return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x2000000L); case 80: case 112: if ((active1 & 0x4000000000000L) != 0L) @@ -2998,10 +3009,10 @@ else if ((active7 & 0x400L) != 0L) return jjStartNfaWithStates_1(9, 458, 97); else if ((active10 & 0x100L) != 0L) return jjStartNfaWithStates_1(9, 648, 97); - else if ((active11 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_1(9, 741, 97); - else if ((active11 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_1(9, 746, 97); + else if ((active11 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_1(9, 742, 97); + else if ((active11 & 0x80000000000L) != 0L) + return jjStartNfaWithStates_1(9, 747, 97); return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0x80000000000L, active2, 0x40000000004L, active3, 0L, active4, 0x8000000000000000L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: @@ -3021,7 +3032,7 @@ else if ((active8 & 0x2000000000L) != 0L) return jjMoveStringLiteralDfa10_1(active0, 0x80021000000000L, active1, 0x1e000000008L, active2, 0x8000L, active3, 0x2L, active4, 0x400000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100L, active10, 0L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x800000L); case 86: case 118: return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -3048,7 +3059,7 @@ else if ((active10 & 0x40000L) != 0L) return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x200000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa10_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L); default : break; } @@ -3085,7 +3096,7 @@ else if ((active5 & 0x200000L) != 0L) return jjStartNfaWithStates_1(10, 341, 97); else if ((active10 & 0x8000000L) != 0L) return jjStartNfaWithStates_1(10, 667, 97); - return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x400000000000L); case 69: case 101: if ((active0 & 0x10000000000L) != 0L) @@ -3106,9 +3117,9 @@ else if ((active9 & 0x100000000000L) != 0L) return jjStartNfaWithStates_1(10, 620, 97); else if ((active9 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_1(10, 624, 97); - else if ((active11 & 0x80000000L) != 0L) - return jjStartNfaWithStates_1(10, 735, 97); - return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x1e0000000000L, active11, 0x80010L); + else if ((active11 & 0x100000000L) != 0L) + return jjStartNfaWithStates_1(10, 736, 97); + return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x3c0000000000L, active11, 0x100020L); case 70: case 102: return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -3123,7 +3134,7 @@ else if ((active11 & 0x80000000L) != 0L) return jjStartNfaWithStates_1(10, 67, 97); else if ((active6 & 0x400000000L) != 0L) return jjStartNfaWithStates_1(10, 418, 97); - return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 73: case 105: return jjMoveStringLiteralDfa11_1(active0, 0x21000000000L, active1, 0x800000002000L, active2, 0x1000L, active3, 0x2L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0L, active8, 0L, active9, 0x4400000000000000L, active10, 0L, active11, 0L); @@ -3150,8 +3161,8 @@ else if ((active10 & 0x8L) != 0L) } else if ((active10 & 0x800L) != 0L) return jjStartNfaWithStates_1(10, 651, 97); - else if ((active11 & 0x1000000L) != 0L) - return jjStartNfaWithStates_1(10, 728, 97); + else if ((active11 & 0x2000000L) != 0L) + return jjStartNfaWithStates_1(10, 729, 97); return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0x10c200000L, active2, 0x180000000006000L, active3, 0L, active4, 0L, active5, 0x10000L, active6, 0x40002000000L, active7, 0L, active8, 0L, active9, 0xc040L, active10, 0x10000070L, active11, 0L); case 79: case 111: @@ -3160,8 +3171,8 @@ else if ((active11 & 0x1000000L) != 0L) case 112: if ((active9 & 0x10000000L) != 0L) return jjStartNfaWithStates_1(10, 604, 97); - else if ((active11 & 0x400000L) != 0L) - return jjStartNfaWithStates_1(10, 726, 97); + else if ((active11 & 0x800000L) != 0L) + return jjStartNfaWithStates_1(10, 727, 97); return jjMoveStringLiteralDfa11_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 81: case 113: @@ -3237,7 +3248,7 @@ private final int jjMoveStringLiteralDfa11_1(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa12_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa12_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 65: case 97: if ((active8 & 0x1L) != 0L) @@ -3253,7 +3264,7 @@ private final int jjMoveStringLiteralDfa11_1(long old0, long active0, long old1, case 100: if ((active9 & 0x200000000000000L) != 0L) return jjStartNfaWithStates_1(11, 633, 97); - return jjMoveStringLiteralDfa12_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa12_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 69: case 101: if ((active0 & 0x2000000000000000L) != 0L) @@ -3338,7 +3349,7 @@ else if ((active9 & 0x1000L) != 0L) return jjStartNfaWithStates_1(11, 588, 97); else if ((active9 & 0x80000L) != 0L) return jjStartNfaWithStates_1(11, 595, 97); - return jjMoveStringLiteralDfa12_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa12_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x400000L); case 83: case 115: return jjMoveStringLiteralDfa12_1(active0, 0L, active1, 0x8000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x70L, active11, 0L); @@ -3350,16 +3361,16 @@ else if ((active5 & 0x40000L) != 0L) return jjStartNfaWithStates_1(11, 338, 97); else if ((active9 & 0x40L) != 0L) return jjStartNfaWithStates_1(11, 582, 97); - else if ((active11 & 0x10L) != 0L) - return jjStartNfaWithStates_1(11, 708, 97); + else if ((active11 & 0x20L) != 0L) + return jjStartNfaWithStates_1(11, 709, 97); return jjMoveStringLiteralDfa12_1(active0, 0x20000800000L, active1, 0x200L, active2, 0x6000L, active3, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x8000L, active10, 0L, active11, 0L); case 85: case 117: return jjMoveStringLiteralDfa12_1(active0, 0L, active1, 0x100000000L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2000000000004000L, active10, 0L, active11, 0L); case 89: case 121: - if ((active11 & 0x80000L) != 0L) - return jjStartNfaWithStates_1(11, 723, 97); + if ((active11 & 0x100000L) != 0L) + return jjStartNfaWithStates_1(11, 724, 97); break; default : break; @@ -3378,7 +3389,7 @@ private final int jjMoveStringLiteralDfa12_1(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa13_1(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x1e0000000070L, active11, 0L); + return jjMoveStringLiteralDfa13_1(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x3c0000000070L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa13_1(active0, 0L, active1, 0x6800000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -3434,12 +3445,12 @@ else if ((active3 & 0x2L) != 0L) return jjMoveStringLiteralDfa13_1(active0, 0L, active1, 0x20L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x20000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa13_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa13_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x400000L); case 80: case 112: if ((active9 & 0x100L) != 0L) return jjStartNfaWithStates_1(12, 584, 97); - return jjMoveStringLiteralDfa13_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa13_1(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 82: case 114: if ((active9 & 0x2000000000000000L) != 0L) @@ -3485,7 +3496,7 @@ else if ((active7 & 0x400000000000L) != 0L) return jjStartNfaWithStates_1(13, 494, 97); else if ((active10 & 0x10000L) != 0L) return jjStartNfaWithStates_1(13, 656, 97); - return jjMoveStringLiteralDfa14_1(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa14_1(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 66: case 98: return jjMoveStringLiteralDfa14_1(active0, 0L, active1, 0x100000000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -3538,7 +3549,7 @@ else if ((active9 & 0x4000L) != 0L) case 110: if ((active4 & 0x4L) != 0L) return jjStartNfaWithStates_1(13, 258, 97); - return jjMoveStringLiteralDfa14_1(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x200000L); + return jjMoveStringLiteralDfa14_1(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x400000L); case 79: case 111: return jjMoveStringLiteralDfa14_1(active0, 0x20000000000L, active1, 0x100000000000000L, active2, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0L, active10, 0x4000L, active11, 0L); @@ -3559,7 +3570,7 @@ else if ((active9 & 0x4000L) != 0L) case 116: if ((active7 & 0x8000L) != 0L) return jjStartNfaWithStates_1(13, 463, 97); - return jjMoveStringLiteralDfa14_1(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa14_1(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x3c0000000000L, active11, 0L); case 88: case 120: if ((active6 & 0x8000000000000L) != 0L) @@ -3626,7 +3637,7 @@ else if ((active10 & 0x4000L) != 0L) break; case 73: case 105: - return jjMoveStringLiteralDfa15_1(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa15_1(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x400000L); case 76: case 108: return jjMoveStringLiteralDfa15_1(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -3653,7 +3664,7 @@ else if ((active8 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_1(14, 575, 97); else if ((active9 & 0x10000L) != 0L) return jjStartNfaWithStates_1(14, 592, 97); - return jjMoveStringLiteralDfa15_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa15_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 83: case 115: if ((active1 & 0x200L) != 0L) @@ -3678,7 +3689,7 @@ else if ((active10 & 0x400L) != 0L) break; case 89: case 121: - return jjMoveStringLiteralDfa15_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa15_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); default : break; } @@ -3745,7 +3756,7 @@ else if ((active2 & 0x80000000000000L) != 0L) return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 82: case 114: if ((active1 & 0x100000000L) != 0L) @@ -3755,7 +3766,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xe0000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -3769,7 +3780,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa16_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); default : break; } @@ -3792,12 +3803,12 @@ private final int jjMoveStringLiteralDfa16_1(long old0, long active0, long old1, case 97: if ((active1 & 0x8000000000L) != 0L) return jjStartNfaWithStates_1(16, 103, 97); - return jjMoveStringLiteralDfa17_1(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa17_1(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: if ((active7 & 0x400000000L) != 0L) return jjStartNfaWithStates_1(16, 482, 97); - return jjMoveStringLiteralDfa17_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa17_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active1 & 0x100000L) != 0L) @@ -3808,7 +3819,7 @@ private final int jjMoveStringLiteralDfa16_1(long old0, long active0, long old1, return jjMoveStringLiteralDfa17_1(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa17_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa17_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 76: case 108: return jjMoveStringLiteralDfa17_1(active0, 0L, active1, 0L, active2, 0x6000L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0L, active10, 0x40L, active11, 0L); @@ -3872,7 +3883,7 @@ private final int jjMoveStringLiteralDfa17_1(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa18_1(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa18_1(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa18_1(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -3908,7 +3919,7 @@ private final int jjMoveStringLiteralDfa17_1(long old0, long active0, long old1, return jjMoveStringLiteralDfa18_1(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa18_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa18_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 86: case 118: return jjMoveStringLiteralDfa18_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0L); @@ -3935,7 +3946,7 @@ private final int jjMoveStringLiteralDfa18_1(long old0, long active0, long old1, return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x60000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0xc0000000000L, active11, 0L); case 68: case 100: if ((active8 & 0x800000000000000L) != 0L) @@ -3960,7 +3971,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa19_1(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa19_1(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 76: case 108: return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -3969,7 +3980,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); case 79: case 111: return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -3978,7 +3989,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0x4000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000L, active11, 0L); case 84: case 116: return jjMoveStringLiteralDfa19_1(active0, 0L, active1, 0L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0x80000000L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x20L, active11, 0L); @@ -4004,10 +4015,10 @@ private final int jjMoveStringLiteralDfa19_1(long old0, long active0, long old1, case 97: if ((active1 & 0x100L) != 0L) return jjStartNfaWithStates_1(19, 72, 97); - return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0xa0000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0x140000000000L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x200000000000L, active11, 0L); case 68: case 100: return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -4021,7 +4032,7 @@ private final int jjMoveStringLiteralDfa19_1(long old0, long active0, long old1, return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0x10000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x40000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x80000000000L, active11, 0x400000400000L); case 82: case 114: return jjMoveStringLiteralDfa20_1(active0, 0L, active1, 0L, active2, 0x4002L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -4065,7 +4076,7 @@ private final int jjMoveStringLiteralDfa20_1(long old0, long active0, long old1, return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0x20000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 68: case 100: - return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x80000000000L, active11, 0L); case 69: case 101: if ((active1 & 0x8000000L) != 0L) @@ -4082,13 +4093,13 @@ else if ((active2 & 0x100000000000000L) != 0L) case 104: if ((active7 & 0x200000000L) != 0L) return jjStartNfaWithStates_1(20, 481, 97); - return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x200000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x100000000000L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 79: case 111: return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0x2L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -4097,7 +4108,7 @@ else if ((active2 & 0x100000000000000L) != 0L) return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0x400000000000000L, active2, 0L, active6, 0x4000000L, active7, 0L, active8, 0x10000000000000L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_1(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x40000000000L, active11, 0L); case 89: case 121: if ((active0 & 0x1000000L) != 0L) @@ -4120,10 +4131,10 @@ private final int jjMoveStringLiteralDfa21_1(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa22_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa22_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 65: case 97: - return jjMoveStringLiteralDfa22_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000040L, active11, 0L); + return jjMoveStringLiteralDfa22_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000040L, active11, 0L); case 67: case 99: return jjMoveStringLiteralDfa22_1(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -4136,11 +4147,11 @@ private final int jjMoveStringLiteralDfa21_1(long old0, long active0, long old1, case 101: if ((active2 & 0x2000L) != 0L) return jjStartNfaWithStates_1(21, 141, 97); - else if ((active10 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_1(21, 682, 97); else if ((active10 & 0x80000000000L) != 0L) return jjStartNfaWithStates_1(21, 683, 97); - return jjMoveStringLiteralDfa22_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x100000000000L, active11, 0L); + else if ((active10 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_1(21, 684, 97); + return jjMoveStringLiteralDfa22_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x200000000000L, active11, 0L); case 70: case 102: return jjMoveStringLiteralDfa22_1(active1, 0x400000000000000L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -4199,10 +4210,10 @@ private final int jjMoveStringLiteralDfa22_1(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 76: case 108: - return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x100000000000L, active11, 0x200000L); + return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x200000000000L, active11, 0x400000L); case 78: case 110: return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x8000000000000L, active10, 0L, active11, 0L); @@ -4214,7 +4225,7 @@ private final int jjMoveStringLiteralDfa22_1(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 82: case 114: - return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa23_1(active1, 0L, active2, 0L, active6, 0x4000000L, active8, 0L, active10, 0L, active11, 0L); @@ -4241,8 +4252,8 @@ private final int jjMoveStringLiteralDfa23_1(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_1(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 65: case 97: - if ((active10 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_1(23, 684, 97); + if ((active10 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_1(23, 685, 97); break; case 67: case 99: @@ -4266,7 +4277,7 @@ private final int jjMoveStringLiteralDfa23_1(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x2040000000000000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa24_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x20000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa24_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x40000000000L, active11, 0x400000400000L); case 82: case 114: if ((active8 & 0x4000000000000L) != 0L) @@ -4301,7 +4312,7 @@ private final int jjMoveStringLiteralDfa24_1(long old1, long active1, long old2, break; case 68: case 100: - return jjMoveStringLiteralDfa25_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa25_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: return jjMoveStringLiteralDfa25_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x200000000000000L, active10, 0L, active11, 0L); @@ -4310,8 +4321,8 @@ private final int jjMoveStringLiteralDfa24_1(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_1(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_1(24, 681, 97); + if ((active10 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_1(24, 682, 97); break; case 73: case 105: @@ -4333,7 +4344,7 @@ private final int jjMoveStringLiteralDfa24_1(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 87: case 119: - return jjMoveStringLiteralDfa25_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa25_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); default : break; } @@ -4364,8 +4375,8 @@ private final int jjMoveStringLiteralDfa25_1(long old1, long active1, long old2, case 101: if ((active8 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_1(25, 563, 97); - else if ((active11 & 0x200000L) != 0L) - return jjStartNfaWithStates_1(25, 725, 97); + else if ((active11 & 0x400000L) != 0L) + return jjStartNfaWithStates_1(25, 726, 97); break; case 71: case 103: @@ -4387,7 +4398,7 @@ else if ((active11 & 0x200000L) != 0L) return jjMoveStringLiteralDfa26_1(active1, 0L, active2, 0x4002L, active6, 0L, active8, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa26_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa26_1(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa26_1(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active11, 0L); @@ -4408,7 +4419,7 @@ private final int jjMoveStringLiteralDfa26_1(long old1, long active1, long old2, switch(curChar) { case 95: - return jjMoveStringLiteralDfa27_1(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa27_1(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 68: case 100: if ((active8 & 0x80000000000000L) != 0L) @@ -4456,7 +4467,7 @@ private final int jjMoveStringLiteralDfa27_1(long old1, long active1, long old2, return jjMoveStringLiteralDfa28_1(active1, 0L, active2, 0L, active8, 0x200000000000000L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa28_1(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa28_1(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 82: case 114: return jjMoveStringLiteralDfa28_1(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -4483,7 +4494,7 @@ private final int jjMoveStringLiteralDfa28_1(long old1, long active1, long old2, break; case 69: case 101: - return jjMoveStringLiteralDfa29_1(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa29_1(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 79: case 111: return jjMoveStringLiteralDfa29_1(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -4508,7 +4519,7 @@ private final int jjMoveStringLiteralDfa29_1(long old1, long active1, long old2, { case 82: case 114: - return jjMoveStringLiteralDfa30_1(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa30_1(active1, 0L, active2, 0L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa30_1(active1, 0x400000000000000L, active2, 0L, active11, 0L); @@ -4533,7 +4544,7 @@ private final int jjMoveStringLiteralDfa30_1(long old1, long active1, long old2, { case 67: case 99: - return jjMoveStringLiteralDfa31_1(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa31_1(active1, 0L, active2, 0L, active11, 0x400000000000L); case 80: case 112: if ((active1 & 0x400000000000000L) != 0L) @@ -4559,7 +4570,7 @@ private final int jjMoveStringLiteralDfa31_1(long old1, long active1, long old2, case 101: if ((active2 & 0x2L) != 0L) return jjStartNfaWithStates_1(31, 129, 97); - return jjMoveStringLiteralDfa32_1(active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa32_1(active2, 0L, active11, 0x400000000000L); default : break; } @@ -4578,7 +4589,7 @@ private final int jjMoveStringLiteralDfa32_1(long old2, long active2, long old11 { case 78: case 110: - return jjMoveStringLiteralDfa33_1(active11, 0x200000000000L); + return jjMoveStringLiteralDfa33_1(active11, 0x400000000000L); default : break; } @@ -4597,8 +4608,8 @@ private final int jjMoveStringLiteralDfa33_1(long old11, long active11) { case 84: case 116: - if ((active11 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_1(33, 749, 97); + if ((active11 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_1(33, 750, 97); break; default : break; @@ -4692,8 +4703,8 @@ else if (curChar == 46) jjCheckNAddTwoStates(56, 57); else if (curChar == 7) { - if (kind > 826) - kind = 826; + if (kind > 829) + kind = 829; } else if (curChar == 34) jjCheckNAddTwoStates(30, 32); @@ -4701,14 +4712,14 @@ else if (curChar == 45) jjstateSet[jjnewStateCnt++] = 23; if ((0x3ff000000000000L & l) != 0L) { - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(9, 15); } else if (curChar == 36) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -4721,8 +4732,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -4735,8 +4746,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -4751,8 +4762,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -4775,8 +4786,8 @@ else if (curChar == 38) jjstateSet[jjnewStateCnt++] = 67; if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -4785,8 +4796,8 @@ else if (curChar == 38) case 92: if (curChar == 47) { - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); } else if (curChar == 42) @@ -4801,8 +4812,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -4823,8 +4834,8 @@ else if (curChar == 39) jjCheckNAddStates(32, 34); else if (curChar == 39) { - if (kind > 758) - kind = 758; + if (kind > 759) + kind = 759; } if ((0xfc00f7faffffc9ffL & l) != 0L) jjstateSet[jjnewStateCnt++] = 64; @@ -4834,8 +4845,8 @@ else if (curChar == 39) case 98: if ((0x3ff000000000000L & l) != 0L) { - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(57); } if ((0x3ff000000000000L & l) != 0L) @@ -4860,8 +4871,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 3; break; case 5: - if (curChar == 39 && kind > 757) - kind = 757; + if (curChar == 39 && kind > 758) + kind = 758; break; case 7: if ((0x3ff000000000000L & l) != 0L) @@ -4885,8 +4896,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 11; break; case 13: - if (curChar == 39 && kind > 759) - kind = 759; + if (curChar == 39 && kind > 760) + kind = 760; break; case 17: if ((0xffffff7fffffffffL & l) != 0L) @@ -4904,30 +4915,30 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 20; break; case 22: - if (curChar == 39 && kind > 761) - kind = 761; + if (curChar == 39 && kind > 762) + kind = 762; break; case 23: if (curChar != 45) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; case 24: if ((0xffffffffffffdbffL & l) == 0L) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; case 25: - if ((0x2400L & l) != 0L && kind > 812) - kind = 812; + if ((0x2400L & l) != 0L && kind > 815) + kind = 815; break; case 26: - if (curChar == 10 && kind > 812) - kind = 812; + if (curChar == 10 && kind > 815) + kind = 815; break; case 27: if (curChar == 13) @@ -4954,21 +4965,21 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 31; break; case 33: - if (curChar == 34 && kind > 817) - kind = 817; + if (curChar == 34 && kind > 820) + kind = 820; break; case 34: if (curChar != 36) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -4986,8 +4997,8 @@ else if (curChar == 39) case 39: if (curChar != 36) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAddTwoStates(39, 40); break; case 40: @@ -4997,26 +5008,26 @@ else if (curChar == 39) case 41: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAdd(41); break; case 42: - if (curChar == 7 && kind > 826) - kind = 826; + if (curChar == 7 && kind > 829) + kind = 829; break; case 43: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(9, 15); break; case 44: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAdd(44); break; case 45: @@ -5030,8 +5041,8 @@ else if (curChar == 39) case 48: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 752) - kind = 752; + if (kind > 753) + kind = 753; jjCheckNAdd(48); break; case 49: @@ -5045,22 +5056,22 @@ else if (curChar == 39) case 51: if (curChar != 46) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); break; case 52: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); break; case 53: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAddStates(35, 37); break; case 54: @@ -5078,8 +5089,8 @@ else if (curChar == 39) case 57: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(57); break; case 58: @@ -5099,12 +5110,12 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 60; break; case 62: - if (curChar == 39 && kind > 758) - kind = 758; + if (curChar == 39 && kind > 759) + kind = 759; break; case 64: - if (curChar == 39 && kind > 765) - kind = 765; + if (curChar == 39 && kind > 766) + kind = 766; break; case 67: case 69: @@ -5120,8 +5131,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 69; break; case 71: - if (curChar == 39 && kind > 760) - kind = 760; + if (curChar == 39 && kind > 761) + kind = 761; break; case 72: if (curChar == 38) @@ -5144,8 +5155,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 75; break; case 77: - if (curChar == 34 && kind > 823) - kind = 823; + if (curChar == 34 && kind > 826) + kind = 826; break; case 79: if (curChar == 32) @@ -5172,14 +5183,14 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 91; break; case 91: - if ((0xffff7fffffffffffL & l) != 0L && kind > 810) - kind = 810; + if ((0xffff7fffffffffffL & l) != 0L && kind > 813) + kind = 813; break; case 93: if (curChar != 47) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; default : break; @@ -5200,8 +5211,8 @@ else if (curChar == 123) jjAddStates(48, 55); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if ((0x20000000200000L & l) != 0L) @@ -5222,8 +5233,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -5234,8 +5245,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -5246,8 +5257,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -5262,8 +5273,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -5274,8 +5285,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -5286,13 +5297,13 @@ else if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 85; else if ((0x1000000010L & l) != 0L) { - if (kind > 768) - kind = 768; + if (kind > 769) + kind = 769; } if ((0x10000000100000L & l) != 0L) { - if (kind > 769) - kind = 769; + if (kind > 770) + kind = 770; } break; case 63: @@ -5343,22 +5354,22 @@ else if ((0x1000000010L & l) != 0L) jjCheckNAddStates(28, 31); break; case 24: - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(25, 27); break; case 34: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -5368,15 +5379,15 @@ else if ((0x1000000010L & l) != 0L) case 39: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(58, 59); break; case 41: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 41; break; case 46: @@ -5401,32 +5412,32 @@ else if ((0x1000000010L & l) != 0L) jjAddStates(48, 55); break; case 80: - if ((0x1000000010L & l) != 0L && kind > 768) - kind = 768; + if ((0x1000000010L & l) != 0L && kind > 769) + kind = 769; break; case 82: - if ((0x10000000100000L & l) != 0L && kind > 769) - kind = 769; + if ((0x10000000100000L & l) != 0L && kind > 770) + kind = 770; break; case 84: if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 85; break; case 85: - if ((0x8000000080000L & l) != 0L && kind > 770) - kind = 770; + if ((0x8000000080000L & l) != 0L && kind > 771) + kind = 771; break; case 87: if ((0x4000000040L & l) != 0L) jjstateSet[jjnewStateCnt++] = 88; break; case 88: - if ((0x400000004000L & l) != 0L && kind > 771) - kind = 771; + if ((0x400000004000L & l) != 0L && kind > 772) + kind = 772; break; case 91: - if (kind > 810) - kind = 810; + if (kind > 813) + kind = 813; break; default : break; } @@ -5446,8 +5457,8 @@ else if ((0x1000000010L & l) != 0L) case 0: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -5456,8 +5467,8 @@ else if ((0x1000000010L & l) != 0L) case 1: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -5468,8 +5479,8 @@ else if ((0x1000000010L & l) != 0L) case 97: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -5480,8 +5491,8 @@ else if ((0x1000000010L & l) != 0L) case 95: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -5497,8 +5508,8 @@ else if ((0x1000000010L & l) != 0L) case 66: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -5509,8 +5520,8 @@ else if ((0x1000000010L & l) != 0L) case 16: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -5545,22 +5556,22 @@ else if ((0x1000000010L & l) != 0L) case 24: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(25, 27); break; case 34: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -5570,15 +5581,15 @@ else if ((0x1000000010L & l) != 0L) case 39: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(58, 59); break; case 41: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 41; break; case 59: @@ -5594,8 +5605,8 @@ else if ((0x1000000010L & l) != 0L) jjAddStates(45, 47); break; case 91: - if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 810) - kind = 810; + if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 813) + kind = 813; break; default : break; } @@ -5619,205 +5630,205 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, switch (pos) { case 0: - if ((active2 & 0xfe00000000000000L) != 0L || (active3 & 0x7ffffL) != 0L || (active11 & 0x10000000L) != 0L) - { - jjmatchedKind = 821; - return 16; - } - if ((active12 & 0x10L) != 0L) + if ((active12 & 0x20L) != 0L) return 94; - if ((active12 & 0x20000000L) != 0L) + if ((active12 & 0x40000000L) != 0L) return 63; - if ((active5 & 0x7fffff000000000L) != 0L || (active11 & 0x200000000L) != 0L) + if ((active12 & 0x480002000000L) != 0L) + return 92; + if ((active5 & 0x7fffff000000000L) != 0L || (active11 & 0x400000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 95; } - if ((active12 & 0x90001000000L) != 0L) - return 92; - if ((active11 & 0x1000L) != 0L) + if ((active11 & 0x2000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 1; } - if ((active12 & 0x40L) != 0L) + if ((active12 & 0x80L) != 0L) return 96; - if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0x1ffffffffffffc0L) != 0L || (active3 & 0xff8001fffff80000L) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xf800000000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffc000001ffffffL) != 0L || (active11 & 0x4e55ef27efffL) != 0L) + if ((active2 & 0xfe00000000000000L) != 0L || (active3 & 0x7ffffL) != 0L || (active11 & 0x20000000L) != 0L) + { + jjmatchedKind = 824; + return 16; + } + if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x635001b00000L) != 0L || (active12 & 0x1000000000L) != 0L) + return 97; + if ((active12 & 0x20000400L) != 0L) + return 98; + if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0x1ffffffffffffc0L) != 0L || (active3 & 0xff8001fffff80000L) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xf800000000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfff8000001ffffffL) != 0L || (active11 & 0x9cabde4fdfffL) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 97; } - if ((active10 & 0x3fffffe000000L) != 0L) + if ((active10 & 0x7fffffe000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 66; } - if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x31a800d80000L) != 0L || (active12 & 0x200000000L) != 0L) - return 97; - if ((active12 & 0x10000200L) != 0L) - return 98; - if ((active12 & 0x600000L) != 0L) + if ((active12 & 0xc00000L) != 0L) return 23; return -1; case 1: - if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x3efd5feeffffL) != 0L) + if ((active12 & 0x480000000000L) != 0L) + return 90; + if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x820540220000L) != 0L) + return 97; + if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x7dfabfddffffL) != 0L) { if (jjmatchedPos != 1) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 1; } return 97; } - if ((active12 & 0x90000000000L) != 0L) - return 90; - if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x4102a0110000L) != 0L) - return 97; return -1; case 2: - if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0x57fffffeefffL) != 0L) + if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x500000002000L) != 0L) + return 97; + if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0xaffffffddfffL) != 0L) { if (jjmatchedPos != 2) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 2; } return 97; } - if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x280000001000L) != 0L) - return 97; return -1; case 3: - if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0xa0025f00010e0000L) != 0L || (active11 & 0x180100e3c7L) != 0L) - return 97; - if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0x5ffda0fffef1fffeL) != 0L || (active11 & 0x7fe7fefe0c38L) != 0L) + if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0xbffb41fffef1fffeL) != 0L || (active11 & 0xffcffdfc1870L) != 0L) { if (jjmatchedPos != 3) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 3; } return 97; } + if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0x4004be00010e0000L) != 0L || (active11 & 0x300201c78fL) != 0L) + return 97; if ((active2 & 0x8000000000000000L) != 0L) return 99; return -1; case 4: - if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x1da0a060001000L) != 0L || (active11 & 0x430022204809L) != 0L) - return 97; - if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0x5fe01e5f9ef5effeL) != 0L || (active11 & 0x3ce7ddde05b4L) != 0L) + if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0xbfc03cbf9ef5effeL) != 0L || (active11 & 0x79cfbbbc0b68L) != 0L) { if (jjmatchedPos != 4) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 4; } return 97; } + if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x3b414060001000L) != 0L || (active11 & 0x860044409012L) != 0L) + return 97; if ((active2 & 0x8000000000000000L) != 0L) return 99; return -1; case 5: - if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0x5ff01e071e75effeL) != 0L || (active11 & 0x3ce7dfee0514L) != 0L) + if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x1000a880800000L) != 0L || (active11 & 0x200140L) != 0L) + return 97; + if ((active2 & 0x8000000000000000L) != 0L) + return 99; + if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0xbfe03c171e75effeL) != 0L || (active11 & 0x79cfbfdc0a28L) != 0L) { if (jjmatchedPos != 5) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 5; } return 97; } - if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x8005880800000L) != 0L || (active11 & 0x1000a0L) != 0L) - return 97; - if ((active2 & 0x8000000000000000L) != 0L) - return 99; return -1; case 6: - if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x1f2000070241e000L) != 0L || (active11 & 0x18c100040500L) != 0L) + if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x3e4000070241e000L) != 0L || (active11 & 0x318200080a00L) != 0L) return 97; - if ((active2 & 0x8000000000000000L) != 0L) - return 99; - if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x40d01e001c340ffeL) != 0L || (active11 & 0x2426dffa0014L) != 0L) + if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x81a03c101c340ffeL) != 0L || (active11 & 0x484dbff40028L) != 0L) { if (jjmatchedPos != 6) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 6; } return 97; } - return -1; - case 7: - if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0x50000000300004L) != 0L || (active11 & 0x444020004L) != 0L) - return 97; if ((active2 & 0x8000000000000000L) != 0L) return 99; - if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0x50801e001c05cffaL) != 0L || (active11 & 0x24229bf80010L) != 0L) + return -1; + case 7: + if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0xa1003c001c05cffaL) != 0L || (active11 & 0x484537f00020L) != 0L) { if (jjmatchedPos != 7) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 7; } return 97; } + if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0xa0001000300004L) != 0L || (active11 & 0x888040008L) != 0L) + return 97; + if ((active2 & 0x8000000000000000L) != 0L) + return 99; return -1; case 8: - if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x10001e001805c87aL) != 0L || (active11 & 0x24208be80010L) != 0L) + if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x20003c001805c87aL) != 0L || (active11 & 0x484117d00020L) != 0L) { if (jjmatchedPos != 8) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 8; } return 97; } - if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x4080000004000780L) != 0L || (active11 & 0x210100000L) != 0L) + if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x8100000004000780L) != 0L || (active11 & 0x420200000L) != 0L) return 97; return -1; case 9: - if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x1e001801cc7aL) != 0L || (active11 & 0x200081680010L) != 0L) + if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x2000000000040100L) != 0L || (active11 & 0x84015000000L) != 0L) + return 97; + if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x3c001801cc7aL) != 0L || (active11 & 0x400102d00020L) != 0L) { if (jjmatchedPos != 9) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 9; } return 97; } - if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x1000000000040100L) != 0L || (active11 & 0x4200a800000L) != 0L) - return 97; return -1; case 10: - if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x81400000L) != 0L) + if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x102800000L) != 0L) return 97; - if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x1e001001c402L) != 0L || (active11 & 0x200000280010L) != 0L) + if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x3c001001c402L) != 0L || (active11 & 0x400000500020L) != 0L) { if (jjmatchedPos != 10) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 10; } return 97; } return -1; case 11: - if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x1e0010014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x3c0010014472L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 11) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 11; } return 97; } - if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x80010L) != 0L) + if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x100020L) != 0L) return 97; return -1; case 12: - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x1e0000014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x3c0000014472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 12; return 97; } @@ -5827,9 +5838,9 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, case 13: if ((active1 & 0x4000000000200000L) != 0L || (active2 & 0x8000L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x10000L) != 0L || (active6 & 0x8000003000000L) != 0L || (active7 & 0x4000400000008000L) != 0L || (active9 & 0x800000000024000L) != 0L || (active10 & 0x10000L) != 0L) return 97; - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x1e0000004472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x3c0000004472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 13; return 97; } @@ -5837,19 +5848,19 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, case 14: if ((active0 & 0x20000000000L) != 0L || (active1 & 0x100084800000200L) != 0L || (active5 & 0x280L) != 0L || (active6 & 0x30000000000L) != 0L || (active7 & 0x100100000000L) != 0L || (active8 & 0x8000000000000000L) != 0L || (active9 & 0x5000004200010000L) != 0L || (active10 & 0x4402L) != 0L) return 97; - if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 14; return 97; } return -1; case 15: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 15) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 15; } return 97; @@ -5858,11 +5869,11 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, return 97; return -1; case 16: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 16) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 16; } return 97; @@ -5873,9 +5884,9 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, case 17: if ((active1 & 0x2000000080L) != 0L || (active8 & 0x400000000000000L) != 0L) return 97; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 17; return 97; } @@ -5883,20 +5894,20 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, case 18: if ((active8 & 0xb00000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x10L) != 0L) return 97; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 18) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 18; } return 97; } return -1; case 19: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 19; return 97; } @@ -5906,27 +5917,27 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, case 20: if ((active0 & 0x1000000L) != 0L || (active1 & 0x8000040L) != 0L || (active2 & 0x100000000000000L) != 0L || (active7 & 0x200000000L) != 0L) return 97; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 20; return 97; } return -1; case 21: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 21; return 97; } - if ((active2 & 0x2000L) != 0L || (active10 & 0xc0000000020L) != 0L) + if ((active2 & 0x2000L) != 0L || (active10 & 0x180000000020L) != 0L) return 97; return -1; case 22: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 22; return 97; } @@ -5934,39 +5945,39 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, return 97; return -1; case 23: - if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x100000000040L) != 0L) + if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x200000000040L) != 0L) return 97; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x20000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x40000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 23; return 97; } return -1; case 24: - if ((active6 & 0x20000000L) != 0L || (active10 & 0x20000000000L) != 0L) + if ((active6 & 0x20000000L) != 0L || (active10 & 0x40000000000L) != 0L) return 97; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 24; return 97; } return -1; case 25: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 25; return 97; } - if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x200000L) != 0L) + if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x400000L) != 0L) return 97; return -1; case 26: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 26; return 97; } @@ -5974,9 +5985,9 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, return 97; return -1; case 27: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 27; return 97; } @@ -5984,17 +5995,17 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, case 28: if ((active8 & 0x200000000000000L) != 0L) return 97; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 28; return 97; } return -1; case 29: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 29; return 97; } @@ -6002,17 +6013,17 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, case 30: if ((active1 & 0x400000000000000L) != 0L) return 97; - if ((active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 30; return 97; } return -1; case 31: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 31; return 97; } @@ -6020,9 +6031,9 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, return 97; return -1; case 32: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 32; return 97; } @@ -6049,74 +6060,76 @@ private final int jjMoveStringLiteralDfa0_0() { case 33: jjmatchedKind = 1; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000L); case 34: - return jjStopAtPos(0, 798); + return jjStopAtPos(0, 799); case 36: - return jjStartNfaWithStates_0(0, 801, 97); + return jjStartNfaWithStates_0(0, 804, 97); case 37: - return jjStopAtPos(0, 793); + return jjStopAtPos(0, 794); + case 38: + return jjStopAtPos(0, 802); case 39: - return jjStartNfaWithStates_0(0, 797, 63); + return jjStartNfaWithStates_0(0, 798, 63); case 40: - return jjStopAtPos(0, 766); - case 41: return jjStopAtPos(0, 767); + case 41: + return jjStopAtPos(0, 768); case 42: - jjmatchedKind = 791; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000000L); + jjmatchedKind = 792; + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000000L); case 43: - return jjStopAtPos(0, 788); + return jjStopAtPos(0, 789); case 44: - return jjStopAtPos(0, 778); + return jjStopAtPos(0, 779); case 45: - jjmatchedKind = 789; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000L); + jjmatchedKind = 790; + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000L); case 46: - jjmatchedKind = 777; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + jjmatchedKind = 778; + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L); case 47: - jjmatchedKind = 792; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x90000000000L); + jjmatchedKind = 793; + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x480000000000L); case 58: - jjmatchedKind = 783; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L); + jjmatchedKind = 784; + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000000L); case 59: - return jjStopAtPos(0, 776); + return jjStopAtPos(0, 777); case 60: - jjmatchedKind = 781; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x50000L); + jjmatchedKind = 782; + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000a0000L); case 61: - jjmatchedKind = 779; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); - case 62: jjmatchedKind = 780; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + case 62: + jjmatchedKind = 781; + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L); case 63: - return jjStopAtPos(0, 782); + return jjStopAtPos(0, 783); case 91: - return jjStartNfaWithStates_0(0, 774, 96); + return jjStartNfaWithStates_0(0, 775, 96); case 93: - return jjStopAtPos(0, 775); + return jjStopAtPos(0, 776); case 94: - return jjStopAtPos(0, 800); + return jjStopAtPos(0, 801); case 65: case 97: jjmatchedKind = 3; - return jjMoveStringLiteralDfa1_0(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x110000180000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x220000300000L, 0x0L); case 66: case 98: - return jjMoveStringLiteralDfa1_0(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L, 0x0L); case 67: case 99: jjmatchedKind = 52; - return jjMoveStringLiteralDfa1_0(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa000c00000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x14001800000L, 0x0L); case 68: case 100: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000L, 0x0L); case 69: case 101: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L, 0x0L); case 70: case 102: return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x1fffff80000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); @@ -6129,67 +6142,67 @@ private final int jjMoveStringLiteralDfa0_0() return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x1f80000000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 73: case 105: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa0010000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x140020000L, 0x0L); case 74: case 106: return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0xffe0000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 75: case 107: jjmatchedKind = 296; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000000L, 0x0L); case 76: case 108: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); case 77: case 109: jjmatchedKind = 322; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x200000000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x400000000000L, 0x0L); case 78: case 110: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L, 0x0L); case 79: case 111: return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xf800000000000000L, 0x3fffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 80: case 112: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x440000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x880000000L, 0x0L); case 81: case 113: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x20000000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x40000000000L, 0x0L); case 82: case 114: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x80000000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x100000000000L, 0x0L); case 83: case 115: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x45000000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x8a000000000L, 0x0L); case 84: case 116: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x400000020000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x800000040000L, 0x0L); case 85: case 117: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3fffffe000000L, 0x0L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffffe000000L, 0x0L, 0x0L); case 86: case 118: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3ffc000000000000L, 0x2000000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7ff8000000000000L, 0x4000000L, 0x0L); case 87: case 119: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000000000000000L, 0xc200fffL, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000000000000L, 0x18401fffL, 0x0L); case 88: case 120: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000L, 0x0L); case 89: case 121: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x6000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000L, 0x0L); case 90: case 122: - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000L, 0x0L); case 123: - return jjStartNfaWithStates_0(0, 772, 94); + return jjStartNfaWithStates_0(0, 773, 94); case 124: - jjmatchedKind = 799; - return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x4000000L); + jjmatchedKind = 800; + return jjMoveStringLiteralDfa1_0(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); case 125: - return jjStopAtPos(0, 773); + return jjStopAtPos(0, 774); case 126: return jjStopAtPos(0, 2); default : @@ -6206,55 +6219,59 @@ private final int jjMoveStringLiteralDfa1_0(long active0, long active1, long act switch(curChar) { case 42: - if ((active12 & 0x80000000000L) != 0L) + if ((active12 & 0x400000000000L) != 0L) { - jjmatchedKind = 811; + jjmatchedKind = 814; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x10000000000L); + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x80000000000L); case 46: - if ((active12 & 0x10000000L) != 0L) - return jjStopAtPos(1, 796); + if ((active12 & 0x20000000L) != 0L) + return jjStopAtPos(1, 797); break; case 47: - if ((active12 & 0x20000000000L) != 0L) - return jjStopAtPos(1, 809); + if ((active12 & 0x100000000000L) != 0L) + return jjStopAtPos(1, 812); break; case 58: - if ((active12 & 0x400000000L) != 0L) - return jjStopAtPos(1, 802); + if ((active12 & 0x2000000000L) != 0L) + return jjStopAtPos(1, 805); + break; + case 60: + if ((active12 & 0x800000000L) != 0L) + return jjStopAtPos(1, 803); break; case 61: - if ((active12 & 0x10000L) != 0L) - return jjStopAtPos(1, 784); - else if ((active12 & 0x20000L) != 0L) + if ((active12 & 0x20000L) != 0L) return jjStopAtPos(1, 785); - else if ((active12 & 0x80000L) != 0L) - return jjStopAtPos(1, 787); + else if ((active12 & 0x40000L) != 0L) + return jjStopAtPos(1, 786); + else if ((active12 & 0x100000L) != 0L) + return jjStopAtPos(1, 788); break; case 62: - if ((active12 & 0x40000L) != 0L) - return jjStopAtPos(1, 786); - else if ((active12 & 0x400000L) != 0L) - return jjStopAtPos(1, 790); - else if ((active12 & 0x8000000L) != 0L) - return jjStopAtPos(1, 795); + if ((active12 & 0x80000L) != 0L) + return jjStopAtPos(1, 787); + else if ((active12 & 0x800000L) != 0L) + return jjStopAtPos(1, 791); + else if ((active12 & 0x10000000L) != 0L) + return jjStopAtPos(1, 796); break; case 65: case 97: - return jjMoveStringLiteralDfa2_0(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0x7fc000000000000L, active11, 0x200443c40000L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0xff8000000000000L, active11, 0x400887880000L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa2_0(active0, 0x70L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 67: case 99: - return jjMoveStringLiteralDfa2_0(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x1000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x2000000000L, active12, 0L); case 68: case 100: return jjMoveStringLiteralDfa2_0(active0, 0x700L, active1, 0L, active2, 0L, active3, 0x2000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 69: case 101: - return jjMoveStringLiteralDfa2_0(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xd800000002000000L, active11, 0x84000026001L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xb000000002000000L, active11, 0x10800004c003L, active12, 0L); case 70: case 102: if ((active5 & 0x8000000000000000L) != 0L) @@ -6262,18 +6279,18 @@ else if ((active12 & 0x8000000L) != 0L) jjmatchedKind = 383; jjmatchedPos = 1; } - else if ((active11 & 0x10000L) != 0L) - return jjStartNfaWithStates_0(1, 720, 97); - return jjMoveStringLiteralDfa2_0(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000L, active12, 0L); + else if ((active11 & 0x20000L) != 0L) + return jjStartNfaWithStates_0(1, 721, 97); + return jjMoveStringLiteralDfa2_0(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); case 71: case 103: return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 72: case 104: - return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0xeL, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0x1cL, active12, 0L); case 73: case 105: - return jjMoveStringLiteralDfa2_0(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x2000000000000000L, active11, 0x8000001f0L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x4000000000000000L, active11, 0x10000003e0L, active12, 0L); case 75: case 107: return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -6282,7 +6299,7 @@ else if ((active11 & 0x10000L) != 0L) return jjMoveStringLiteralDfa2_0(active0, 0x80000001f000L, active1, 0xf000L, active2, 0xc00000000000000L, active3, 0x8000400006000000L, active4, 0L, active5, 0L, active6, 0x1c00000000002L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 77: case 109: - return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x1000L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x2000L, active12, 0L); case 78: case 110: if ((active4 & 0x10L) != 0L) @@ -6297,7 +6314,7 @@ else if ((active6 & 0x8L) != 0L) jjmatchedKind = 387; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_0(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0xffc000000L, active11, 0x1000b0000000L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1ffc000000L, active11, 0x200160000000L, active12, 0L); case 79: case 111: if ((active3 & 0x800000000000L) != 0L) @@ -6315,10 +6332,10 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 640; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_0(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x40a300008200L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x814600010400L, active12, 0L); case 80: case 112: - return jjMoveStringLiteralDfa2_0(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0x7000000000L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0xe000000000L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x8L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xfffffffe00000000L, active9, 0x7fffffL, active10, 0L, active11, 0L, active12, 0L); @@ -6329,7 +6346,7 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 393; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_0(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0xc200c00L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0x18401800L, active12, 0L); case 83: case 115: if ((active0 & 0x2000000L) != 0L) @@ -6342,7 +6359,7 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 281; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_0(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3f8000000000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x7f0000000000L, active11, 0x20000000000L, active12, 0L); case 84: case 116: if ((active0 & 0x100000000L) != 0L) @@ -6350,10 +6367,10 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 32; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_0(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x1c00000000000L, active11, 0x40000100000L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x3800000000000L, active11, 0x80000200000L, active12, 0L); case 85: case 117: - return jjMoveStringLiteralDfa2_0(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x2000000c00000L, active11, 0x20000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_0(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x4000000c00000L, active11, 0x40000000000L, active12, 0L); case 86: case 118: return jjMoveStringLiteralDfa2_0(active0, 0x2000000000L, active1, 0L, active2, 0L, active3, 0x40L, active4, 0L, active5, 0L, active6, 0x3c0000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -6366,8 +6383,8 @@ else if ((active4 & 0x2000000L) != 0L) return jjStartNfaWithStates_0(1, 51, 97); return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x1c0000000000020L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x3c0000000000L, active10, 0x1000000L, active11, 0L, active12, 0L); case 124: - if ((active12 & 0x4000000L) != 0L) - return jjStopAtPos(1, 794); + if ((active12 & 0x8000000L) != 0L) + return jjStopAtPos(1, 795); break; default : break; @@ -6386,14 +6403,14 @@ private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, switch(curChar) { case 43: - if ((active12 & 0x10000000000L) != 0L) - return jjStopAtPos(2, 808); + if ((active12 & 0x80000000000L) != 0L) + return jjStopAtPos(2, 811); break; case 65: case 97: if ((active0 & 0x100L) != 0L) return jjStartNfaWithStates_0(2, 8, 97); - return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x8000000ffcL, active11, 0x14100c006400L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x10000000ffcL, active11, 0x28201800c800L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x20000000020000L, active2, 0L, active3, 0L, active4, 0x100100000000000L, active5, 0L, active6, 0x8000000000000000L, active7, 0L, active8, 0L, active9, 0x1c07e00000000L, active10, 0x4000000L, active11, 0L, active12, 0L); @@ -6406,7 +6423,7 @@ else if ((active2 & 0x200000L) != 0L) jjmatchedKind = 149; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x10c40000L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x21880000L, active12, 0L); case 68: case 100: if ((active0 & 0x200L) != 0L) @@ -6427,14 +6444,14 @@ else if ((active6 & 0x2L) != 0L) return jjStartNfaWithStates_0(2, 385, 97); else if ((active6 & 0x400000L) != 0L) return jjStartNfaWithStates_0(2, 406, 97); - return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x4000001020000000L, active11, 0x20000010L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x8000002020000000L, active11, 0x40000020L, active12, 0L); case 69: case 101: if ((active0 & 0x100000L) != 0L) return jjStartNfaWithStates_0(2, 20, 97); else if ((active6 & 0x10L) != 0L) return jjStartNfaWithStates_0(2, 388, 97); - return jjMoveStringLiteralDfa3_0(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0xa0001f0000401000L, active11, 0x2000000000fL, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0x40003e0000401000L, active11, 0x4000000001fL, active12, 0L); case 70: case 102: if ((active7 & 0x200L) != 0L) @@ -6442,14 +6459,14 @@ else if ((active6 & 0x10L) != 0L) jjmatchedKind = 457; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_0(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x1c00000000000L, active11, 0x80000080000L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x3800000000000L, active11, 0x100000100000L, active12, 0L); case 71: case 103: if ((active0 & 0x2000000000L) != 0L) return jjStartNfaWithStates_0(2, 37, 97); else if ((active4 & 0x200000000000L) != 0L) return jjStartNfaWithStates_0(2, 301, 97); - return jjMoveStringLiteralDfa3_0(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000L, active12, 0L); case 72: case 104: return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x8020000000000L, active6, 0x4000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -6457,7 +6474,7 @@ else if ((active4 & 0x200000000000L) != 0L) case 105: if ((active6 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_0(2, 432, 97); - return jjMoveStringLiteralDfa3_0(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x22000c007e000L, active11, 0x200800L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x44000c007e000L, active11, 0x401000L, active12, 0L); case 74: case 106: return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -6476,14 +6493,14 @@ else if ((active8 & 0x200000000L) != 0L) jjmatchedKind = 545; jjmatchedPos = 2; } - else if ((active11 & 0x1000L) != 0L) - return jjStartNfaWithStates_0(2, 716, 97); - return jjMoveStringLiteralDfa3_0(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x1c000000000000L, active11, 0xa82000000L, active12, 0L); + else if ((active11 & 0x2000L) != 0L) + return jjStartNfaWithStates_0(2, 717, 97); + return jjMoveStringLiteralDfa3_0(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x38000000000000L, active11, 0x1504000000L, active12, 0L); case 77: case 109: if ((active9 & 0x10000000000L) != 0L) return jjStartNfaWithStates_0(2, 616, 97); - return jjMoveStringLiteralDfa3_0(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x8000020000L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x10000040000L, active12, 0L); case 78: case 110: if ((active5 & 0x800000L) != 0L) @@ -6491,10 +6508,10 @@ else if ((active11 & 0x1000L) != 0L) jjmatchedKind = 343; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_0(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x2000008020L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x4000010040L, active12, 0L); case 79: case 111: - return jjMoveStringLiteralDfa3_0(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x200000L, active12, 0L); case 80: case 112: if ((active3 & 0x4000L) != 0L) @@ -6506,7 +6523,7 @@ else if ((active3 & 0x400000000000000L) != 0L) return jjStartNfaWithStates_0(2, 250, 97); else if ((active5 & 0x8L) != 0L) return jjStartNfaWithStates_0(2, 323, 97); - return jjMoveStringLiteralDfa3_0(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x2201000002L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x4201000002L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -6522,7 +6539,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 422; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_0(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x1fe0000000000000L, active11, 0x4040000200L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x3fc0000000000000L, active11, 0x8080000400L, active12, 0L); case 83: case 115: if ((active0 & 0x10L) != 0L) @@ -6530,7 +6547,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 4; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_0(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x4002000000L, active11, 0x400000000L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x9002000000L, active11, 0x800000000L, active12, 0L); case 84: case 116: if ((active0 & 0x400000000000L) != 0L) @@ -6556,7 +6573,7 @@ else if ((active8 & 0x40000L) != 0L) jjmatchedKind = 530; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_0(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x4000010001c0L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x800002000380L, active12, 0L); case 85: case 117: return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1000000000000L, active2, 0x4000000000000L, active3, 0x1800000100000008L, active4, 0L, active5, 0L, active6, 0L, active7, 0x780000000000L, active8, 0x10000000L, active9, 0x8000000000000L, active10, 0x180000L, active11, 0L, active12, 0L); @@ -6582,7 +6599,7 @@ else if ((active7 & 0x800000000000L) != 0L) jjmatchedKind = 330; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L, active12, 0L); case 89: case 121: if ((active0 & 0x40000L) != 0L) @@ -6599,7 +6616,7 @@ else if ((active4 & 0x20000000000L) != 0L) jjmatchedKind = 297; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_0(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_0(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x20000000000L, active12, 0L); case 90: case 122: return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -6622,15 +6639,15 @@ private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, case 45: return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 49: - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x800000000000L, active11, 0L); - case 51: return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1000000000000L, active11, 0L); + case 51: + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000000000L, active11, 0L); case 56: - if ((active10 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_0(3, 686, 97); + if ((active10 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_0(3, 687, 97); break; case 95: - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0x60000000200002L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0xc0000000200002L, active11, 0x400000000000L); case 65: case 97: if ((active2 & 0x40L) != 0L) @@ -6640,14 +6657,14 @@ private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, } else if ((active4 & 0x20000000L) != 0L) return jjStartNfaWithStates_0(3, 285, 97); - return jjMoveStringLiteralDfa4_0(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x1400001000L, active11, 0x400041000000L); + return jjMoveStringLiteralDfa4_0(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x2400001000L, active11, 0x800082000000L); case 66: case 98: if ((active0 & 0x800000000000L) != 0L) return jjStartNfaWithStates_0(3, 47, 97); else if ((active1 & 0x4000L) != 0L) return jjStartNfaWithStates_0(3, 78, 97); - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000800000L, active11, 0L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000800000L, active11, 0L); case 67: case 99: if ((active2 & 0x4000000000L) != 0L) @@ -6660,7 +6677,7 @@ else if ((active3 & 0x800L) != 0L) jjmatchedKind = 203; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_0(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x100000002000000L, active11, 0L); + return jjMoveStringLiteralDfa4_0(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x200000002000000L, active11, 0L); case 68: case 100: if ((active3 & 0x200000000000000L) != 0L) @@ -6675,9 +6692,9 @@ else if ((active7 & 0x20L) != 0L) jjmatchedKind = 453; jjmatchedPos = 3; } - else if ((active10 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_0(3, 689, 97); - return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x20L); + else if ((active10 & 0x4000000000000L) != 0L) + return jjStartNfaWithStates_0(3, 690, 97); + return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x40L); case 69: case 101: if ((active0 & 0x400000000000000L) != 0L) @@ -6722,9 +6739,9 @@ else if ((active10 & 0x80000L) != 0L) return jjStartNfaWithStates_0(3, 659, 97); else if ((active10 & 0x1000000L) != 0L) return jjStartNfaWithStates_0(3, 664, 97); - else if ((active11 & 0x8000L) != 0L) - return jjStartNfaWithStates_0(3, 719, 97); - return jjMoveStringLiteralDfa4_0(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0x6820000000L, active11, 0x20000000L); + else if ((active11 & 0x10000L) != 0L) + return jjStartNfaWithStates_0(3, 720, 97); + return jjMoveStringLiteralDfa4_0(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0xc820000000L, active11, 0x40000000L); case 70: case 102: if ((active0 & 0x4000000L) != 0L) @@ -6734,7 +6751,7 @@ else if ((active8 & 0x200L) != 0L) break; case 71: case 103: - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x800001e000L, active11, 0x100000000L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x1000001e000L, active11, 0x200000000L); case 72: case 104: if ((active0 & 0x2000000000000L) != 0L) @@ -6743,29 +6760,29 @@ else if ((active2 & 0x200000000000000L) != 0L) return jjStartNfaWithStates_0(3, 185, 97); else if ((active6 & 0x1000000000L) != 0L) return jjStartNfaWithStates_0(3, 420, 97); - else if ((active11 & 0x40L) != 0L) + else if ((active11 & 0x80L) != 0L) { - jjmatchedKind = 710; + jjmatchedKind = 711; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_0(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0xc00180L); + return jjMoveStringLiteralDfa4_0(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x1800300L); case 73: case 105: - return jjMoveStringLiteralDfa4_0(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x200000200000004L, active11, 0x80080000L); + return jjMoveStringLiteralDfa4_0(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x400001200000004L, active11, 0x100100000L); case 75: case 107: if ((active7 & 0x10L) != 0L) return jjStartNfaWithStates_0(3, 452, 97); else if ((active8 & 0x80L) != 0L) return jjStartNfaWithStates_0(3, 519, 97); - else if ((active10 & 0x8000000000000000L) != 0L) + else if ((active11 & 0x1L) != 0L) { - jjmatchedKind = 703; + jjmatchedKind = 704; jjmatchedPos = 3; } - else if ((active11 & 0x200L) != 0L) - return jjStartNfaWithStates_0(3, 713, 97); - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x40001L); + else if ((active11 & 0x400L) != 0L) + return jjStartNfaWithStates_0(3, 714, 97); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80002L); case 76: case 108: if ((active0 & 0x20000000000000L) != 0L) @@ -6787,9 +6804,9 @@ else if ((active5 & 0x20000000000000L) != 0L) } else if ((active7 & 0x80L) != 0L) return jjStartNfaWithStates_0(3, 455, 97); - else if ((active11 & 0x800000000L) != 0L) - return jjStartNfaWithStates_0(3, 739, 97); - return jjMoveStringLiteralDfa4_0(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x100000000000L); + else if ((active11 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_0(3, 740, 97); + return jjMoveStringLiteralDfa4_0(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x200000000000L); case 77: case 109: if ((active3 & 0x2000000000L) != 0L) @@ -6799,7 +6816,7 @@ else if ((active10 & 0x20000L) != 0L) jjmatchedKind = 657; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_0(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x100000L); + return jjMoveStringLiteralDfa4_0(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x200000L); case 78: case 110: if ((active4 & 0x40000000L) != 0L) @@ -6815,28 +6832,28 @@ else if ((active6 & 0x800000000000L) != 0L) return jjStartNfaWithStates_0(3, 431, 97); else if ((active9 & 0x4000000000000L) != 0L) return jjStartNfaWithStates_0(3, 626, 97); - else if ((active11 & 0x2L) != 0L) + else if ((active11 & 0x4L) != 0L) { - jjmatchedKind = 705; + jjmatchedKind = 706; jjmatchedPos = 3; } - else if ((active11 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_0(3, 740, 97); - return jjMoveStringLiteralDfa4_0(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x4000200100100ff8L, active11, 0x10000000004L); + else if ((active11 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_0(3, 741, 97); + return jjMoveStringLiteralDfa4_0(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x8000400100100ff8L, active11, 0x20000000008L); case 79: case 111: if ((active3 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_0(3, 240, 97); else if ((active4 & 0x800000L) != 0L) return jjStartNfaWithStates_0(3, 279, 97); - return jjMoveStringLiteralDfa4_0(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x200000000L); + return jjMoveStringLiteralDfa4_0(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x400000000L); case 80: case 112: if ((active2 & 0x20000000000000L) != 0L) return jjStartNfaWithStates_0(3, 181, 97); else if ((active8 & 0x2000000L) != 0L) return jjStartNfaWithStates_0(3, 537, 97); - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x800c020400L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x10018040800L); case 81: case 113: return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000L, active11, 0L); @@ -6862,17 +6879,17 @@ else if ((active6 & 0x40000L) != 0L) jjmatchedKind = 402; jjmatchedPos = 3; } - else if ((active10 & 0x10000000000L) != 0L) + else if ((active10 & 0x20000000000L) != 0L) { - jjmatchedKind = 680; + jjmatchedKind = 681; jjmatchedPos = 3; } - else if ((active11 & 0x2000L) != 0L) + else if ((active11 & 0x4000L) != 0L) { - jjmatchedKind = 717; + jjmatchedKind = 718; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_0(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x1e0000000000L, active11, 0xa0010004008L); + return jjMoveStringLiteralDfa4_0(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x3c0000000000L, active11, 0x140020008010L); case 83: case 115: if ((active2 & 0x80000L) != 0L) @@ -6883,7 +6900,7 @@ else if ((active8 & 0x80000L) != 0L) return jjStartNfaWithStates_0(3, 531, 97); else if ((active9 & 0x10000000000000L) != 0L) return jjStartNfaWithStates_0(3, 628, 97); - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x1800000000400000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x3000000000400000L, active11, 0x800000000L); case 84: case 116: if ((active0 & 0x800000000000000L) != 0L) @@ -6903,27 +6920,27 @@ else if ((active6 & 0x800000000L) != 0L) return jjStartNfaWithStates_0(3, 419, 97); else if ((active9 & 0x400000L) != 0L) return jjStartNfaWithStates_0(3, 598, 97); - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x42000200810L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x84000401020L); case 85: case 117: - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x1c000000000000L, active11, 0x2000000L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x38000000000000L, active11, 0x4000000L); case 86: case 118: if ((active6 & 0x400000000000000L) != 0L) return jjStartNfaWithStates_0(3, 442, 97); - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x4000000000L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x8000000000L); case 87: case 119: if ((active8 & 0x200000L) != 0L) return jjStartNfaWithStates_0(3, 533, 97); - else if ((active10 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_0(3, 701, 97); + else if ((active10 & 0x4000000000000000L) != 0L) + return jjStartNfaWithStates_0(3, 702, 97); return jjMoveStringLiteralDfa4_0(active0, 0x80000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: if ((active6 & 0x20L) != 0L) return jjStartNfaWithStates_0(3, 389, 97); - return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x400000000000000L, active11, 0L); + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x800000000000000L, active11, 0L); default : break; } @@ -6941,18 +6958,18 @@ private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, switch(curChar) { case 50: - if ((active10 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_0(4, 688, 97); + if ((active10 & 0x2000000000000L) != 0L) + return jjStartNfaWithStates_0(4, 689, 97); break; case 54: - if ((active10 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_0(4, 687, 97); + if ((active10 & 0x1000000000000L) != 0L) + return jjStartNfaWithStates_0(4, 688, 97); break; case 95: - return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x1e0000040000L, active11, 0xd000000L); + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x3c0000040000L, active11, 0x1a000000L); case 65: case 97: - return jjMoveStringLiteralDfa5_0(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x200000002000000L, active11, 0L); + return jjMoveStringLiteralDfa5_0(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x400000002000000L, active11, 0L); case 66: case 98: if ((active5 & 0x40000000000L) != 0L) @@ -6960,9 +6977,9 @@ private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x80L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000L, active8, 0x3e000000000L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - if ((active11 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_0(4, 744, 97); - return jjMoveStringLiteralDfa5_0(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x200000000000L); + if ((active11 & 0x20000000000L) != 0L) + return jjStartNfaWithStates_0(4, 745, 97); + return jjMoveStringLiteralDfa5_0(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x400000000000L); case 68: case 100: if ((active3 & 0x100000000L) != 0L) @@ -7009,21 +7026,21 @@ else if ((active9 & 0x400000000000L) != 0L) jjmatchedKind = 622; jjmatchedPos = 4; } - else if ((active10 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_0(4, 679, 97); - else if ((active10 & 0x4000000000000L) != 0L) + else if ((active10 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_0(4, 680, 97); + else if ((active10 & 0x8000000000000L) != 0L) { - jjmatchedKind = 690; + jjmatchedKind = 691; jjmatchedPos = 4; } - else if ((active11 & 0x8L) != 0L) - return jjStartNfaWithStates_0(4, 707, 97); - else if ((active11 & 0x800L) != 0L) + else if ((active11 & 0x10L) != 0L) + return jjStartNfaWithStates_0(4, 708, 97); + else if ((active11 & 0x1000L) != 0L) { - jjmatchedKind = 715; + jjmatchedKind = 716; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_0(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x4018000000000000L, active11, 0x80002e00004L); + return jjMoveStringLiteralDfa5_0(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x8030000000000000L, active11, 0x100005c00008L); case 70: case 102: if ((active2 & 0x1000000000L) != 0L) @@ -7031,9 +7048,9 @@ else if ((active11 & 0x800L) != 0L) return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x60000L, active3, 0x1L, active4, 0L, active5, 0x10000000L, active6, 0L, active7, 0L, active8, 0x800000000000L, active9, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_0(4, 685, 97); - return jjMoveStringLiteralDfa5_0(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e000L, active11, 0x200000000L); + if ((active10 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_0(4, 686, 97); + return jjMoveStringLiteralDfa5_0(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100001e000L, active11, 0x400000000L); case 72: case 104: if ((active2 & 0x800000000L) != 0L) @@ -7052,10 +7069,10 @@ else if ((active5 & 0x80000000L) != 0L) jjmatchedKind = 351; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000000L, active11, 0x10L); + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000000L, active11, 0x20L); case 73: case 105: - return jjMoveStringLiteralDfa5_0(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x1c80000000000000L, active11, 0x46100100080L); + return jjMoveStringLiteralDfa5_0(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x3900000000000000L, active11, 0x8c200200100L); case 75: case 107: if ((active1 & 0x800L) != 0L) @@ -7076,9 +7093,9 @@ else if ((active4 & 0x2000000000000000L) != 0L) jjmatchedKind = 317; jjmatchedPos = 4; } - else if ((active11 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_0(4, 750, 97); - return jjMoveStringLiteralDfa5_0(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x40020000L); + else if ((active11 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_0(4, 751, 97); + return jjMoveStringLiteralDfa5_0(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x80040000L); case 77: case 109: return jjMoveStringLiteralDfa5_0(active0, 0x80000000L, active1, 0x3000000L, active2, 0x1c0000000800000L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0x3f800000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0x408000000L, active11, 0L); @@ -7095,10 +7112,10 @@ else if ((active1 & 0x2L) != 0L) return jjStartNfaWithStates_0(4, 65, 97); else if ((active10 & 0x40000000L) != 0L) return jjStartNfaWithStates_0(4, 670, 97); - return jjMoveStringLiteralDfa5_0(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x80080000L); + return jjMoveStringLiteralDfa5_0(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x100100000L); case 79: case 111: - return jjMoveStringLiteralDfa5_0(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x120L); + return jjMoveStringLiteralDfa5_0(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x240L); case 80: case 112: if ((active3 & 0x8000000000000L) != 0L) @@ -7106,7 +7123,7 @@ else if ((active10 & 0x40000000L) != 0L) jjmatchedKind = 243; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x20000000000000L, active11, 0x400L); + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x40000000000000L, active11, 0x800L); case 82: case 114: if ((active0 & 0x800L) != 0L) @@ -7136,9 +7153,9 @@ else if ((active6 & 0x1000000000000000L) != 0L) return jjStartNfaWithStates_0(4, 444, 97); else if ((active10 & 0x20000000L) != 0L) return jjStartNfaWithStates_0(4, 669, 97); - else if ((active10 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_0(4, 677, 97); - return jjMoveStringLiteralDfa5_0(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x4000000000L, active11, 0L); + else if ((active10 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_0(4, 678, 97); + return jjMoveStringLiteralDfa5_0(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x8000000000L, active11, 0L); case 83: case 115: if ((active1 & 0x10000000000000L) != 0L) @@ -7155,11 +7172,11 @@ else if ((active7 & 0x40L) != 0L) return jjStartNfaWithStates_0(4, 454, 97); else if ((active8 & 0x100000L) != 0L) return jjStartNfaWithStates_0(4, 532, 97); - else if ((active11 & 0x1L) != 0L) - return jjStartNfaWithStates_0(4, 704, 97); - else if ((active11 & 0x4000L) != 0L) - return jjStartNfaWithStates_0(4, 718, 97); - return jjMoveStringLiteralDfa5_0(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x40000800000ff8L, active11, 0L); + else if ((active11 & 0x2L) != 0L) + return jjStartNfaWithStates_0(4, 705, 97); + else if ((active11 & 0x8000L) != 0L) + return jjStartNfaWithStates_0(4, 719, 97); + return jjMoveStringLiteralDfa5_0(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x80000800000ff8L, active11, 0L); case 84: case 116: if ((active1 & 0x1000000000000L) != 0L) @@ -7192,10 +7209,10 @@ else if ((active9 & 0x800000L) != 0L) return jjStartNfaWithStates_0(4, 599, 97); else if ((active10 & 0x1000L) != 0L) return jjStartNfaWithStates_0(4, 652, 97); - return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x1000000000L, active11, 0L); + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x2000000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x8000040000L); + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x10000080000L); case 86: case 118: return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0x2000000000L, active3, 0L, active4, 0L, active5, 0x8000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x300000L, active10, 0x200000000L, active11, 0L); @@ -7203,11 +7220,11 @@ else if ((active10 & 0x1000L) != 0L) case 119: if ((active0 & 0x4000L) != 0L) return jjStartNfaWithStates_0(4, 14, 97); - return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000L); + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x800000000L); case 88: case 120: - if ((active11 & 0x20000000L) != 0L) - return jjStartNfaWithStates_0(4, 733, 97); + if ((active11 & 0x40000000L) != 0L) + return jjStartNfaWithStates_0(4, 734, 97); return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: @@ -7222,9 +7239,9 @@ else if ((active2 & 0x1000000000000000L) != 0L) return jjStartNfaWithStates_0(4, 188, 97); else if ((active3 & 0x40L) != 0L) return jjStartNfaWithStates_0(4, 198, 97); - else if ((active11 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_0(4, 745, 97); - return jjMoveStringLiteralDfa5_0(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100010000000L); + else if ((active11 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_0(4, 746, 97); + return jjMoveStringLiteralDfa5_0(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200020000000L); case 90: case 122: return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x6000000000000000L, active10, 0L, active11, 0L); @@ -7245,7 +7262,7 @@ private final int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa6_0(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x10000000000000L, active11, 0x2e00010L); + return jjMoveStringLiteralDfa6_0(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x20000000000000L, active11, 0x5c00020L); case 65: case 97: if ((active7 & 0x800000000000000L) != 0L) @@ -7253,7 +7270,7 @@ private final int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, jjmatchedKind = 507; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_0(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x140000000740078L, active11, 0x20000L); + return jjMoveStringLiteralDfa6_0(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x280000000740078L, active11, 0x40000L); case 66: case 98: return jjMoveStringLiteralDfa6_0(active0, 0xc00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x40000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -7268,7 +7285,7 @@ else if ((active6 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_0(5, 447, 97); else if ((active9 & 0x4000000L) != 0L) return jjStartNfaWithStates_0(5, 602, 97); - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x4000100000L); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x8000200000L); case 68: case 100: if ((active0 & 0x40000000000000L) != 0L) @@ -7284,7 +7301,7 @@ else if ((active8 & 0x8L) != 0L) jjmatchedKind = 515; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_0(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x1e0010000000L, active11, 0L); + return jjMoveStringLiteralDfa6_0(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x3c0010000000L, active11, 0L); case 69: case 101: if ((active0 & 0x4000000000L) != 0L) @@ -7325,9 +7342,9 @@ else if ((active10 & 0x800000L) != 0L) return jjStartNfaWithStates_0(5, 663, 97); else if ((active10 & 0x80000000L) != 0L) return jjStartNfaWithStates_0(5, 671, 97); - else if ((active10 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_0(5, 676, 97); - return jjMoveStringLiteralDfa6_0(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x80000400L); + else if ((active10 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_0(5, 677, 97); + return jjMoveStringLiteralDfa6_0(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x100000800L); case 70: case 102: if ((active5 & 0x80000000000000L) != 0L) @@ -7337,20 +7354,20 @@ else if ((active10 & 0x1000000000L) != 0L) case 103: if ((active3 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_0(5, 247, 97); - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x200000000L); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x400000000L); case 72: case 104: if ((active4 & 0x40000000000000L) != 0L) return jjStartNfaWithStates_0(5, 310, 97); else if ((active8 & 0x4L) != 0L) return jjStartNfaWithStates_0(5, 514, 97); - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 73: case 105: - return jjMoveStringLiteralDfa6_0(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x80000L); + return jjMoveStringLiteralDfa6_0(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x100000L); case 75: case 107: - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x4000000L); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x8000000L); case 76: case 108: if ((active3 & 0x400000000000L) != 0L) @@ -7359,7 +7376,7 @@ else if ((active6 & 0x100000000L) != 0L) return jjStartNfaWithStates_0(5, 416, 97); else if ((active8 & 0x2L) != 0L) return jjStartNfaWithStates_0(5, 513, 97); - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x40000000L); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x80000000L); case 77: case 109: if ((active9 & 0x20000000L) != 0L) @@ -7393,17 +7410,17 @@ else if ((active7 & 0x40000000L) != 0L) jjmatchedKind = 478; jjmatchedPos = 5; } - else if ((active11 & 0x80L) != 0L) - return jjStartNfaWithStates_0(5, 711, 97); - return jjMoveStringLiteralDfa6_0(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0x680000004000000L, active11, 0x2100000000L); + else if ((active11 & 0x100L) != 0L) + return jjStartNfaWithStates_0(5, 712, 97); + return jjMoveStringLiteralDfa6_0(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0xd00001004000000L, active11, 0x4200000000L); case 79: case 111: - return jjMoveStringLiteralDfa6_0(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x1820000200000000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa6_0(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x3040000200000000L, active11, 0x800000000L); case 80: case 112: if ((active7 & 0x40000000000L) != 0L) return jjStartNfaWithStates_0(5, 490, 97); - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x10040000L); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x20080000L); case 81: case 113: return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -7427,7 +7444,7 @@ else if ((active8 & 0x4000L) != 0L) jjmatchedKind = 526; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_0(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa6_0(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x2000000L); case 83: case 115: if ((active0 & 0x10000L) != 0L) @@ -7444,9 +7461,9 @@ else if ((active5 & 0x4000000000000000L) != 0L) return jjStartNfaWithStates_0(5, 382, 97); else if ((active6 & 0x4000L) != 0L) return jjStartNfaWithStates_0(5, 398, 97); - else if ((active10 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_0(5, 691, 97); - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x4000000000000000L, active11, 0xc0000000000L); + else if ((active10 & 0x10000000000000L) != 0L) + return jjStartNfaWithStates_0(5, 692, 97); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x8000000000000000L, active11, 0x180000000000L); case 84: case 116: if ((active0 & 0x20L) != 0L) @@ -7483,21 +7500,21 @@ else if ((active9 & 0x800000000L) != 0L) return jjStartNfaWithStates_0(5, 611, 97); else if ((active10 & 0x800000000L) != 0L) return jjStartNfaWithStates_0(5, 675, 97); - else if ((active10 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_0(5, 678, 97); - return jjMoveStringLiteralDfa6_0(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x8000000000L); + else if ((active10 & 0x8000000000L) != 0L) + return jjStartNfaWithStates_0(5, 679, 97); + return jjMoveStringLiteralDfa6_0(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x10000000000L); case 85: case 117: - return jjMoveStringLiteralDfa6_0(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x100L); + return jjMoveStringLiteralDfa6_0(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x200L); case 86: case 118: - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x8000004L); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x10000008L); case 87: case 119: if ((active4 & 0x4000000L) != 0L) return jjStartNfaWithStates_0(5, 282, 97); - else if ((active11 & 0x20L) != 0L) - return jjStartNfaWithStates_0(5, 709, 97); + else if ((active11 & 0x40L) != 0L) + return jjStartNfaWithStates_0(5, 710, 97); return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x20000L, active3, 0x8000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000L, active11, 0L); case 88: case 120: @@ -7515,7 +7532,7 @@ else if ((active9 & 0x20000000000L) != 0L) return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0x40000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000000L); + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); default : break; } @@ -7537,13 +7554,13 @@ private final int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, return jjStartNfaWithStates_0(6, 464, 97); break; case 95: - return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x100000000L); case 65: case 97: - return jjMoveStringLiteralDfa7_0(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x80000000000e00L, active11, 0x200008000000L); + return jjMoveStringLiteralDfa7_0(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x100000000000e00L, active11, 0x400010000000L); case 66: case 98: - return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x20L); case 67: case 99: if ((active2 & 0x40000000000000L) != 0L) @@ -7566,7 +7583,7 @@ else if ((active5 & 0x20L) != 0L) return jjStartNfaWithStates_0(6, 325, 97); else if ((active10 & 0x400000000L) != 0L) return jjStartNfaWithStates_0(6, 674, 97); - return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x4000000004000000L, active11, 0L); + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x8000000004000000L, active11, 0L); case 69: case 101: if ((active0 & 0x100000000000000L) != 0L) @@ -7604,13 +7621,13 @@ else if ((active7 & 0x80000000000L) != 0L) } else if ((active10 & 0x2000000L) != 0L) return jjStartNfaWithStates_0(6, 665, 97); - else if ((active11 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_0(6, 742, 97); else if ((active11 & 0x8000000000L) != 0L) return jjStartNfaWithStates_0(6, 743, 97); - else if ((active11 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_0(6, 748, 97); - return jjMoveStringLiteralDfa7_0(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x1e0000000000L, active11, 0x45000004L); + else if ((active11 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_0(6, 744, 97); + else if ((active11 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_0(6, 749, 97); + return jjMoveStringLiteralDfa7_0(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x3c1000000000L, active11, 0x8a000008L); case 70: case 102: return jjMoveStringLiteralDfa7_0(active0, 0x10000000000L, active1, 0x1000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -7633,21 +7650,21 @@ else if ((active6 & 0x400000000000L) != 0L) return jjStartNfaWithStates_0(6, 430, 97); else if ((active7 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_0(6, 499, 97); - else if ((active10 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_0(6, 698, 97); - else if ((active11 & 0x100000000L) != 0L) - return jjStartNfaWithStates_0(6, 736, 97); - return jjMoveStringLiteralDfa7_0(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x400000L); + else if ((active10 & 0x800000000000000L) != 0L) + return jjStartNfaWithStates_0(6, 699, 97); + else if ((active11 & 0x200000000L) != 0L) + return jjStartNfaWithStates_0(6, 737, 97); + return jjMoveStringLiteralDfa7_0(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x800000L); case 72: case 104: if ((active0 & 0x4000000000000L) != 0L) return jjStartNfaWithStates_0(6, 50, 97); - else if ((active11 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_0(6, 747, 97); + else if ((active11 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_0(6, 748, 97); return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa7_0(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x200100000L); + return jjMoveStringLiteralDfa7_0(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x400200000L); case 76: case 108: if ((active2 & 0x800000L) != 0L) @@ -7673,7 +7690,7 @@ else if ((active6 & 0x40000000L) != 0L) return jjMoveStringLiteralDfa7_0(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400L, active5, 0x2048000000000000L, active6, 0x2000L, active7, 0x20000L, active8, 0L, active9, 0x4L, active10, 0L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa7_0(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x40000000000000L, active11, 0L); + return jjMoveStringLiteralDfa7_0(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x80000000000000L, active11, 0L); case 78: case 110: if ((active0 & 0x80000000000L) != 0L) @@ -7699,19 +7716,19 @@ else if ((active8 & 0x10000L) != 0L) } else if ((active10 & 0x100000000L) != 0L) return jjStartNfaWithStates_0(6, 672, 97); - else if ((active10 & 0x800000000000000L) != 0L) + else if ((active10 & 0x1000000000000000L) != 0L) { - jjmatchedKind = 699; + jjmatchedKind = 700; jjmatchedPos = 6; } - return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x1000000000000004L, active11, 0x800000L); + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x2000000000000004L, active11, 0x1000000L); case 79: case 111: - return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x10000000000180L, active11, 0L); + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x20000000000180L, active11, 0L); case 80: case 112: - if ((active10 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_0(6, 693, 97); + if ((active10 & 0x40000000000000L) != 0L) + return jjStartNfaWithStates_0(6, 694, 97); return jjMoveStringLiteralDfa7_0(active0, 0x20000000000L, active1, 0x2800000000000L, active2, 0x30000000000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0x80000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 82: case 114: @@ -7737,11 +7754,11 @@ else if ((active10 & 0x2000L) != 0L) jjmatchedKind = 653; jjmatchedPos = 6; } - else if ((active10 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_0(6, 696, 97); - else if ((active11 & 0x400L) != 0L) - return jjStartNfaWithStates_0(6, 714, 97); - return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x400000000L); + else if ((active10 & 0x200000000000000L) != 0L) + return jjStartNfaWithStates_0(6, 697, 97); + else if ((active11 & 0x800L) != 0L) + return jjStartNfaWithStates_0(6, 715, 97); + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x800000000L); case 83: case 115: if ((active5 & 0x40L) != 0L) @@ -7754,9 +7771,9 @@ else if ((active7 & 0x1000000000L) != 0L) return jjStartNfaWithStates_0(6, 484, 97); else if ((active8 & 0x10L) != 0L) return jjStartNfaWithStates_0(6, 516, 97); - else if ((active11 & 0x40000L) != 0L) - return jjStartNfaWithStates_0(6, 722, 97); - return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x200000L); + else if ((active11 & 0x80000L) != 0L) + return jjStartNfaWithStates_0(6, 723, 97); + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x400000L); case 84: case 116: if ((active1 & 0x800000L) != 0L) @@ -7797,14 +7814,14 @@ else if ((active9 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_0(6, 639, 97); else if ((active10 & 0x200000000L) != 0L) return jjStartNfaWithStates_0(6, 673, 97); - else if ((active10 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_0(6, 697, 97); - else if ((active11 & 0x100L) != 0L) - return jjStartNfaWithStates_0(6, 712, 97); - return jjMoveStringLiteralDfa7_0(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x400120a0000L); + else if ((active10 & 0x400000000000000L) != 0L) + return jjStartNfaWithStates_0(6, 698, 97); + else if ((active11 & 0x200L) != 0L) + return jjStartNfaWithStates_0(6, 713, 97); + return jjMoveStringLiteralDfa7_0(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x80024140000L); case 85: case 117: - return jjMoveStringLiteralDfa7_0(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa7_0(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x4000000000L); case 86: case 118: return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0x200000000000000L, active7, 0x203000L, active8, 0L, active9, 0L, active10, 0x2L, active11, 0L); @@ -7846,7 +7863,7 @@ private final int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, return jjMoveStringLiteralDfa8_0(active0, 0x2000000000000000L, active1, 0xff0000000c000000L, active2, 0x180000000000007L, active3, 0L, active4, 0L, active5, 0x70000L, active6, 0x40000000000L, active7, 0x700000000000L, active8, 0x20000L, active9, 0xffc00L, active10, 0x1c000L, active11, 0L); case 65: case 97: - return jjMoveStringLiteralDfa8_0(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x4000000000000000L, active11, 0x800000L); + return jjMoveStringLiteralDfa8_0(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x8000000000000000L, active11, 0x1000000L); case 66: case 98: if ((active8 & 0x10000000000L) != 0L) @@ -7870,8 +7887,10 @@ else if ((active8 & 0x40000000L) != 0L) return jjStartNfaWithStates_0(7, 57, 97); else if ((active2 & 0x10000000L) != 0L) return jjStartNfaWithStates_0(7, 156, 97); - else if ((active11 & 0x400000000L) != 0L) - return jjStartNfaWithStates_0(7, 738, 97); + else if ((active10 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_0(7, 676, 97); + else if ((active11 & 0x800000000L) != 0L) + return jjStartNfaWithStates_0(7, 739, 97); return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40000780000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 69: case 101: @@ -7921,14 +7940,14 @@ else if ((active9 & 0x80L) != 0L) } else if ((active10 & 0x100000L) != 0L) return jjStartNfaWithStates_0(7, 660, 97); - else if ((active11 & 0x20000L) != 0L) - return jjStartNfaWithStates_0(7, 721, 97); - return jjMoveStringLiteralDfa8_0(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x10000000L); + else if ((active11 & 0x40000L) != 0L) + return jjStartNfaWithStates_0(7, 722, 97); + return jjMoveStringLiteralDfa8_0(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x20000000L); case 70: case 102: - if ((active10 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_0(7, 692, 97); - return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x1e0000000000L, active11, 0L); + if ((active10 & 0x20000000000000L) != 0L) + return jjStartNfaWithStates_0(7, 693, 97); + return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active2 & 0x2000000000000000L) != 0L) @@ -7939,7 +7958,7 @@ else if ((active6 & 0x800L) != 0L) return jjStartNfaWithStates_0(7, 395, 97); else if ((active10 & 0x4L) != 0L) return jjStartNfaWithStates_0(7, 642, 97); - return jjMoveStringLiteralDfa8_0(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa8_0(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x2000000L); case 72: case 104: if ((active2 & 0x400000000000L) != 0L) @@ -7947,7 +7966,7 @@ else if ((active10 & 0x4L) != 0L) return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa8_0(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x1000000000000000L, active11, 0x40000000000L); + return jjMoveStringLiteralDfa8_0(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x2000000000000000L, active11, 0x80000000000L); case 74: case 106: return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -7966,9 +7985,9 @@ else if ((active5 & 0x8000000000L) != 0L) return jjStartNfaWithStates_0(7, 359, 97); else if ((active9 & 0x20L) != 0L) return jjStartNfaWithStates_0(7, 581, 97); - else if ((active11 & 0x40000000L) != 0L) - return jjStartNfaWithStates_0(7, 734, 97); - return jjMoveStringLiteralDfa8_0(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x8000000L); + else if ((active11 & 0x80000000L) != 0L) + return jjStartNfaWithStates_0(7, 735, 97); + return jjMoveStringLiteralDfa8_0(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x10000000L); case 77: case 109: return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0x1L, active4, 0xc000000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f01000000000000L, active10, 0L, active11, 0L); @@ -7981,22 +8000,22 @@ else if ((active6 & 0x4000000000000L) != 0L) jjmatchedKind = 434; jjmatchedPos = 7; } - return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x200200000000L); + return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x400400000000L); case 79: case 111: - return jjMoveStringLiteralDfa8_0(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa8_0(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x4000000000L); case 80: case 112: - if ((active10 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_0(7, 694, 97); + if ((active10 & 0x80000000000000L) != 0L) + return jjStartNfaWithStates_0(7, 695, 97); return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0x8000000L, active10, 0L, active11, 0L); case 82: case 114: if ((active8 & 0x40000000000L) != 0L) return jjStartNfaWithStates_0(7, 554, 97); - else if ((active11 & 0x4L) != 0L) - return jjStartNfaWithStates_0(7, 706, 97); - return jjMoveStringLiteralDfa8_0(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x80000000040180L, active11, 0x400000L); + else if ((active11 & 0x8L) != 0L) + return jjStartNfaWithStates_0(7, 707, 97); + return jjMoveStringLiteralDfa8_0(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x100000000040180L, active11, 0x800000L); case 83: case 115: if ((active1 & 0x40000000000L) != 0L) @@ -8018,7 +8037,7 @@ else if ((active7 & 0x4L) != 0L) return jjStartNfaWithStates_0(7, 450, 97); else if ((active9 & 0x8000000000L) != 0L) return jjStartNfaWithStates_0(7, 615, 97); - return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x100000000L); case 84: case 116: if ((active2 & 0x800000000000L) != 0L) @@ -8031,10 +8050,10 @@ else if ((active8 & 0x4000000L) != 0L) return jjStartNfaWithStates_0(7, 538, 97); else if ((active10 & 0x200000L) != 0L) return jjStartNfaWithStates_0(7, 661, 97); - return jjMoveStringLiteralDfa8_0(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x100000L); + return jjMoveStringLiteralDfa8_0(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x200000L); case 85: case 117: - return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x20L); case 86: case 118: return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100L, active8, 0x400L, active9, 0L, active10, 0L, active11, 0L); @@ -8064,9 +8083,9 @@ else if ((active8 & 0x40L) != 0L) return jjStartNfaWithStates_0(7, 518, 97); else if ((active9 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_0(7, 627, 97); - else if ((active11 & 0x4000000L) != 0L) - return jjStartNfaWithStates_0(7, 730, 97); - return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x2280000L); + else if ((active11 & 0x8000000L) != 0L) + return jjStartNfaWithStates_0(7, 731, 97); + return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x4500000L); case 90: case 122: return jjMoveStringLiteralDfa8_0(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x3000000000000L, active6, 0L, active7, 0L, active8, 0x2000L, active9, 0L, active10, 0L, active11, 0L); @@ -8087,7 +8106,7 @@ private final int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x80000L); + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x100000L); case 65: case 97: return jjMoveStringLiteralDfa9_0(active0, 0x11000000000L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0x300020000L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0xa000L, active9, 0x10000000L, active10, 0x40000L, active11, 0L); @@ -8100,7 +8119,7 @@ private final int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, case 99: if ((active9 & 0x40000000000L) != 0L) return jjStartNfaWithStates_0(8, 618, 97); - return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x40000000010L); + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x80000000020L); case 68: case 100: if ((active1 & 0x20000000L) != 0L) @@ -8109,8 +8128,8 @@ else if ((active3 & 0x80000000000L) != 0L) return jjStartNfaWithStates_0(8, 235, 97); else if ((active10 & 0x4000000L) != 0L) return jjStartNfaWithStates_0(8, 666, 97); - else if ((active11 & 0x10000000L) != 0L) - return jjStartNfaWithStates_0(8, 732, 97); + else if ((active11 & 0x20000000L) != 0L) + return jjStartNfaWithStates_0(8, 733, 97); return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x600000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x400L, active10, 0L, active11, 0L); case 69: case 101: @@ -8178,9 +8197,9 @@ else if ((active9 & 0x2000000000L) != 0L) jjmatchedKind = 613; jjmatchedPos = 8; } - else if ((active11 & 0x200000000L) != 0L) - return jjStartNfaWithStates_0(8, 737, 97); - return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x200000000000L); + else if ((active11 & 0x400000000L) != 0L) + return jjStartNfaWithStates_0(8, 738, 97); + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x400000000000L); case 72: case 104: return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x201000L, active10, 0L, active11, 0L); @@ -8188,7 +8207,7 @@ else if ((active11 & 0x200000000L) != 0L) case 105: if ((active0 & 0x40000000000L) != 0L) return jjStartNfaWithStates_0(8, 42, 97); - return jjMoveStringLiteralDfa9_0(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x1e0010000878L, active11, 0x81000000L); + return jjMoveStringLiteralDfa9_0(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x3c0010000878L, active11, 0x102000000L); case 75: case 107: if ((active2 & 0x20000L) != 0L) @@ -8204,7 +8223,7 @@ else if ((active11 & 0x200000000L) != 0L) jjmatchedKind = 647; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x800000L); + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x1000000L); case 78: case 110: if ((active0 & 0x20000000L) != 0L) @@ -8227,10 +8246,10 @@ else if ((active6 & 0x80000000L) != 0L) return jjStartNfaWithStates_0(8, 415, 97); else if ((active6 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_0(8, 439, 97); - return jjMoveStringLiteralDfa9_0(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x1000000000008000L, active11, 0x200000L); + return jjMoveStringLiteralDfa9_0(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x2000000000008000L, active11, 0x400000L); case 79: case 111: - return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x800000L); case 80: case 112: if ((active1 & 0x2000000000000L) != 0L) @@ -8240,7 +8259,7 @@ else if ((active9 & 0x100000000000000L) != 0L) jjmatchedKind = 632; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x2000000L); + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x4000000L); case 81: case 113: return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0L); @@ -8292,7 +8311,7 @@ else if ((active9 & 0x2000000L) != 0L) return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x8000020000000000L, active2, 0x100003L, active3, 0L, active4, 0x200004L, active5, 0x40000L, active6, 0x2000L, active7, 0x4000000000000000L, active8, 0x500000000L, active9, 0x1000000000L, active10, 0x8000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x2008000000L); + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x4010000000L); case 86: case 118: return jjMoveStringLiteralDfa9_0(active0, 0x10000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0L); @@ -8316,12 +8335,12 @@ else if ((active7 & 0x2000L) != 0L) return jjStartNfaWithStates_0(8, 461, 97); else if ((active9 & 0x2000000000000L) != 0L) return jjStartNfaWithStates_0(8, 625, 97); - else if ((active10 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_0(8, 695, 97); - else if ((active10 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_0(8, 702, 97); - else if ((active11 & 0x100000L) != 0L) - return jjStartNfaWithStates_0(8, 724, 97); + else if ((active10 & 0x100000000000000L) != 0L) + return jjStartNfaWithStates_0(8, 696, 97); + else if ((active10 & 0x8000000000000000L) != 0L) + return jjStartNfaWithStates_0(8, 703, 97); + else if ((active11 & 0x200000L) != 0L) + return jjStartNfaWithStates_0(8, 725, 97); return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x80000L, active10, 0L, active11, 0L); default : break; @@ -8355,7 +8374,7 @@ else if ((active2 & 0x400L) != 0L) return jjStartNfaWithStates_0(9, 138, 97); else if ((active9 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_0(9, 631, 97); - return jjMoveStringLiteralDfa10_0(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjMoveStringLiteralDfa10_0(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 68: case 100: if ((active5 & 0x4000000000L) != 0L) @@ -8389,13 +8408,13 @@ else if ((active9 & 0x1000000000L) != 0L) return jjStartNfaWithStates_0(9, 612, 97); else if ((active9 & 0x800000000000L) != 0L) return jjStartNfaWithStates_0(9, 623, 97); - else if ((active11 & 0x800000L) != 0L) - return jjStartNfaWithStates_0(9, 727, 97); - else if ((active11 & 0x2000000L) != 0L) - return jjStartNfaWithStates_0(9, 729, 97); - else if ((active11 & 0x8000000L) != 0L) - return jjStartNfaWithStates_0(9, 731, 97); - return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x200000000000L); + else if ((active11 & 0x1000000L) != 0L) + return jjStartNfaWithStates_0(9, 728, 97); + else if ((active11 & 0x4000000L) != 0L) + return jjStartNfaWithStates_0(9, 730, 97); + else if ((active11 & 0x10000000L) != 0L) + return jjStartNfaWithStates_0(9, 732, 97); + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x400000000000L); case 71: case 103: if ((active6 & 0x200000L) != 0L) @@ -8404,8 +8423,8 @@ else if ((active8 & 0x1000000000L) != 0L) return jjStartNfaWithStates_0(9, 548, 97); else if ((active9 & 0x40000000L) != 0L) return jjStartNfaWithStates_0(9, 606, 97); - else if ((active10 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_0(9, 700, 97); + else if ((active10 & 0x2000000000000000L) != 0L) + return jjStartNfaWithStates_0(9, 701, 97); return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x2000000000000000L, active6, 0x400000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: @@ -8417,7 +8436,7 @@ else if ((active10 & 0x1000000000000000L) != 0L) case 107: if ((active2 & 0x400000000L) != 0L) return jjStartNfaWithStates_0(9, 162, 97); - return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80010L); + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100020L); case 76: case 108: return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2L, active5, 0L, active6, 0L, active7, 0x100000000L, active8, 0L, active9, 0x1000000000000L, active10, 0L, active11, 0L); @@ -8433,10 +8452,10 @@ else if ((active10 & 0x1000000000000000L) != 0L) jjmatchedKind = 98; jjmatchedPos = 9; } - return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x3c0000000000L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x1000000L); + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x2000000L); case 80: case 112: if ((active1 & 0x4000000000000L) != 0L) @@ -8467,10 +8486,10 @@ else if ((active7 & 0x400L) != 0L) return jjStartNfaWithStates_0(9, 458, 97); else if ((active10 & 0x100L) != 0L) return jjStartNfaWithStates_0(9, 648, 97); - else if ((active11 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_0(9, 741, 97); - else if ((active11 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_0(9, 746, 97); + else if ((active11 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_0(9, 742, 97); + else if ((active11 & 0x80000000000L) != 0L) + return jjStartNfaWithStates_0(9, 747, 97); return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x80000000000L, active2, 0x40000000004L, active3, 0L, active4, 0x8000000000000000L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: @@ -8490,7 +8509,7 @@ else if ((active8 & 0x2000000000L) != 0L) return jjMoveStringLiteralDfa10_0(active0, 0x80021000000000L, active1, 0x1e000000008L, active2, 0x8000L, active3, 0x2L, active4, 0x400000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100L, active10, 0L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x800000L); case 86: case 118: return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -8517,7 +8536,7 @@ else if ((active10 & 0x40000L) != 0L) return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x200000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L); default : break; } @@ -8554,7 +8573,7 @@ else if ((active5 & 0x200000L) != 0L) return jjStartNfaWithStates_0(10, 341, 97); else if ((active10 & 0x8000000L) != 0L) return jjStartNfaWithStates_0(10, 667, 97); - return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x400000000000L); case 69: case 101: if ((active0 & 0x10000000000L) != 0L) @@ -8575,9 +8594,9 @@ else if ((active9 & 0x100000000000L) != 0L) return jjStartNfaWithStates_0(10, 620, 97); else if ((active9 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_0(10, 624, 97); - else if ((active11 & 0x80000000L) != 0L) - return jjStartNfaWithStates_0(10, 735, 97); - return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x1e0000000000L, active11, 0x80010L); + else if ((active11 & 0x100000000L) != 0L) + return jjStartNfaWithStates_0(10, 736, 97); + return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x3c0000000000L, active11, 0x100020L); case 70: case 102: return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -8592,7 +8611,7 @@ else if ((active11 & 0x80000000L) != 0L) return jjStartNfaWithStates_0(10, 67, 97); else if ((active6 & 0x400000000L) != 0L) return jjStartNfaWithStates_0(10, 418, 97); - return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 73: case 105: return jjMoveStringLiteralDfa11_0(active0, 0x21000000000L, active1, 0x800000002000L, active2, 0x1000L, active3, 0x2L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0L, active8, 0L, active9, 0x4400000000000000L, active10, 0L, active11, 0L); @@ -8619,8 +8638,8 @@ else if ((active10 & 0x8L) != 0L) } else if ((active10 & 0x800L) != 0L) return jjStartNfaWithStates_0(10, 651, 97); - else if ((active11 & 0x1000000L) != 0L) - return jjStartNfaWithStates_0(10, 728, 97); + else if ((active11 & 0x2000000L) != 0L) + return jjStartNfaWithStates_0(10, 729, 97); return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0x10c200000L, active2, 0x180000000006000L, active3, 0L, active4, 0L, active5, 0x10000L, active6, 0x40002000000L, active7, 0L, active8, 0L, active9, 0xc040L, active10, 0x10000070L, active11, 0L); case 79: case 111: @@ -8629,8 +8648,8 @@ else if ((active11 & 0x1000000L) != 0L) case 112: if ((active9 & 0x10000000L) != 0L) return jjStartNfaWithStates_0(10, 604, 97); - else if ((active11 & 0x400000L) != 0L) - return jjStartNfaWithStates_0(10, 726, 97); + else if ((active11 & 0x800000L) != 0L) + return jjStartNfaWithStates_0(10, 727, 97); return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 81: case 113: @@ -8706,7 +8725,7 @@ private final int jjMoveStringLiteralDfa11_0(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 65: case 97: if ((active8 & 0x1L) != 0L) @@ -8722,7 +8741,7 @@ private final int jjMoveStringLiteralDfa11_0(long old0, long active0, long old1, case 100: if ((active9 & 0x200000000000000L) != 0L) return jjStartNfaWithStates_0(11, 633, 97); - return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 69: case 101: if ((active0 & 0x2000000000000000L) != 0L) @@ -8807,7 +8826,7 @@ else if ((active9 & 0x1000L) != 0L) return jjStartNfaWithStates_0(11, 588, 97); else if ((active9 & 0x80000L) != 0L) return jjStartNfaWithStates_0(11, 595, 97); - return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x400000L); case 83: case 115: return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0x8000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x70L, active11, 0L); @@ -8819,16 +8838,16 @@ else if ((active5 & 0x40000L) != 0L) return jjStartNfaWithStates_0(11, 338, 97); else if ((active9 & 0x40L) != 0L) return jjStartNfaWithStates_0(11, 582, 97); - else if ((active11 & 0x10L) != 0L) - return jjStartNfaWithStates_0(11, 708, 97); + else if ((active11 & 0x20L) != 0L) + return jjStartNfaWithStates_0(11, 709, 97); return jjMoveStringLiteralDfa12_0(active0, 0x20000800000L, active1, 0x200L, active2, 0x6000L, active3, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x8000L, active10, 0L, active11, 0L); case 85: case 117: return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0x100000000L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2000000000004000L, active10, 0L, active11, 0L); case 89: case 121: - if ((active11 & 0x80000L) != 0L) - return jjStartNfaWithStates_0(11, 723, 97); + if ((active11 & 0x100000L) != 0L) + return jjStartNfaWithStates_0(11, 724, 97); break; default : break; @@ -8847,7 +8866,7 @@ private final int jjMoveStringLiteralDfa12_0(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa13_0(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x1e0000000070L, active11, 0L); + return jjMoveStringLiteralDfa13_0(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x3c0000000070L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0x6800000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -8903,12 +8922,12 @@ else if ((active3 & 0x2L) != 0L) return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0x20L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x20000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x400000L); case 80: case 112: if ((active9 & 0x100L) != 0L) return jjStartNfaWithStates_0(12, 584, 97); - return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 82: case 114: if ((active9 & 0x2000000000000000L) != 0L) @@ -8954,7 +8973,7 @@ else if ((active7 & 0x400000000000L) != 0L) return jjStartNfaWithStates_0(13, 494, 97); else if ((active10 & 0x10000L) != 0L) return jjStartNfaWithStates_0(13, 656, 97); - return jjMoveStringLiteralDfa14_0(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa14_0(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 66: case 98: return jjMoveStringLiteralDfa14_0(active0, 0L, active1, 0x100000000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -9007,7 +9026,7 @@ else if ((active9 & 0x4000L) != 0L) case 110: if ((active4 & 0x4L) != 0L) return jjStartNfaWithStates_0(13, 258, 97); - return jjMoveStringLiteralDfa14_0(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x200000L); + return jjMoveStringLiteralDfa14_0(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x400000L); case 79: case 111: return jjMoveStringLiteralDfa14_0(active0, 0x20000000000L, active1, 0x100000000000000L, active2, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0L, active10, 0x4000L, active11, 0L); @@ -9028,7 +9047,7 @@ else if ((active9 & 0x4000L) != 0L) case 116: if ((active7 & 0x8000L) != 0L) return jjStartNfaWithStates_0(13, 463, 97); - return jjMoveStringLiteralDfa14_0(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa14_0(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x3c0000000000L, active11, 0L); case 88: case 120: if ((active6 & 0x8000000000000L) != 0L) @@ -9095,7 +9114,7 @@ else if ((active10 & 0x4000L) != 0L) break; case 73: case 105: - return jjMoveStringLiteralDfa15_0(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa15_0(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x400000L); case 76: case 108: return jjMoveStringLiteralDfa15_0(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -9122,7 +9141,7 @@ else if ((active8 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_0(14, 575, 97); else if ((active9 & 0x10000L) != 0L) return jjStartNfaWithStates_0(14, 592, 97); - return jjMoveStringLiteralDfa15_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa15_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 83: case 115: if ((active1 & 0x200L) != 0L) @@ -9147,7 +9166,7 @@ else if ((active10 & 0x400L) != 0L) break; case 89: case 121: - return jjMoveStringLiteralDfa15_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa15_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); default : break; } @@ -9214,7 +9233,7 @@ else if ((active2 & 0x80000000000000L) != 0L) return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 82: case 114: if ((active1 & 0x100000000L) != 0L) @@ -9224,7 +9243,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xe0000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -9238,7 +9257,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); default : break; } @@ -9261,12 +9280,12 @@ private final int jjMoveStringLiteralDfa16_0(long old0, long active0, long old1, case 97: if ((active1 & 0x8000000000L) != 0L) return jjStartNfaWithStates_0(16, 103, 97); - return jjMoveStringLiteralDfa17_0(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa17_0(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: if ((active7 & 0x400000000L) != 0L) return jjStartNfaWithStates_0(16, 482, 97); - return jjMoveStringLiteralDfa17_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa17_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active1 & 0x100000L) != 0L) @@ -9277,7 +9296,7 @@ private final int jjMoveStringLiteralDfa16_0(long old0, long active0, long old1, return jjMoveStringLiteralDfa17_0(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa17_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa17_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 76: case 108: return jjMoveStringLiteralDfa17_0(active0, 0L, active1, 0L, active2, 0x6000L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0L, active10, 0x40L, active11, 0L); @@ -9341,7 +9360,7 @@ private final int jjMoveStringLiteralDfa17_0(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa18_0(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa18_0(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa18_0(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -9377,7 +9396,7 @@ private final int jjMoveStringLiteralDfa17_0(long old0, long active0, long old1, return jjMoveStringLiteralDfa18_0(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa18_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa18_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 86: case 118: return jjMoveStringLiteralDfa18_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0L); @@ -9404,7 +9423,7 @@ private final int jjMoveStringLiteralDfa18_0(long old0, long active0, long old1, return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x60000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0xc0000000000L, active11, 0L); case 68: case 100: if ((active8 & 0x800000000000000L) != 0L) @@ -9429,7 +9448,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa19_0(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa19_0(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 76: case 108: return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -9438,7 +9457,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); case 79: case 111: return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -9447,7 +9466,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0x4000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000L, active11, 0L); case 84: case 116: return jjMoveStringLiteralDfa19_0(active0, 0L, active1, 0L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0x80000000L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x20L, active11, 0L); @@ -9473,10 +9492,10 @@ private final int jjMoveStringLiteralDfa19_0(long old0, long active0, long old1, case 97: if ((active1 & 0x100L) != 0L) return jjStartNfaWithStates_0(19, 72, 97); - return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0xa0000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0x140000000000L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x200000000000L, active11, 0L); case 68: case 100: return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -9490,7 +9509,7 @@ private final int jjMoveStringLiteralDfa19_0(long old0, long active0, long old1, return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0x10000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x40000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x80000000000L, active11, 0x400000400000L); case 82: case 114: return jjMoveStringLiteralDfa20_0(active0, 0L, active1, 0L, active2, 0x4002L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -9534,7 +9553,7 @@ private final int jjMoveStringLiteralDfa20_0(long old0, long active0, long old1, return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0x20000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 68: case 100: - return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x80000000000L, active11, 0L); case 69: case 101: if ((active1 & 0x8000000L) != 0L) @@ -9551,13 +9570,13 @@ else if ((active2 & 0x100000000000000L) != 0L) case 104: if ((active7 & 0x200000000L) != 0L) return jjStartNfaWithStates_0(20, 481, 97); - return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x200000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x100000000000L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 79: case 111: return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0x2L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -9566,7 +9585,7 @@ else if ((active2 & 0x100000000000000L) != 0L) return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0x400000000000000L, active2, 0L, active6, 0x4000000L, active7, 0L, active8, 0x10000000000000L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_0(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x40000000000L, active11, 0L); case 89: case 121: if ((active0 & 0x1000000L) != 0L) @@ -9589,10 +9608,10 @@ private final int jjMoveStringLiteralDfa21_0(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa22_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa22_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 65: case 97: - return jjMoveStringLiteralDfa22_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000040L, active11, 0L); + return jjMoveStringLiteralDfa22_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000040L, active11, 0L); case 67: case 99: return jjMoveStringLiteralDfa22_0(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -9605,11 +9624,11 @@ private final int jjMoveStringLiteralDfa21_0(long old0, long active0, long old1, case 101: if ((active2 & 0x2000L) != 0L) return jjStartNfaWithStates_0(21, 141, 97); - else if ((active10 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_0(21, 682, 97); else if ((active10 & 0x80000000000L) != 0L) return jjStartNfaWithStates_0(21, 683, 97); - return jjMoveStringLiteralDfa22_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x100000000000L, active11, 0L); + else if ((active10 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_0(21, 684, 97); + return jjMoveStringLiteralDfa22_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x200000000000L, active11, 0L); case 70: case 102: return jjMoveStringLiteralDfa22_0(active1, 0x400000000000000L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -9668,10 +9687,10 @@ private final int jjMoveStringLiteralDfa22_0(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 76: case 108: - return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x100000000000L, active11, 0x200000L); + return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x200000000000L, active11, 0x400000L); case 78: case 110: return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x8000000000000L, active10, 0L, active11, 0L); @@ -9683,7 +9702,7 @@ private final int jjMoveStringLiteralDfa22_0(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 82: case 114: - return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa23_0(active1, 0L, active2, 0L, active6, 0x4000000L, active8, 0L, active10, 0L, active11, 0L); @@ -9710,8 +9729,8 @@ private final int jjMoveStringLiteralDfa23_0(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_0(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 65: case 97: - if ((active10 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_0(23, 684, 97); + if ((active10 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_0(23, 685, 97); break; case 67: case 99: @@ -9735,7 +9754,7 @@ private final int jjMoveStringLiteralDfa23_0(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x2040000000000000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa24_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x20000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa24_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x40000000000L, active11, 0x400000400000L); case 82: case 114: if ((active8 & 0x4000000000000L) != 0L) @@ -9770,7 +9789,7 @@ private final int jjMoveStringLiteralDfa24_0(long old1, long active1, long old2, break; case 68: case 100: - return jjMoveStringLiteralDfa25_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa25_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: return jjMoveStringLiteralDfa25_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x200000000000000L, active10, 0L, active11, 0L); @@ -9779,8 +9798,8 @@ private final int jjMoveStringLiteralDfa24_0(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_0(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_0(24, 681, 97); + if ((active10 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_0(24, 682, 97); break; case 73: case 105: @@ -9802,7 +9821,7 @@ private final int jjMoveStringLiteralDfa24_0(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 87: case 119: - return jjMoveStringLiteralDfa25_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa25_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); default : break; } @@ -9833,8 +9852,8 @@ private final int jjMoveStringLiteralDfa25_0(long old1, long active1, long old2, case 101: if ((active8 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_0(25, 563, 97); - else if ((active11 & 0x200000L) != 0L) - return jjStartNfaWithStates_0(25, 725, 97); + else if ((active11 & 0x400000L) != 0L) + return jjStartNfaWithStates_0(25, 726, 97); break; case 71: case 103: @@ -9856,7 +9875,7 @@ else if ((active11 & 0x200000L) != 0L) return jjMoveStringLiteralDfa26_0(active1, 0L, active2, 0x4002L, active6, 0L, active8, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa26_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa26_0(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa26_0(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active11, 0L); @@ -9877,7 +9896,7 @@ private final int jjMoveStringLiteralDfa26_0(long old1, long active1, long old2, switch(curChar) { case 95: - return jjMoveStringLiteralDfa27_0(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa27_0(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 68: case 100: if ((active8 & 0x80000000000000L) != 0L) @@ -9925,7 +9944,7 @@ private final int jjMoveStringLiteralDfa27_0(long old1, long active1, long old2, return jjMoveStringLiteralDfa28_0(active1, 0L, active2, 0L, active8, 0x200000000000000L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa28_0(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa28_0(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 82: case 114: return jjMoveStringLiteralDfa28_0(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -9952,7 +9971,7 @@ private final int jjMoveStringLiteralDfa28_0(long old1, long active1, long old2, break; case 69: case 101: - return jjMoveStringLiteralDfa29_0(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa29_0(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 79: case 111: return jjMoveStringLiteralDfa29_0(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -9977,7 +9996,7 @@ private final int jjMoveStringLiteralDfa29_0(long old1, long active1, long old2, { case 82: case 114: - return jjMoveStringLiteralDfa30_0(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa30_0(active1, 0L, active2, 0L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa30_0(active1, 0x400000000000000L, active2, 0L, active11, 0L); @@ -10002,7 +10021,7 @@ private final int jjMoveStringLiteralDfa30_0(long old1, long active1, long old2, { case 67: case 99: - return jjMoveStringLiteralDfa31_0(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa31_0(active1, 0L, active2, 0L, active11, 0x400000000000L); case 80: case 112: if ((active1 & 0x400000000000000L) != 0L) @@ -10028,7 +10047,7 @@ private final int jjMoveStringLiteralDfa31_0(long old1, long active1, long old2, case 101: if ((active2 & 0x2L) != 0L) return jjStartNfaWithStates_0(31, 129, 97); - return jjMoveStringLiteralDfa32_0(active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa32_0(active2, 0L, active11, 0x400000000000L); default : break; } @@ -10047,7 +10066,7 @@ private final int jjMoveStringLiteralDfa32_0(long old2, long active2, long old11 { case 78: case 110: - return jjMoveStringLiteralDfa33_0(active11, 0x200000000000L); + return jjMoveStringLiteralDfa33_0(active11, 0x400000000000L); default : break; } @@ -10066,8 +10085,8 @@ private final int jjMoveStringLiteralDfa33_0(long old11, long active11) { case 84: case 116: - if ((active11 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_0(33, 749, 97); + if ((active11 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_0(33, 750, 97); break; default : break; @@ -10104,21 +10123,21 @@ else if (curChar == 46) jjCheckNAddTwoStates(56, 57); else if (curChar == 7) { - if (kind > 826) - kind = 826; + if (kind > 829) + kind = 829; } else if (curChar == 45) jjstateSet[jjnewStateCnt++] = 23; if ((0x3ff000000000000L & l) != 0L) { - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(9, 15); } else if (curChar == 36) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -10131,8 +10150,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -10145,8 +10164,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -10161,8 +10180,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -10184,8 +10203,8 @@ else if (curChar == 38) jjstateSet[jjnewStateCnt++] = 67; if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -10194,8 +10213,8 @@ else if (curChar == 38) case 92: if (curChar == 47) { - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); } else if (curChar == 42) @@ -10210,8 +10229,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -10232,8 +10251,8 @@ else if (curChar == 39) jjCheckNAddStates(32, 34); else if (curChar == 39) { - if (kind > 758) - kind = 758; + if (kind > 759) + kind = 759; } if ((0xfc00f7faffffc9ffL & l) != 0L) jjstateSet[jjnewStateCnt++] = 64; @@ -10243,8 +10262,8 @@ else if (curChar == 39) case 98: if ((0x3ff000000000000L & l) != 0L) { - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(57); } if ((0x3ff000000000000L & l) != 0L) @@ -10269,8 +10288,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 3; break; case 5: - if (curChar == 39 && kind > 757) - kind = 757; + if (curChar == 39 && kind > 758) + kind = 758; break; case 7: if ((0x3ff000000000000L & l) != 0L) @@ -10294,8 +10313,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 11; break; case 13: - if (curChar == 39 && kind > 759) - kind = 759; + if (curChar == 39 && kind > 760) + kind = 760; break; case 17: if ((0xffffff7fffffffffL & l) != 0L) @@ -10313,30 +10332,30 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 20; break; case 22: - if (curChar == 39 && kind > 761) - kind = 761; + if (curChar == 39 && kind > 762) + kind = 762; break; case 23: if (curChar != 45) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; case 24: if ((0xffffffffffffdbffL & l) == 0L) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; case 25: - if ((0x2400L & l) != 0L && kind > 812) - kind = 812; + if ((0x2400L & l) != 0L && kind > 815) + kind = 815; break; case 26: - if (curChar == 10 && kind > 812) - kind = 812; + if (curChar == 10 && kind > 815) + kind = 815; break; case 27: if (curChar == 13) @@ -10349,15 +10368,15 @@ else if (curChar == 39) case 34: if (curChar != 36) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -10375,8 +10394,8 @@ else if (curChar == 39) case 39: if (curChar != 36) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAddTwoStates(39, 40); break; case 40: @@ -10386,26 +10405,26 @@ else if (curChar == 39) case 41: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAdd(41); break; case 42: - if (curChar == 7 && kind > 826) - kind = 826; + if (curChar == 7 && kind > 829) + kind = 829; break; case 43: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(9, 15); break; case 44: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAdd(44); break; case 45: @@ -10419,8 +10438,8 @@ else if (curChar == 39) case 48: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 752) - kind = 752; + if (kind > 753) + kind = 753; jjCheckNAdd(48); break; case 49: @@ -10434,22 +10453,22 @@ else if (curChar == 39) case 51: if (curChar != 46) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); break; case 52: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); break; case 53: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAddStates(35, 37); break; case 54: @@ -10467,8 +10486,8 @@ else if (curChar == 39) case 57: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(57); break; case 58: @@ -10488,12 +10507,12 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 60; break; case 62: - if (curChar == 39 && kind > 758) - kind = 758; + if (curChar == 39 && kind > 759) + kind = 759; break; case 64: - if (curChar == 39 && kind > 765) - kind = 765; + if (curChar == 39 && kind > 766) + kind = 766; break; case 67: case 69: @@ -10509,8 +10528,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 69; break; case 71: - if (curChar == 39 && kind > 760) - kind = 760; + if (curChar == 39 && kind > 761) + kind = 761; break; case 72: if (curChar == 38) @@ -10533,8 +10552,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 75; break; case 77: - if (curChar == 34 && kind > 823) - kind = 823; + if (curChar == 34 && kind > 826) + kind = 826; break; case 79: if (curChar == 32) @@ -10561,14 +10580,14 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 91; break; case 91: - if ((0xffff7fffffffffffL & l) != 0L && kind > 810) - kind = 810; + if ((0xffff7fffffffffffL & l) != 0L && kind > 813) + kind = 813; break; case 93: if (curChar != 47) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; default : break; @@ -10591,8 +10610,8 @@ else if (curChar == 91) jjCheckNAddTwoStates(30, 32); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if ((0x20000000200000L & l) != 0L) @@ -10613,8 +10632,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -10625,8 +10644,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -10637,8 +10656,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -10655,8 +10674,8 @@ else if (curChar == 93) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -10667,8 +10686,8 @@ else if (curChar == 93) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -10679,13 +10698,13 @@ else if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 85; else if ((0x1000000010L & l) != 0L) { - if (kind > 768) - kind = 768; + if (kind > 769) + kind = 769; } if ((0x10000000100000L & l) != 0L) { - if (kind > 769) - kind = 769; + if (kind > 770) + kind = 770; } break; case 63: @@ -10736,8 +10755,8 @@ else if ((0x1000000010L & l) != 0L) jjCheckNAddStates(28, 31); break; case 24: - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(25, 27); break; case 29: @@ -10757,21 +10776,21 @@ else if ((0x1000000010L & l) != 0L) jjstateSet[jjnewStateCnt++] = 31; break; case 33: - if (curChar == 93 && kind > 816) - kind = 816; + if (curChar == 93 && kind > 819) + kind = 819; break; case 34: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -10781,15 +10800,15 @@ else if ((0x1000000010L & l) != 0L) case 39: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(58, 59); break; case 41: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 41; break; case 46: @@ -10814,32 +10833,32 @@ else if ((0x1000000010L & l) != 0L) jjAddStates(48, 55); break; case 80: - if ((0x1000000010L & l) != 0L && kind > 768) - kind = 768; + if ((0x1000000010L & l) != 0L && kind > 769) + kind = 769; break; case 82: - if ((0x10000000100000L & l) != 0L && kind > 769) - kind = 769; + if ((0x10000000100000L & l) != 0L && kind > 770) + kind = 770; break; case 84: if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 85; break; case 85: - if ((0x8000000080000L & l) != 0L && kind > 770) - kind = 770; + if ((0x8000000080000L & l) != 0L && kind > 771) + kind = 771; break; case 87: if ((0x4000000040L & l) != 0L) jjstateSet[jjnewStateCnt++] = 88; break; case 88: - if ((0x400000004000L & l) != 0L && kind > 771) - kind = 771; + if ((0x400000004000L & l) != 0L && kind > 772) + kind = 772; break; case 91: - if (kind > 810) - kind = 810; + if (kind > 813) + kind = 813; break; default : break; } @@ -10859,8 +10878,8 @@ else if ((0x1000000010L & l) != 0L) case 0: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -10869,8 +10888,8 @@ else if ((0x1000000010L & l) != 0L) case 1: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -10881,8 +10900,8 @@ else if ((0x1000000010L & l) != 0L) case 97: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -10893,8 +10912,8 @@ else if ((0x1000000010L & l) != 0L) case 95: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -10910,8 +10929,8 @@ else if ((0x1000000010L & l) != 0L) case 66: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -10922,8 +10941,8 @@ else if ((0x1000000010L & l) != 0L) case 16: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -10958,22 +10977,22 @@ else if ((0x1000000010L & l) != 0L) case 24: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(25, 27); break; case 34: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -10983,15 +11002,15 @@ else if ((0x1000000010L & l) != 0L) case 39: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(58, 59); break; case 41: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 41; break; case 59: @@ -11007,8 +11026,8 @@ else if ((0x1000000010L & l) != 0L) jjAddStates(45, 47); break; case 91: - if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 810) - kind = 810; + if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 813) + kind = 813; break; default : break; } @@ -11052,7 +11071,7 @@ private final int jjMoveNfa_6(int startState, int curPos) { case 0: if (curChar == 47) - kind = 814; + kind = 817; break; case 1: if (curChar == 42) @@ -11106,203 +11125,203 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, switch (pos) { case 0: - if ((active2 & 0xfe00000000000000L) != 0L || (active3 & 0x7ffffL) != 0L || (active11 & 0x10000000L) != 0L) - { - jjmatchedKind = 821; - return 16; - } - if ((active12 & 0x10L) != 0L) + if ((active12 & 0x20L) != 0L) return 94; - if ((active12 & 0x20000000L) != 0L) + if ((active12 & 0x40000000L) != 0L) return 63; - if ((active5 & 0x7fffff000000000L) != 0L || (active11 & 0x200000000L) != 0L) + if ((active12 & 0x480002000000L) != 0L) + return 92; + if ((active5 & 0x7fffff000000000L) != 0L || (active11 & 0x400000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 95; } - if ((active12 & 0x90001000000L) != 0L) - return 92; - if ((active11 & 0x1000L) != 0L) + if ((active11 & 0x2000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 1; } - if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0x1ffffffffffffc0L) != 0L || (active3 & 0xff8001fffff80000L) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xf800000000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffc000001ffffffL) != 0L || (active11 & 0x4e55ef27efffL) != 0L) + if ((active2 & 0xfe00000000000000L) != 0L || (active3 & 0x7ffffL) != 0L || (active11 & 0x20000000L) != 0L) + { + jjmatchedKind = 824; + return 16; + } + if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x635001b00000L) != 0L || (active12 & 0x1000000000L) != 0L) + return 96; + if ((active12 & 0x20000400L) != 0L) + return 97; + if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0x1ffffffffffffc0L) != 0L || (active3 & 0xff8001fffff80000L) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xf800000000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfff8000001ffffffL) != 0L || (active11 & 0x9cabde4fdfffL) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 96; } - if ((active10 & 0x3fffffe000000L) != 0L) + if ((active10 & 0x7fffffe000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; return 66; } - if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x31a800d80000L) != 0L || (active12 & 0x200000000L) != 0L) - return 96; - if ((active12 & 0x10000200L) != 0L) - return 97; - if ((active12 & 0x600000L) != 0L) + if ((active12 & 0xc00000L) != 0L) return 23; return -1; case 1: - if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x3efd5feeffffL) != 0L) + if ((active12 & 0x480000000000L) != 0L) + return 90; + if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x820540220000L) != 0L) + return 96; + if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x7dfabfddffffL) != 0L) { if (jjmatchedPos != 1) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 1; } return 96; } - if ((active12 & 0x90000000000L) != 0L) - return 90; - if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x4102a0110000L) != 0L) - return 96; return -1; case 2: - if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0x57fffffeefffL) != 0L) + if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x500000002000L) != 0L) + return 96; + if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0xaffffffddfffL) != 0L) { if (jjmatchedPos != 2) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 2; } return 96; } - if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x280000001000L) != 0L) - return 96; return -1; case 3: - if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0xa0025f00010e0000L) != 0L || (active11 & 0x180100e3c7L) != 0L) - return 96; - if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0x5ffda0fffef1fffeL) != 0L || (active11 & 0x7fe7fefe0c38L) != 0L) + if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0xbffb41fffef1fffeL) != 0L || (active11 & 0xffcffdfc1870L) != 0L) { if (jjmatchedPos != 3) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 3; } return 96; } + if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0x4004be00010e0000L) != 0L || (active11 & 0x300201c78fL) != 0L) + return 96; if ((active2 & 0x8000000000000000L) != 0L) return 98; return -1; case 4: - if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x1da0a060001000L) != 0L || (active11 & 0x430022204809L) != 0L) - return 96; - if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0x5fe01e5f9ef5effeL) != 0L || (active11 & 0x3ce7ddde05b4L) != 0L) + if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0xbfc03cbf9ef5effeL) != 0L || (active11 & 0x79cfbbbc0b68L) != 0L) { if (jjmatchedPos != 4) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 4; } return 96; } + if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x3b414060001000L) != 0L || (active11 & 0x860044409012L) != 0L) + return 96; if ((active2 & 0x8000000000000000L) != 0L) return 98; return -1; case 5: - if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0x5ff01e071e75effeL) != 0L || (active11 & 0x3ce7dfee0514L) != 0L) + if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x1000a880800000L) != 0L || (active11 & 0x200140L) != 0L) + return 96; + if ((active2 & 0x8000000000000000L) != 0L) + return 98; + if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0xbfe03c171e75effeL) != 0L || (active11 & 0x79cfbfdc0a28L) != 0L) { if (jjmatchedPos != 5) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 5; } return 96; } - if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x8005880800000L) != 0L || (active11 & 0x1000a0L) != 0L) - return 96; - if ((active2 & 0x8000000000000000L) != 0L) - return 98; return -1; case 6: - if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x1f2000070241e000L) != 0L || (active11 & 0x18c100040500L) != 0L) + if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x3e4000070241e000L) != 0L || (active11 & 0x318200080a00L) != 0L) return 96; - if ((active2 & 0x8000000000000000L) != 0L) - return 98; - if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x40d01e001c340ffeL) != 0L || (active11 & 0x2426dffa0014L) != 0L) + if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x81a03c101c340ffeL) != 0L || (active11 & 0x484dbff40028L) != 0L) { if (jjmatchedPos != 6) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 6; } return 96; } - return -1; - case 7: - if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0x50000000300004L) != 0L || (active11 & 0x444020004L) != 0L) - return 96; if ((active2 & 0x8000000000000000L) != 0L) return 98; - if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0x50801e001c05cffaL) != 0L || (active11 & 0x24229bf80010L) != 0L) + return -1; + case 7: + if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0xa1003c001c05cffaL) != 0L || (active11 & 0x484537f00020L) != 0L) { if (jjmatchedPos != 7) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 7; } return 96; } + if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0xa0001000300004L) != 0L || (active11 & 0x888040008L) != 0L) + return 96; + if ((active2 & 0x8000000000000000L) != 0L) + return 98; return -1; case 8: - if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x10001e001805c87aL) != 0L || (active11 & 0x24208be80010L) != 0L) + if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x20003c001805c87aL) != 0L || (active11 & 0x484117d00020L) != 0L) { if (jjmatchedPos != 8) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 8; } return 96; } - if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x4080000004000780L) != 0L || (active11 & 0x210100000L) != 0L) + if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x8100000004000780L) != 0L || (active11 & 0x420200000L) != 0L) return 96; return -1; case 9: - if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x1e001801cc7aL) != 0L || (active11 & 0x200081680010L) != 0L) + if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x2000000000040100L) != 0L || (active11 & 0x84015000000L) != 0L) + return 96; + if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x3c001801cc7aL) != 0L || (active11 & 0x400102d00020L) != 0L) { if (jjmatchedPos != 9) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 9; } return 96; } - if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x1000000000040100L) != 0L || (active11 & 0x4200a800000L) != 0L) - return 96; return -1; case 10: - if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x81400000L) != 0L) + if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x102800000L) != 0L) return 96; - if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x1e001001c402L) != 0L || (active11 & 0x200000280010L) != 0L) + if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x3c001001c402L) != 0L || (active11 & 0x400000500020L) != 0L) { if (jjmatchedPos != 10) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 10; } return 96; } return -1; case 11: - if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x1e0010014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x3c0010014472L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 11) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 11; } return 96; } - if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x80010L) != 0L) + if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x100020L) != 0L) return 96; return -1; case 12: - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x1e0000014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x3c0000014472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 12; return 96; } @@ -11312,9 +11331,9 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, case 13: if ((active1 & 0x4000000000200000L) != 0L || (active2 & 0x8000L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x10000L) != 0L || (active6 & 0x8000003000000L) != 0L || (active7 & 0x4000400000008000L) != 0L || (active9 & 0x800000000024000L) != 0L || (active10 & 0x10000L) != 0L) return 96; - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x1e0000004472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x3c0000004472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 13; return 96; } @@ -11322,19 +11341,19 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, case 14: if ((active0 & 0x20000000000L) != 0L || (active1 & 0x100084800000200L) != 0L || (active5 & 0x280L) != 0L || (active6 & 0x30000000000L) != 0L || (active7 & 0x100100000000L) != 0L || (active8 & 0x8000000000000000L) != 0L || (active9 & 0x5000004200010000L) != 0L || (active10 & 0x4402L) != 0L) return 96; - if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 14; return 96; } return -1; case 15: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 15) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 15; } return 96; @@ -11343,11 +11362,11 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, return 96; return -1; case 16: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 16) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 16; } return 96; @@ -11358,9 +11377,9 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, case 17: if ((active1 & 0x2000000080L) != 0L || (active8 & 0x400000000000000L) != 0L) return 96; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 17; return 96; } @@ -11368,20 +11387,20 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, case 18: if ((active8 & 0xb00000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x10L) != 0L) return 96; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 18) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 18; } return 96; } return -1; case 19: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 19; return 96; } @@ -11391,27 +11410,27 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, case 20: if ((active0 & 0x1000000L) != 0L || (active1 & 0x8000040L) != 0L || (active2 & 0x100000000000000L) != 0L || (active7 & 0x200000000L) != 0L) return 96; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 20; return 96; } return -1; case 21: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 21; return 96; } - if ((active2 & 0x2000L) != 0L || (active10 & 0xc0000000020L) != 0L) + if ((active2 & 0x2000L) != 0L || (active10 & 0x180000000020L) != 0L) return 96; return -1; case 22: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 22; return 96; } @@ -11419,39 +11438,39 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, return 96; return -1; case 23: - if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x100000000040L) != 0L) + if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x200000000040L) != 0L) return 96; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x20000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x40000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 23; return 96; } return -1; case 24: - if ((active6 & 0x20000000L) != 0L || (active10 & 0x20000000000L) != 0L) + if ((active6 & 0x20000000L) != 0L || (active10 & 0x40000000000L) != 0L) return 96; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 24; return 96; } return -1; case 25: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 25; return 96; } - if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x200000L) != 0L) + if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x400000L) != 0L) return 96; return -1; case 26: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 26; return 96; } @@ -11459,9 +11478,9 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, return 96; return -1; case 27: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 27; return 96; } @@ -11469,17 +11488,17 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, case 28: if ((active8 & 0x200000000000000L) != 0L) return 96; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 28; return 96; } return -1; case 29: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 29; return 96; } @@ -11487,17 +11506,17 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, case 30: if ((active1 & 0x400000000000000L) != 0L) return 96; - if ((active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 30; return 96; } return -1; case 31: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 31; return 96; } @@ -11505,9 +11524,9 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1, return 96; return -1; case 32: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 32; return 96; } @@ -11534,74 +11553,76 @@ private final int jjMoveStringLiteralDfa0_2() { case 33: jjmatchedKind = 1; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000L); case 34: - return jjStopAtPos(0, 798); + return jjStopAtPos(0, 799); case 36: - return jjStartNfaWithStates_2(0, 801, 96); + return jjStartNfaWithStates_2(0, 804, 96); case 37: - return jjStopAtPos(0, 793); + return jjStopAtPos(0, 794); + case 38: + return jjStopAtPos(0, 802); case 39: - return jjStartNfaWithStates_2(0, 797, 63); + return jjStartNfaWithStates_2(0, 798, 63); case 40: - return jjStopAtPos(0, 766); - case 41: return jjStopAtPos(0, 767); + case 41: + return jjStopAtPos(0, 768); case 42: - jjmatchedKind = 791; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000000L); + jjmatchedKind = 792; + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000000L); case 43: - return jjStopAtPos(0, 788); + return jjStopAtPos(0, 789); case 44: - return jjStopAtPos(0, 778); + return jjStopAtPos(0, 779); case 45: - jjmatchedKind = 789; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000L); + jjmatchedKind = 790; + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000L); case 46: - jjmatchedKind = 777; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + jjmatchedKind = 778; + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L); case 47: - jjmatchedKind = 792; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x90000000000L); + jjmatchedKind = 793; + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x480000000000L); case 58: - jjmatchedKind = 783; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L); + jjmatchedKind = 784; + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000000L); case 59: - return jjStopAtPos(0, 776); + return jjStopAtPos(0, 777); case 60: - jjmatchedKind = 781; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x50000L); + jjmatchedKind = 782; + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000a0000L); case 61: - jjmatchedKind = 779; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); - case 62: jjmatchedKind = 780; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + case 62: + jjmatchedKind = 781; + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L); case 63: - return jjStopAtPos(0, 782); + return jjStopAtPos(0, 783); case 91: - return jjStopAtPos(0, 774); - case 93: return jjStopAtPos(0, 775); + case 93: + return jjStopAtPos(0, 776); case 94: - return jjStopAtPos(0, 800); + return jjStopAtPos(0, 801); case 65: case 97: jjmatchedKind = 3; - return jjMoveStringLiteralDfa1_2(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x110000180000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x220000300000L, 0x0L); case 66: case 98: - return jjMoveStringLiteralDfa1_2(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L, 0x0L); case 67: case 99: jjmatchedKind = 52; - return jjMoveStringLiteralDfa1_2(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa000c00000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x14001800000L, 0x0L); case 68: case 100: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000L, 0x0L); case 69: case 101: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L, 0x0L); case 70: case 102: return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x1fffff80000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); @@ -11614,67 +11635,67 @@ private final int jjMoveStringLiteralDfa0_2() return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x1f80000000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 73: case 105: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa0010000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x140020000L, 0x0L); case 74: case 106: return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0xffe0000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 75: case 107: jjmatchedKind = 296; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000000L, 0x0L); case 76: case 108: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); case 77: case 109: jjmatchedKind = 322; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x200000000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x400000000000L, 0x0L); case 78: case 110: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L, 0x0L); case 79: case 111: return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xf800000000000000L, 0x3fffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 80: case 112: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x440000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x880000000L, 0x0L); case 81: case 113: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x20000000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x40000000000L, 0x0L); case 82: case 114: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x80000000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x100000000000L, 0x0L); case 83: case 115: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x45000000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x8a000000000L, 0x0L); case 84: case 116: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x400000020000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x800000040000L, 0x0L); case 85: case 117: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3fffffe000000L, 0x0L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffffe000000L, 0x0L, 0x0L); case 86: case 118: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3ffc000000000000L, 0x2000000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7ff8000000000000L, 0x4000000L, 0x0L); case 87: case 119: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000000000000000L, 0xc200fffL, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000000000000L, 0x18401fffL, 0x0L); case 88: case 120: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000L, 0x0L); case 89: case 121: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x6000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000L, 0x0L); case 90: case 122: - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000L, 0x0L); + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000L, 0x0L); case 123: - return jjStartNfaWithStates_2(0, 772, 94); + return jjStartNfaWithStates_2(0, 773, 94); case 124: - jjmatchedKind = 799; - return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x4000000L); + jjmatchedKind = 800; + return jjMoveStringLiteralDfa1_2(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); case 125: - return jjStopAtPos(0, 773); + return jjStopAtPos(0, 774); case 126: return jjStopAtPos(0, 2); default : @@ -11691,55 +11712,59 @@ private final int jjMoveStringLiteralDfa1_2(long active0, long active1, long act switch(curChar) { case 42: - if ((active12 & 0x80000000000L) != 0L) + if ((active12 & 0x400000000000L) != 0L) { - jjmatchedKind = 811; + jjmatchedKind = 814; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x10000000000L); + return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x80000000000L); case 46: - if ((active12 & 0x10000000L) != 0L) - return jjStopAtPos(1, 796); + if ((active12 & 0x20000000L) != 0L) + return jjStopAtPos(1, 797); break; case 47: - if ((active12 & 0x20000000000L) != 0L) - return jjStopAtPos(1, 809); + if ((active12 & 0x100000000000L) != 0L) + return jjStopAtPos(1, 812); break; case 58: - if ((active12 & 0x400000000L) != 0L) - return jjStopAtPos(1, 802); + if ((active12 & 0x2000000000L) != 0L) + return jjStopAtPos(1, 805); + break; + case 60: + if ((active12 & 0x800000000L) != 0L) + return jjStopAtPos(1, 803); break; case 61: - if ((active12 & 0x10000L) != 0L) - return jjStopAtPos(1, 784); - else if ((active12 & 0x20000L) != 0L) + if ((active12 & 0x20000L) != 0L) return jjStopAtPos(1, 785); - else if ((active12 & 0x80000L) != 0L) - return jjStopAtPos(1, 787); + else if ((active12 & 0x40000L) != 0L) + return jjStopAtPos(1, 786); + else if ((active12 & 0x100000L) != 0L) + return jjStopAtPos(1, 788); break; case 62: - if ((active12 & 0x40000L) != 0L) - return jjStopAtPos(1, 786); - else if ((active12 & 0x400000L) != 0L) - return jjStopAtPos(1, 790); - else if ((active12 & 0x8000000L) != 0L) - return jjStopAtPos(1, 795); + if ((active12 & 0x80000L) != 0L) + return jjStopAtPos(1, 787); + else if ((active12 & 0x800000L) != 0L) + return jjStopAtPos(1, 791); + else if ((active12 & 0x10000000L) != 0L) + return jjStopAtPos(1, 796); break; case 65: case 97: - return jjMoveStringLiteralDfa2_2(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0x7fc000000000000L, active11, 0x200443c40000L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0xff8000000000000L, active11, 0x400887880000L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa2_2(active0, 0x70L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 67: case 99: - return jjMoveStringLiteralDfa2_2(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x1000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x2000000000L, active12, 0L); case 68: case 100: return jjMoveStringLiteralDfa2_2(active0, 0x700L, active1, 0L, active2, 0L, active3, 0x2000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 69: case 101: - return jjMoveStringLiteralDfa2_2(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xd800000002000000L, active11, 0x84000026001L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xb000000002000000L, active11, 0x10800004c003L, active12, 0L); case 70: case 102: if ((active5 & 0x8000000000000000L) != 0L) @@ -11747,18 +11772,18 @@ else if ((active12 & 0x8000000L) != 0L) jjmatchedKind = 383; jjmatchedPos = 1; } - else if ((active11 & 0x10000L) != 0L) - return jjStartNfaWithStates_2(1, 720, 96); - return jjMoveStringLiteralDfa2_2(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000L, active12, 0L); + else if ((active11 & 0x20000L) != 0L) + return jjStartNfaWithStates_2(1, 721, 96); + return jjMoveStringLiteralDfa2_2(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); case 71: case 103: return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 72: case 104: - return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0xeL, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0x1cL, active12, 0L); case 73: case 105: - return jjMoveStringLiteralDfa2_2(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x2000000000000000L, active11, 0x8000001f0L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x4000000000000000L, active11, 0x10000003e0L, active12, 0L); case 75: case 107: return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -11767,7 +11792,7 @@ else if ((active11 & 0x10000L) != 0L) return jjMoveStringLiteralDfa2_2(active0, 0x80000001f000L, active1, 0xf000L, active2, 0xc00000000000000L, active3, 0x8000400006000000L, active4, 0L, active5, 0L, active6, 0x1c00000000002L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 77: case 109: - return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x1000L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x2000L, active12, 0L); case 78: case 110: if ((active4 & 0x10L) != 0L) @@ -11782,7 +11807,7 @@ else if ((active6 & 0x8L) != 0L) jjmatchedKind = 387; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_2(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0xffc000000L, active11, 0x1000b0000000L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1ffc000000L, active11, 0x200160000000L, active12, 0L); case 79: case 111: if ((active3 & 0x800000000000L) != 0L) @@ -11800,10 +11825,10 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 640; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_2(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x40a300008200L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x814600010400L, active12, 0L); case 80: case 112: - return jjMoveStringLiteralDfa2_2(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0x7000000000L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0xe000000000L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x8L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xfffffffe00000000L, active9, 0x7fffffL, active10, 0L, active11, 0L, active12, 0L); @@ -11814,7 +11839,7 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 393; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_2(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0xc200c00L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0x18401800L, active12, 0L); case 83: case 115: if ((active0 & 0x2000000L) != 0L) @@ -11827,7 +11852,7 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 281; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_2(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3f8000000000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x7f0000000000L, active11, 0x20000000000L, active12, 0L); case 84: case 116: if ((active0 & 0x100000000L) != 0L) @@ -11835,10 +11860,10 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 32; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_2(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x1c00000000000L, active11, 0x40000100000L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x3800000000000L, active11, 0x80000200000L, active12, 0L); case 85: case 117: - return jjMoveStringLiteralDfa2_2(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x2000000c00000L, active11, 0x20000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_2(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x4000000c00000L, active11, 0x40000000000L, active12, 0L); case 86: case 118: return jjMoveStringLiteralDfa2_2(active0, 0x2000000000L, active1, 0L, active2, 0L, active3, 0x40L, active4, 0L, active5, 0L, active6, 0x3c0000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -11851,8 +11876,8 @@ else if ((active4 & 0x2000000L) != 0L) return jjStartNfaWithStates_2(1, 51, 96); return jjMoveStringLiteralDfa2_2(active0, 0L, active1, 0L, active2, 0x1c0000000000020L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x3c0000000000L, active10, 0x1000000L, active11, 0L, active12, 0L); case 124: - if ((active12 & 0x4000000L) != 0L) - return jjStopAtPos(1, 794); + if ((active12 & 0x8000000L) != 0L) + return jjStopAtPos(1, 795); break; default : break; @@ -11871,14 +11896,14 @@ private final int jjMoveStringLiteralDfa2_2(long old0, long active0, long old1, switch(curChar) { case 43: - if ((active12 & 0x10000000000L) != 0L) - return jjStopAtPos(2, 808); + if ((active12 & 0x80000000000L) != 0L) + return jjStopAtPos(2, 811); break; case 65: case 97: if ((active0 & 0x100L) != 0L) return jjStartNfaWithStates_2(2, 8, 96); - return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x8000000ffcL, active11, 0x14100c006400L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x10000000ffcL, active11, 0x28201800c800L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0x20000000020000L, active2, 0L, active3, 0L, active4, 0x100100000000000L, active5, 0L, active6, 0x8000000000000000L, active7, 0L, active8, 0L, active9, 0x1c07e00000000L, active10, 0x4000000L, active11, 0L, active12, 0L); @@ -11891,7 +11916,7 @@ else if ((active2 & 0x200000L) != 0L) jjmatchedKind = 149; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x10c40000L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x21880000L, active12, 0L); case 68: case 100: if ((active0 & 0x200L) != 0L) @@ -11912,14 +11937,14 @@ else if ((active6 & 0x2L) != 0L) return jjStartNfaWithStates_2(2, 385, 96); else if ((active6 & 0x400000L) != 0L) return jjStartNfaWithStates_2(2, 406, 96); - return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x4000001020000000L, active11, 0x20000010L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x8000002020000000L, active11, 0x40000020L, active12, 0L); case 69: case 101: if ((active0 & 0x100000L) != 0L) return jjStartNfaWithStates_2(2, 20, 96); else if ((active6 & 0x10L) != 0L) return jjStartNfaWithStates_2(2, 388, 96); - return jjMoveStringLiteralDfa3_2(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0xa0001f0000401000L, active11, 0x2000000000fL, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0x40003e0000401000L, active11, 0x4000000001fL, active12, 0L); case 70: case 102: if ((active7 & 0x200L) != 0L) @@ -11927,14 +11952,14 @@ else if ((active6 & 0x10L) != 0L) jjmatchedKind = 457; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_2(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x1c00000000000L, active11, 0x80000080000L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x3800000000000L, active11, 0x100000100000L, active12, 0L); case 71: case 103: if ((active0 & 0x2000000000L) != 0L) return jjStartNfaWithStates_2(2, 37, 96); else if ((active4 & 0x200000000000L) != 0L) return jjStartNfaWithStates_2(2, 301, 96); - return jjMoveStringLiteralDfa3_2(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000L, active12, 0L); case 72: case 104: return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x8020000000000L, active6, 0x4000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -11942,7 +11967,7 @@ else if ((active4 & 0x200000000000L) != 0L) case 105: if ((active6 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_2(2, 432, 96); - return jjMoveStringLiteralDfa3_2(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x22000c007e000L, active11, 0x200800L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x44000c007e000L, active11, 0x401000L, active12, 0L); case 74: case 106: return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -11961,14 +11986,14 @@ else if ((active8 & 0x200000000L) != 0L) jjmatchedKind = 545; jjmatchedPos = 2; } - else if ((active11 & 0x1000L) != 0L) - return jjStartNfaWithStates_2(2, 716, 96); - return jjMoveStringLiteralDfa3_2(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x1c000000000000L, active11, 0xa82000000L, active12, 0L); + else if ((active11 & 0x2000L) != 0L) + return jjStartNfaWithStates_2(2, 717, 96); + return jjMoveStringLiteralDfa3_2(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x38000000000000L, active11, 0x1504000000L, active12, 0L); case 77: case 109: if ((active9 & 0x10000000000L) != 0L) return jjStartNfaWithStates_2(2, 616, 96); - return jjMoveStringLiteralDfa3_2(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x8000020000L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x10000040000L, active12, 0L); case 78: case 110: if ((active5 & 0x800000L) != 0L) @@ -11976,10 +12001,10 @@ else if ((active11 & 0x1000L) != 0L) jjmatchedKind = 343; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_2(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x2000008020L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x4000010040L, active12, 0L); case 79: case 111: - return jjMoveStringLiteralDfa3_2(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x200000L, active12, 0L); case 80: case 112: if ((active3 & 0x4000L) != 0L) @@ -11991,7 +12016,7 @@ else if ((active3 & 0x400000000000000L) != 0L) return jjStartNfaWithStates_2(2, 250, 96); else if ((active5 & 0x8L) != 0L) return jjStartNfaWithStates_2(2, 323, 96); - return jjMoveStringLiteralDfa3_2(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x2201000002L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x4201000002L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -12007,7 +12032,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 422; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_2(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x1fe0000000000000L, active11, 0x4040000200L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x3fc0000000000000L, active11, 0x8080000400L, active12, 0L); case 83: case 115: if ((active0 & 0x10L) != 0L) @@ -12015,7 +12040,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 4; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_2(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x4002000000L, active11, 0x400000000L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x9002000000L, active11, 0x800000000L, active12, 0L); case 84: case 116: if ((active0 & 0x400000000000L) != 0L) @@ -12041,7 +12066,7 @@ else if ((active8 & 0x40000L) != 0L) jjmatchedKind = 530; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_2(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x4000010001c0L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x800002000380L, active12, 0L); case 85: case 117: return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0x1000000000000L, active2, 0x4000000000000L, active3, 0x1800000100000008L, active4, 0L, active5, 0L, active6, 0L, active7, 0x780000000000L, active8, 0x10000000L, active9, 0x8000000000000L, active10, 0x180000L, active11, 0L, active12, 0L); @@ -12067,7 +12092,7 @@ else if ((active7 & 0x800000000000L) != 0L) jjmatchedKind = 330; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L, active12, 0L); case 89: case 121: if ((active0 & 0x40000L) != 0L) @@ -12084,7 +12109,7 @@ else if ((active4 & 0x20000000000L) != 0L) jjmatchedKind = 297; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_2(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_2(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x20000000000L, active12, 0L); case 90: case 122: return jjMoveStringLiteralDfa3_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -12107,15 +12132,15 @@ private final int jjMoveStringLiteralDfa3_2(long old0, long active0, long old1, case 45: return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 49: - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x800000000000L, active11, 0L); - case 51: return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1000000000000L, active11, 0L); + case 51: + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000000000L, active11, 0L); case 56: - if ((active10 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_2(3, 686, 96); + if ((active10 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_2(3, 687, 96); break; case 95: - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0x60000000200002L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0xc0000000200002L, active11, 0x400000000000L); case 65: case 97: if ((active2 & 0x40L) != 0L) @@ -12125,14 +12150,14 @@ private final int jjMoveStringLiteralDfa3_2(long old0, long active0, long old1, } else if ((active4 & 0x20000000L) != 0L) return jjStartNfaWithStates_2(3, 285, 96); - return jjMoveStringLiteralDfa4_2(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x1400001000L, active11, 0x400041000000L); + return jjMoveStringLiteralDfa4_2(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x2400001000L, active11, 0x800082000000L); case 66: case 98: if ((active0 & 0x800000000000L) != 0L) return jjStartNfaWithStates_2(3, 47, 96); else if ((active1 & 0x4000L) != 0L) return jjStartNfaWithStates_2(3, 78, 96); - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000800000L, active11, 0L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000800000L, active11, 0L); case 67: case 99: if ((active2 & 0x4000000000L) != 0L) @@ -12145,7 +12170,7 @@ else if ((active3 & 0x800L) != 0L) jjmatchedKind = 203; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_2(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x100000002000000L, active11, 0L); + return jjMoveStringLiteralDfa4_2(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x200000002000000L, active11, 0L); case 68: case 100: if ((active3 & 0x200000000000000L) != 0L) @@ -12160,9 +12185,9 @@ else if ((active7 & 0x20L) != 0L) jjmatchedKind = 453; jjmatchedPos = 3; } - else if ((active10 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_2(3, 689, 96); - return jjMoveStringLiteralDfa4_2(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x20L); + else if ((active10 & 0x4000000000000L) != 0L) + return jjStartNfaWithStates_2(3, 690, 96); + return jjMoveStringLiteralDfa4_2(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x40L); case 69: case 101: if ((active0 & 0x400000000000000L) != 0L) @@ -12207,9 +12232,9 @@ else if ((active10 & 0x80000L) != 0L) return jjStartNfaWithStates_2(3, 659, 96); else if ((active10 & 0x1000000L) != 0L) return jjStartNfaWithStates_2(3, 664, 96); - else if ((active11 & 0x8000L) != 0L) - return jjStartNfaWithStates_2(3, 719, 96); - return jjMoveStringLiteralDfa4_2(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0x6820000000L, active11, 0x20000000L); + else if ((active11 & 0x10000L) != 0L) + return jjStartNfaWithStates_2(3, 720, 96); + return jjMoveStringLiteralDfa4_2(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0xc820000000L, active11, 0x40000000L); case 70: case 102: if ((active0 & 0x4000000L) != 0L) @@ -12219,7 +12244,7 @@ else if ((active8 & 0x200L) != 0L) break; case 71: case 103: - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x800001e000L, active11, 0x100000000L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x1000001e000L, active11, 0x200000000L); case 72: case 104: if ((active0 & 0x2000000000000L) != 0L) @@ -12228,29 +12253,29 @@ else if ((active2 & 0x200000000000000L) != 0L) return jjStartNfaWithStates_2(3, 185, 96); else if ((active6 & 0x1000000000L) != 0L) return jjStartNfaWithStates_2(3, 420, 96); - else if ((active11 & 0x40L) != 0L) + else if ((active11 & 0x80L) != 0L) { - jjmatchedKind = 710; + jjmatchedKind = 711; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_2(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0xc00180L); + return jjMoveStringLiteralDfa4_2(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x1800300L); case 73: case 105: - return jjMoveStringLiteralDfa4_2(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x200000200000004L, active11, 0x80080000L); + return jjMoveStringLiteralDfa4_2(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x400001200000004L, active11, 0x100100000L); case 75: case 107: if ((active7 & 0x10L) != 0L) return jjStartNfaWithStates_2(3, 452, 96); else if ((active8 & 0x80L) != 0L) return jjStartNfaWithStates_2(3, 519, 96); - else if ((active10 & 0x8000000000000000L) != 0L) + else if ((active11 & 0x1L) != 0L) { - jjmatchedKind = 703; + jjmatchedKind = 704; jjmatchedPos = 3; } - else if ((active11 & 0x200L) != 0L) - return jjStartNfaWithStates_2(3, 713, 96); - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x40001L); + else if ((active11 & 0x400L) != 0L) + return jjStartNfaWithStates_2(3, 714, 96); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80002L); case 76: case 108: if ((active0 & 0x20000000000000L) != 0L) @@ -12272,9 +12297,9 @@ else if ((active5 & 0x20000000000000L) != 0L) } else if ((active7 & 0x80L) != 0L) return jjStartNfaWithStates_2(3, 455, 96); - else if ((active11 & 0x800000000L) != 0L) - return jjStartNfaWithStates_2(3, 739, 96); - return jjMoveStringLiteralDfa4_2(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x100000000000L); + else if ((active11 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_2(3, 740, 96); + return jjMoveStringLiteralDfa4_2(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x200000000000L); case 77: case 109: if ((active3 & 0x2000000000L) != 0L) @@ -12284,7 +12309,7 @@ else if ((active10 & 0x20000L) != 0L) jjmatchedKind = 657; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_2(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x100000L); + return jjMoveStringLiteralDfa4_2(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x200000L); case 78: case 110: if ((active4 & 0x40000000L) != 0L) @@ -12300,28 +12325,28 @@ else if ((active6 & 0x800000000000L) != 0L) return jjStartNfaWithStates_2(3, 431, 96); else if ((active9 & 0x4000000000000L) != 0L) return jjStartNfaWithStates_2(3, 626, 96); - else if ((active11 & 0x2L) != 0L) + else if ((active11 & 0x4L) != 0L) { - jjmatchedKind = 705; + jjmatchedKind = 706; jjmatchedPos = 3; } - else if ((active11 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_2(3, 740, 96); - return jjMoveStringLiteralDfa4_2(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x4000200100100ff8L, active11, 0x10000000004L); + else if ((active11 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_2(3, 741, 96); + return jjMoveStringLiteralDfa4_2(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x8000400100100ff8L, active11, 0x20000000008L); case 79: case 111: if ((active3 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_2(3, 240, 96); else if ((active4 & 0x800000L) != 0L) return jjStartNfaWithStates_2(3, 279, 96); - return jjMoveStringLiteralDfa4_2(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x200000000L); + return jjMoveStringLiteralDfa4_2(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x400000000L); case 80: case 112: if ((active2 & 0x20000000000000L) != 0L) return jjStartNfaWithStates_2(3, 181, 96); else if ((active8 & 0x2000000L) != 0L) return jjStartNfaWithStates_2(3, 537, 96); - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x800c020400L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x10018040800L); case 81: case 113: return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000L, active11, 0L); @@ -12347,17 +12372,17 @@ else if ((active6 & 0x40000L) != 0L) jjmatchedKind = 402; jjmatchedPos = 3; } - else if ((active10 & 0x10000000000L) != 0L) + else if ((active10 & 0x20000000000L) != 0L) { - jjmatchedKind = 680; + jjmatchedKind = 681; jjmatchedPos = 3; } - else if ((active11 & 0x2000L) != 0L) + else if ((active11 & 0x4000L) != 0L) { - jjmatchedKind = 717; + jjmatchedKind = 718; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_2(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x1e0000000000L, active11, 0xa0010004008L); + return jjMoveStringLiteralDfa4_2(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x3c0000000000L, active11, 0x140020008010L); case 83: case 115: if ((active2 & 0x80000L) != 0L) @@ -12368,7 +12393,7 @@ else if ((active8 & 0x80000L) != 0L) return jjStartNfaWithStates_2(3, 531, 96); else if ((active9 & 0x10000000000000L) != 0L) return jjStartNfaWithStates_2(3, 628, 96); - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x1800000000400000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x3000000000400000L, active11, 0x800000000L); case 84: case 116: if ((active0 & 0x800000000000000L) != 0L) @@ -12388,27 +12413,27 @@ else if ((active6 & 0x800000000L) != 0L) return jjStartNfaWithStates_2(3, 419, 96); else if ((active9 & 0x400000L) != 0L) return jjStartNfaWithStates_2(3, 598, 96); - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x42000200810L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x84000401020L); case 85: case 117: - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x1c000000000000L, active11, 0x2000000L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x38000000000000L, active11, 0x4000000L); case 86: case 118: if ((active6 & 0x400000000000000L) != 0L) return jjStartNfaWithStates_2(3, 442, 96); - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x4000000000L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x8000000000L); case 87: case 119: if ((active8 & 0x200000L) != 0L) return jjStartNfaWithStates_2(3, 533, 96); - else if ((active10 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_2(3, 701, 96); + else if ((active10 & 0x4000000000000000L) != 0L) + return jjStartNfaWithStates_2(3, 702, 96); return jjMoveStringLiteralDfa4_2(active0, 0x80000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: if ((active6 & 0x20L) != 0L) return jjStartNfaWithStates_2(3, 389, 96); - return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x400000000000000L, active11, 0L); + return jjMoveStringLiteralDfa4_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x800000000000000L, active11, 0L); default : break; } @@ -12426,18 +12451,18 @@ private final int jjMoveStringLiteralDfa4_2(long old0, long active0, long old1, switch(curChar) { case 50: - if ((active10 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_2(4, 688, 96); + if ((active10 & 0x2000000000000L) != 0L) + return jjStartNfaWithStates_2(4, 689, 96); break; case 54: - if ((active10 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_2(4, 687, 96); + if ((active10 & 0x1000000000000L) != 0L) + return jjStartNfaWithStates_2(4, 688, 96); break; case 95: - return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x1e0000040000L, active11, 0xd000000L); + return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x3c0000040000L, active11, 0x1a000000L); case 65: case 97: - return jjMoveStringLiteralDfa5_2(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x200000002000000L, active11, 0L); + return jjMoveStringLiteralDfa5_2(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x400000002000000L, active11, 0L); case 66: case 98: if ((active5 & 0x40000000000L) != 0L) @@ -12445,9 +12470,9 @@ private final int jjMoveStringLiteralDfa4_2(long old0, long active0, long old1, return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0x80L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000L, active8, 0x3e000000000L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - if ((active11 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_2(4, 744, 96); - return jjMoveStringLiteralDfa5_2(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x200000000000L); + if ((active11 & 0x20000000000L) != 0L) + return jjStartNfaWithStates_2(4, 745, 96); + return jjMoveStringLiteralDfa5_2(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x400000000000L); case 68: case 100: if ((active3 & 0x100000000L) != 0L) @@ -12494,21 +12519,21 @@ else if ((active9 & 0x400000000000L) != 0L) jjmatchedKind = 622; jjmatchedPos = 4; } - else if ((active10 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_2(4, 679, 96); - else if ((active10 & 0x4000000000000L) != 0L) + else if ((active10 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_2(4, 680, 96); + else if ((active10 & 0x8000000000000L) != 0L) { - jjmatchedKind = 690; + jjmatchedKind = 691; jjmatchedPos = 4; } - else if ((active11 & 0x8L) != 0L) - return jjStartNfaWithStates_2(4, 707, 96); - else if ((active11 & 0x800L) != 0L) + else if ((active11 & 0x10L) != 0L) + return jjStartNfaWithStates_2(4, 708, 96); + else if ((active11 & 0x1000L) != 0L) { - jjmatchedKind = 715; + jjmatchedKind = 716; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_2(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x4018000000000000L, active11, 0x80002e00004L); + return jjMoveStringLiteralDfa5_2(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x8030000000000000L, active11, 0x100005c00008L); case 70: case 102: if ((active2 & 0x1000000000L) != 0L) @@ -12516,9 +12541,9 @@ else if ((active11 & 0x800L) != 0L) return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0x60000L, active3, 0x1L, active4, 0L, active5, 0x10000000L, active6, 0L, active7, 0L, active8, 0x800000000000L, active9, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_2(4, 685, 96); - return jjMoveStringLiteralDfa5_2(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e000L, active11, 0x200000000L); + if ((active10 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_2(4, 686, 96); + return jjMoveStringLiteralDfa5_2(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100001e000L, active11, 0x400000000L); case 72: case 104: if ((active2 & 0x800000000L) != 0L) @@ -12537,10 +12562,10 @@ else if ((active5 & 0x80000000L) != 0L) jjmatchedKind = 351; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000000L, active11, 0x10L); + return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000000L, active11, 0x20L); case 73: case 105: - return jjMoveStringLiteralDfa5_2(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x1c80000000000000L, active11, 0x46100100080L); + return jjMoveStringLiteralDfa5_2(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x3900000000000000L, active11, 0x8c200200100L); case 75: case 107: if ((active1 & 0x800L) != 0L) @@ -12561,9 +12586,9 @@ else if ((active4 & 0x2000000000000000L) != 0L) jjmatchedKind = 317; jjmatchedPos = 4; } - else if ((active11 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_2(4, 750, 96); - return jjMoveStringLiteralDfa5_2(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x40020000L); + else if ((active11 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_2(4, 751, 96); + return jjMoveStringLiteralDfa5_2(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x80040000L); case 77: case 109: return jjMoveStringLiteralDfa5_2(active0, 0x80000000L, active1, 0x3000000L, active2, 0x1c0000000800000L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0x3f800000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0x408000000L, active11, 0L); @@ -12580,10 +12605,10 @@ else if ((active1 & 0x2L) != 0L) return jjStartNfaWithStates_2(4, 65, 96); else if ((active10 & 0x40000000L) != 0L) return jjStartNfaWithStates_2(4, 670, 96); - return jjMoveStringLiteralDfa5_2(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x80080000L); + return jjMoveStringLiteralDfa5_2(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x100100000L); case 79: case 111: - return jjMoveStringLiteralDfa5_2(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x120L); + return jjMoveStringLiteralDfa5_2(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x240L); case 80: case 112: if ((active3 & 0x8000000000000L) != 0L) @@ -12591,7 +12616,7 @@ else if ((active10 & 0x40000000L) != 0L) jjmatchedKind = 243; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x20000000000000L, active11, 0x400L); + return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x40000000000000L, active11, 0x800L); case 82: case 114: if ((active0 & 0x800L) != 0L) @@ -12621,9 +12646,9 @@ else if ((active6 & 0x1000000000000000L) != 0L) return jjStartNfaWithStates_2(4, 444, 96); else if ((active10 & 0x20000000L) != 0L) return jjStartNfaWithStates_2(4, 669, 96); - else if ((active10 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_2(4, 677, 96); - return jjMoveStringLiteralDfa5_2(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x4000000000L, active11, 0L); + else if ((active10 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_2(4, 678, 96); + return jjMoveStringLiteralDfa5_2(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x8000000000L, active11, 0L); case 83: case 115: if ((active1 & 0x10000000000000L) != 0L) @@ -12640,11 +12665,11 @@ else if ((active7 & 0x40L) != 0L) return jjStartNfaWithStates_2(4, 454, 96); else if ((active8 & 0x100000L) != 0L) return jjStartNfaWithStates_2(4, 532, 96); - else if ((active11 & 0x1L) != 0L) - return jjStartNfaWithStates_2(4, 704, 96); - else if ((active11 & 0x4000L) != 0L) - return jjStartNfaWithStates_2(4, 718, 96); - return jjMoveStringLiteralDfa5_2(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x40000800000ff8L, active11, 0L); + else if ((active11 & 0x2L) != 0L) + return jjStartNfaWithStates_2(4, 705, 96); + else if ((active11 & 0x8000L) != 0L) + return jjStartNfaWithStates_2(4, 719, 96); + return jjMoveStringLiteralDfa5_2(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x80000800000ff8L, active11, 0L); case 84: case 116: if ((active1 & 0x1000000000000L) != 0L) @@ -12677,10 +12702,10 @@ else if ((active9 & 0x800000L) != 0L) return jjStartNfaWithStates_2(4, 599, 96); else if ((active10 & 0x1000L) != 0L) return jjStartNfaWithStates_2(4, 652, 96); - return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x1000000000L, active11, 0L); + return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x2000000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x8000040000L); + return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x10000080000L); case 86: case 118: return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0x2000000000L, active3, 0L, active4, 0L, active5, 0x8000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x300000L, active10, 0x200000000L, active11, 0L); @@ -12688,11 +12713,11 @@ else if ((active10 & 0x1000L) != 0L) case 119: if ((active0 & 0x4000L) != 0L) return jjStartNfaWithStates_2(4, 14, 96); - return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000L); + return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x800000000L); case 88: case 120: - if ((active11 & 0x20000000L) != 0L) - return jjStartNfaWithStates_2(4, 733, 96); + if ((active11 & 0x40000000L) != 0L) + return jjStartNfaWithStates_2(4, 734, 96); return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: @@ -12707,9 +12732,9 @@ else if ((active2 & 0x1000000000000000L) != 0L) return jjStartNfaWithStates_2(4, 188, 96); else if ((active3 & 0x40L) != 0L) return jjStartNfaWithStates_2(4, 198, 96); - else if ((active11 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_2(4, 745, 96); - return jjMoveStringLiteralDfa5_2(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100010000000L); + else if ((active11 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_2(4, 746, 96); + return jjMoveStringLiteralDfa5_2(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200020000000L); case 90: case 122: return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x6000000000000000L, active10, 0L, active11, 0L); @@ -12730,7 +12755,7 @@ private final int jjMoveStringLiteralDfa5_2(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa6_2(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x10000000000000L, active11, 0x2e00010L); + return jjMoveStringLiteralDfa6_2(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x20000000000000L, active11, 0x5c00020L); case 65: case 97: if ((active7 & 0x800000000000000L) != 0L) @@ -12738,7 +12763,7 @@ private final int jjMoveStringLiteralDfa5_2(long old0, long active0, long old1, jjmatchedKind = 507; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_2(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x140000000740078L, active11, 0x20000L); + return jjMoveStringLiteralDfa6_2(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x280000000740078L, active11, 0x40000L); case 66: case 98: return jjMoveStringLiteralDfa6_2(active0, 0xc00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x40000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -12753,7 +12778,7 @@ else if ((active6 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_2(5, 447, 96); else if ((active9 & 0x4000000L) != 0L) return jjStartNfaWithStates_2(5, 602, 96); - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x4000100000L); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x8000200000L); case 68: case 100: if ((active0 & 0x40000000000000L) != 0L) @@ -12769,7 +12794,7 @@ else if ((active8 & 0x8L) != 0L) jjmatchedKind = 515; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_2(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x1e0010000000L, active11, 0L); + return jjMoveStringLiteralDfa6_2(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x3c0010000000L, active11, 0L); case 69: case 101: if ((active0 & 0x4000000000L) != 0L) @@ -12810,9 +12835,9 @@ else if ((active10 & 0x800000L) != 0L) return jjStartNfaWithStates_2(5, 663, 96); else if ((active10 & 0x80000000L) != 0L) return jjStartNfaWithStates_2(5, 671, 96); - else if ((active10 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_2(5, 676, 96); - return jjMoveStringLiteralDfa6_2(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x80000400L); + else if ((active10 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_2(5, 677, 96); + return jjMoveStringLiteralDfa6_2(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x100000800L); case 70: case 102: if ((active5 & 0x80000000000000L) != 0L) @@ -12822,20 +12847,20 @@ else if ((active10 & 0x1000000000L) != 0L) case 103: if ((active3 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_2(5, 247, 96); - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x200000000L); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x400000000L); case 72: case 104: if ((active4 & 0x40000000000000L) != 0L) return jjStartNfaWithStates_2(5, 310, 96); else if ((active8 & 0x4L) != 0L) return jjStartNfaWithStates_2(5, 514, 96); - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 73: case 105: - return jjMoveStringLiteralDfa6_2(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x80000L); + return jjMoveStringLiteralDfa6_2(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x100000L); case 75: case 107: - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x4000000L); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x8000000L); case 76: case 108: if ((active3 & 0x400000000000L) != 0L) @@ -12844,7 +12869,7 @@ else if ((active6 & 0x100000000L) != 0L) return jjStartNfaWithStates_2(5, 416, 96); else if ((active8 & 0x2L) != 0L) return jjStartNfaWithStates_2(5, 513, 96); - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x40000000L); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x80000000L); case 77: case 109: if ((active9 & 0x20000000L) != 0L) @@ -12878,17 +12903,17 @@ else if ((active7 & 0x40000000L) != 0L) jjmatchedKind = 478; jjmatchedPos = 5; } - else if ((active11 & 0x80L) != 0L) - return jjStartNfaWithStates_2(5, 711, 96); - return jjMoveStringLiteralDfa6_2(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0x680000004000000L, active11, 0x2100000000L); + else if ((active11 & 0x100L) != 0L) + return jjStartNfaWithStates_2(5, 712, 96); + return jjMoveStringLiteralDfa6_2(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0xd00001004000000L, active11, 0x4200000000L); case 79: case 111: - return jjMoveStringLiteralDfa6_2(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x1820000200000000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa6_2(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x3040000200000000L, active11, 0x800000000L); case 80: case 112: if ((active7 & 0x40000000000L) != 0L) return jjStartNfaWithStates_2(5, 490, 96); - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x10040000L); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x20080000L); case 81: case 113: return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -12912,7 +12937,7 @@ else if ((active8 & 0x4000L) != 0L) jjmatchedKind = 526; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_2(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa6_2(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x2000000L); case 83: case 115: if ((active0 & 0x10000L) != 0L) @@ -12929,9 +12954,9 @@ else if ((active5 & 0x4000000000000000L) != 0L) return jjStartNfaWithStates_2(5, 382, 96); else if ((active6 & 0x4000L) != 0L) return jjStartNfaWithStates_2(5, 398, 96); - else if ((active10 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_2(5, 691, 96); - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x4000000000000000L, active11, 0xc0000000000L); + else if ((active10 & 0x10000000000000L) != 0L) + return jjStartNfaWithStates_2(5, 692, 96); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x8000000000000000L, active11, 0x180000000000L); case 84: case 116: if ((active0 & 0x20L) != 0L) @@ -12968,21 +12993,21 @@ else if ((active9 & 0x800000000L) != 0L) return jjStartNfaWithStates_2(5, 611, 96); else if ((active10 & 0x800000000L) != 0L) return jjStartNfaWithStates_2(5, 675, 96); - else if ((active10 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_2(5, 678, 96); - return jjMoveStringLiteralDfa6_2(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x8000000000L); + else if ((active10 & 0x8000000000L) != 0L) + return jjStartNfaWithStates_2(5, 679, 96); + return jjMoveStringLiteralDfa6_2(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x10000000000L); case 85: case 117: - return jjMoveStringLiteralDfa6_2(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x100L); + return jjMoveStringLiteralDfa6_2(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x200L); case 86: case 118: - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x8000004L); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x10000008L); case 87: case 119: if ((active4 & 0x4000000L) != 0L) return jjStartNfaWithStates_2(5, 282, 96); - else if ((active11 & 0x20L) != 0L) - return jjStartNfaWithStates_2(5, 709, 96); + else if ((active11 & 0x40L) != 0L) + return jjStartNfaWithStates_2(5, 710, 96); return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0x20000L, active3, 0x8000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000L, active11, 0L); case 88: case 120: @@ -13000,7 +13025,7 @@ else if ((active9 & 0x20000000000L) != 0L) return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0x40000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000000L); + return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); default : break; } @@ -13022,13 +13047,13 @@ private final int jjMoveStringLiteralDfa6_2(long old0, long active0, long old1, return jjStartNfaWithStates_2(6, 464, 96); break; case 95: - return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x100000000L); case 65: case 97: - return jjMoveStringLiteralDfa7_2(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x80000000000e00L, active11, 0x200008000000L); + return jjMoveStringLiteralDfa7_2(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x100000000000e00L, active11, 0x400010000000L); case 66: case 98: - return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x20L); case 67: case 99: if ((active2 & 0x40000000000000L) != 0L) @@ -13051,7 +13076,7 @@ else if ((active5 & 0x20L) != 0L) return jjStartNfaWithStates_2(6, 325, 96); else if ((active10 & 0x400000000L) != 0L) return jjStartNfaWithStates_2(6, 674, 96); - return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x4000000004000000L, active11, 0L); + return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x8000000004000000L, active11, 0L); case 69: case 101: if ((active0 & 0x100000000000000L) != 0L) @@ -13089,13 +13114,13 @@ else if ((active7 & 0x80000000000L) != 0L) } else if ((active10 & 0x2000000L) != 0L) return jjStartNfaWithStates_2(6, 665, 96); - else if ((active11 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_2(6, 742, 96); else if ((active11 & 0x8000000000L) != 0L) return jjStartNfaWithStates_2(6, 743, 96); - else if ((active11 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_2(6, 748, 96); - return jjMoveStringLiteralDfa7_2(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x1e0000000000L, active11, 0x45000004L); + else if ((active11 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_2(6, 744, 96); + else if ((active11 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_2(6, 749, 96); + return jjMoveStringLiteralDfa7_2(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x3c1000000000L, active11, 0x8a000008L); case 70: case 102: return jjMoveStringLiteralDfa7_2(active0, 0x10000000000L, active1, 0x1000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -13118,21 +13143,21 @@ else if ((active6 & 0x400000000000L) != 0L) return jjStartNfaWithStates_2(6, 430, 96); else if ((active7 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_2(6, 499, 96); - else if ((active10 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_2(6, 698, 96); - else if ((active11 & 0x100000000L) != 0L) - return jjStartNfaWithStates_2(6, 736, 96); - return jjMoveStringLiteralDfa7_2(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x400000L); + else if ((active10 & 0x800000000000000L) != 0L) + return jjStartNfaWithStates_2(6, 699, 96); + else if ((active11 & 0x200000000L) != 0L) + return jjStartNfaWithStates_2(6, 737, 96); + return jjMoveStringLiteralDfa7_2(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x800000L); case 72: case 104: if ((active0 & 0x4000000000000L) != 0L) return jjStartNfaWithStates_2(6, 50, 96); - else if ((active11 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_2(6, 747, 96); + else if ((active11 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_2(6, 748, 96); return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa7_2(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x200100000L); + return jjMoveStringLiteralDfa7_2(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x400200000L); case 76: case 108: if ((active2 & 0x800000L) != 0L) @@ -13158,7 +13183,7 @@ else if ((active6 & 0x40000000L) != 0L) return jjMoveStringLiteralDfa7_2(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400L, active5, 0x2048000000000000L, active6, 0x2000L, active7, 0x20000L, active8, 0L, active9, 0x4L, active10, 0L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa7_2(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x40000000000000L, active11, 0L); + return jjMoveStringLiteralDfa7_2(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x80000000000000L, active11, 0L); case 78: case 110: if ((active0 & 0x80000000000L) != 0L) @@ -13184,19 +13209,19 @@ else if ((active8 & 0x10000L) != 0L) } else if ((active10 & 0x100000000L) != 0L) return jjStartNfaWithStates_2(6, 672, 96); - else if ((active10 & 0x800000000000000L) != 0L) + else if ((active10 & 0x1000000000000000L) != 0L) { - jjmatchedKind = 699; + jjmatchedKind = 700; jjmatchedPos = 6; } - return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x1000000000000004L, active11, 0x800000L); + return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x2000000000000004L, active11, 0x1000000L); case 79: case 111: - return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x10000000000180L, active11, 0L); + return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x20000000000180L, active11, 0L); case 80: case 112: - if ((active10 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_2(6, 693, 96); + if ((active10 & 0x40000000000000L) != 0L) + return jjStartNfaWithStates_2(6, 694, 96); return jjMoveStringLiteralDfa7_2(active0, 0x20000000000L, active1, 0x2800000000000L, active2, 0x30000000000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0x80000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 82: case 114: @@ -13222,11 +13247,11 @@ else if ((active10 & 0x2000L) != 0L) jjmatchedKind = 653; jjmatchedPos = 6; } - else if ((active10 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_2(6, 696, 96); - else if ((active11 & 0x400L) != 0L) - return jjStartNfaWithStates_2(6, 714, 96); - return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x400000000L); + else if ((active10 & 0x200000000000000L) != 0L) + return jjStartNfaWithStates_2(6, 697, 96); + else if ((active11 & 0x800L) != 0L) + return jjStartNfaWithStates_2(6, 715, 96); + return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x800000000L); case 83: case 115: if ((active5 & 0x40L) != 0L) @@ -13239,9 +13264,9 @@ else if ((active7 & 0x1000000000L) != 0L) return jjStartNfaWithStates_2(6, 484, 96); else if ((active8 & 0x10L) != 0L) return jjStartNfaWithStates_2(6, 516, 96); - else if ((active11 & 0x40000L) != 0L) - return jjStartNfaWithStates_2(6, 722, 96); - return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x200000L); + else if ((active11 & 0x80000L) != 0L) + return jjStartNfaWithStates_2(6, 723, 96); + return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x400000L); case 84: case 116: if ((active1 & 0x800000L) != 0L) @@ -13282,14 +13307,14 @@ else if ((active9 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_2(6, 639, 96); else if ((active10 & 0x200000000L) != 0L) return jjStartNfaWithStates_2(6, 673, 96); - else if ((active10 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_2(6, 697, 96); - else if ((active11 & 0x100L) != 0L) - return jjStartNfaWithStates_2(6, 712, 96); - return jjMoveStringLiteralDfa7_2(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x400120a0000L); + else if ((active10 & 0x400000000000000L) != 0L) + return jjStartNfaWithStates_2(6, 698, 96); + else if ((active11 & 0x200L) != 0L) + return jjStartNfaWithStates_2(6, 713, 96); + return jjMoveStringLiteralDfa7_2(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x80024140000L); case 85: case 117: - return jjMoveStringLiteralDfa7_2(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa7_2(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x4000000000L); case 86: case 118: return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0x200000000000000L, active7, 0x203000L, active8, 0L, active9, 0L, active10, 0x2L, active11, 0L); @@ -13331,7 +13356,7 @@ private final int jjMoveStringLiteralDfa7_2(long old0, long active0, long old1, return jjMoveStringLiteralDfa8_2(active0, 0x2000000000000000L, active1, 0xff0000000c000000L, active2, 0x180000000000007L, active3, 0L, active4, 0L, active5, 0x70000L, active6, 0x40000000000L, active7, 0x700000000000L, active8, 0x20000L, active9, 0xffc00L, active10, 0x1c000L, active11, 0L); case 65: case 97: - return jjMoveStringLiteralDfa8_2(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x4000000000000000L, active11, 0x800000L); + return jjMoveStringLiteralDfa8_2(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x8000000000000000L, active11, 0x1000000L); case 66: case 98: if ((active8 & 0x10000000000L) != 0L) @@ -13355,8 +13380,10 @@ else if ((active8 & 0x40000000L) != 0L) return jjStartNfaWithStates_2(7, 57, 96); else if ((active2 & 0x10000000L) != 0L) return jjStartNfaWithStates_2(7, 156, 96); - else if ((active11 & 0x400000000L) != 0L) - return jjStartNfaWithStates_2(7, 738, 96); + else if ((active10 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_2(7, 676, 96); + else if ((active11 & 0x800000000L) != 0L) + return jjStartNfaWithStates_2(7, 739, 96); return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40000780000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 69: case 101: @@ -13406,14 +13433,14 @@ else if ((active9 & 0x80L) != 0L) } else if ((active10 & 0x100000L) != 0L) return jjStartNfaWithStates_2(7, 660, 96); - else if ((active11 & 0x20000L) != 0L) - return jjStartNfaWithStates_2(7, 721, 96); - return jjMoveStringLiteralDfa8_2(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x10000000L); + else if ((active11 & 0x40000L) != 0L) + return jjStartNfaWithStates_2(7, 722, 96); + return jjMoveStringLiteralDfa8_2(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x20000000L); case 70: case 102: - if ((active10 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_2(7, 692, 96); - return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x1e0000000000L, active11, 0L); + if ((active10 & 0x20000000000000L) != 0L) + return jjStartNfaWithStates_2(7, 693, 96); + return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active2 & 0x2000000000000000L) != 0L) @@ -13424,7 +13451,7 @@ else if ((active6 & 0x800L) != 0L) return jjStartNfaWithStates_2(7, 395, 96); else if ((active10 & 0x4L) != 0L) return jjStartNfaWithStates_2(7, 642, 96); - return jjMoveStringLiteralDfa8_2(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa8_2(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x2000000L); case 72: case 104: if ((active2 & 0x400000000000L) != 0L) @@ -13432,7 +13459,7 @@ else if ((active10 & 0x4L) != 0L) return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa8_2(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x1000000000000000L, active11, 0x40000000000L); + return jjMoveStringLiteralDfa8_2(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x2000000000000000L, active11, 0x80000000000L); case 74: case 106: return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -13451,9 +13478,9 @@ else if ((active5 & 0x8000000000L) != 0L) return jjStartNfaWithStates_2(7, 359, 96); else if ((active9 & 0x20L) != 0L) return jjStartNfaWithStates_2(7, 581, 96); - else if ((active11 & 0x40000000L) != 0L) - return jjStartNfaWithStates_2(7, 734, 96); - return jjMoveStringLiteralDfa8_2(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x8000000L); + else if ((active11 & 0x80000000L) != 0L) + return jjStartNfaWithStates_2(7, 735, 96); + return jjMoveStringLiteralDfa8_2(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x10000000L); case 77: case 109: return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0L, active3, 0x1L, active4, 0xc000000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f01000000000000L, active10, 0L, active11, 0L); @@ -13466,22 +13493,22 @@ else if ((active6 & 0x4000000000000L) != 0L) jjmatchedKind = 434; jjmatchedPos = 7; } - return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x200200000000L); + return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x400400000000L); case 79: case 111: - return jjMoveStringLiteralDfa8_2(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa8_2(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x4000000000L); case 80: case 112: - if ((active10 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_2(7, 694, 96); + if ((active10 & 0x80000000000000L) != 0L) + return jjStartNfaWithStates_2(7, 695, 96); return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0x8000000L, active10, 0L, active11, 0L); case 82: case 114: if ((active8 & 0x40000000000L) != 0L) return jjStartNfaWithStates_2(7, 554, 96); - else if ((active11 & 0x4L) != 0L) - return jjStartNfaWithStates_2(7, 706, 96); - return jjMoveStringLiteralDfa8_2(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x80000000040180L, active11, 0x400000L); + else if ((active11 & 0x8L) != 0L) + return jjStartNfaWithStates_2(7, 707, 96); + return jjMoveStringLiteralDfa8_2(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x100000000040180L, active11, 0x800000L); case 83: case 115: if ((active1 & 0x40000000000L) != 0L) @@ -13503,7 +13530,7 @@ else if ((active7 & 0x4L) != 0L) return jjStartNfaWithStates_2(7, 450, 96); else if ((active9 & 0x8000000000L) != 0L) return jjStartNfaWithStates_2(7, 615, 96); - return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x100000000L); case 84: case 116: if ((active2 & 0x800000000000L) != 0L) @@ -13516,10 +13543,10 @@ else if ((active8 & 0x4000000L) != 0L) return jjStartNfaWithStates_2(7, 538, 96); else if ((active10 & 0x200000L) != 0L) return jjStartNfaWithStates_2(7, 661, 96); - return jjMoveStringLiteralDfa8_2(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x100000L); + return jjMoveStringLiteralDfa8_2(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x200000L); case 85: case 117: - return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x20L); case 86: case 118: return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100L, active8, 0x400L, active9, 0L, active10, 0L, active11, 0L); @@ -13549,9 +13576,9 @@ else if ((active8 & 0x40L) != 0L) return jjStartNfaWithStates_2(7, 518, 96); else if ((active9 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_2(7, 627, 96); - else if ((active11 & 0x4000000L) != 0L) - return jjStartNfaWithStates_2(7, 730, 96); - return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x2280000L); + else if ((active11 & 0x8000000L) != 0L) + return jjStartNfaWithStates_2(7, 731, 96); + return jjMoveStringLiteralDfa8_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x4500000L); case 90: case 122: return jjMoveStringLiteralDfa8_2(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x3000000000000L, active6, 0L, active7, 0L, active8, 0x2000L, active9, 0L, active10, 0L, active11, 0L); @@ -13572,7 +13599,7 @@ private final int jjMoveStringLiteralDfa8_2(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x80000L); + return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x100000L); case 65: case 97: return jjMoveStringLiteralDfa9_2(active0, 0x11000000000L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0x300020000L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0xa000L, active9, 0x10000000L, active10, 0x40000L, active11, 0L); @@ -13585,7 +13612,7 @@ private final int jjMoveStringLiteralDfa8_2(long old0, long active0, long old1, case 99: if ((active9 & 0x40000000000L) != 0L) return jjStartNfaWithStates_2(8, 618, 96); - return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x40000000010L); + return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x80000000020L); case 68: case 100: if ((active1 & 0x20000000L) != 0L) @@ -13594,8 +13621,8 @@ else if ((active3 & 0x80000000000L) != 0L) return jjStartNfaWithStates_2(8, 235, 96); else if ((active10 & 0x4000000L) != 0L) return jjStartNfaWithStates_2(8, 666, 96); - else if ((active11 & 0x10000000L) != 0L) - return jjStartNfaWithStates_2(8, 732, 96); + else if ((active11 & 0x20000000L) != 0L) + return jjStartNfaWithStates_2(8, 733, 96); return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x600000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x400L, active10, 0L, active11, 0L); case 69: case 101: @@ -13663,9 +13690,9 @@ else if ((active9 & 0x2000000000L) != 0L) jjmatchedKind = 613; jjmatchedPos = 8; } - else if ((active11 & 0x200000000L) != 0L) - return jjStartNfaWithStates_2(8, 737, 96); - return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x200000000000L); + else if ((active11 & 0x400000000L) != 0L) + return jjStartNfaWithStates_2(8, 738, 96); + return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x400000000000L); case 72: case 104: return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x201000L, active10, 0L, active11, 0L); @@ -13673,7 +13700,7 @@ else if ((active11 & 0x200000000L) != 0L) case 105: if ((active0 & 0x40000000000L) != 0L) return jjStartNfaWithStates_2(8, 42, 96); - return jjMoveStringLiteralDfa9_2(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x1e0010000878L, active11, 0x81000000L); + return jjMoveStringLiteralDfa9_2(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x3c0010000878L, active11, 0x102000000L); case 75: case 107: if ((active2 & 0x20000L) != 0L) @@ -13689,7 +13716,7 @@ else if ((active11 & 0x200000000L) != 0L) jjmatchedKind = 647; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x800000L); + return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x1000000L); case 78: case 110: if ((active0 & 0x20000000L) != 0L) @@ -13712,10 +13739,10 @@ else if ((active6 & 0x80000000L) != 0L) return jjStartNfaWithStates_2(8, 415, 96); else if ((active6 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_2(8, 439, 96); - return jjMoveStringLiteralDfa9_2(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x1000000000008000L, active11, 0x200000L); + return jjMoveStringLiteralDfa9_2(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x2000000000008000L, active11, 0x400000L); case 79: case 111: - return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x800000L); case 80: case 112: if ((active1 & 0x2000000000000L) != 0L) @@ -13725,7 +13752,7 @@ else if ((active9 & 0x100000000000000L) != 0L) jjmatchedKind = 632; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x2000000L); + return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x4000000L); case 81: case 113: return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0L); @@ -13777,7 +13804,7 @@ else if ((active9 & 0x2000000L) != 0L) return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0x8000020000000000L, active2, 0x100003L, active3, 0L, active4, 0x200004L, active5, 0x40000L, active6, 0x2000L, active7, 0x4000000000000000L, active8, 0x500000000L, active9, 0x1000000000L, active10, 0x8000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x2008000000L); + return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x4010000000L); case 86: case 118: return jjMoveStringLiteralDfa9_2(active0, 0x10000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0L); @@ -13801,12 +13828,12 @@ else if ((active7 & 0x2000L) != 0L) return jjStartNfaWithStates_2(8, 461, 96); else if ((active9 & 0x2000000000000L) != 0L) return jjStartNfaWithStates_2(8, 625, 96); - else if ((active10 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_2(8, 695, 96); - else if ((active10 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_2(8, 702, 96); - else if ((active11 & 0x100000L) != 0L) - return jjStartNfaWithStates_2(8, 724, 96); + else if ((active10 & 0x100000000000000L) != 0L) + return jjStartNfaWithStates_2(8, 696, 96); + else if ((active10 & 0x8000000000000000L) != 0L) + return jjStartNfaWithStates_2(8, 703, 96); + else if ((active11 & 0x200000L) != 0L) + return jjStartNfaWithStates_2(8, 725, 96); return jjMoveStringLiteralDfa9_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x80000L, active10, 0L, active11, 0L); default : break; @@ -13840,7 +13867,7 @@ else if ((active2 & 0x400L) != 0L) return jjStartNfaWithStates_2(9, 138, 96); else if ((active9 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_2(9, 631, 96); - return jjMoveStringLiteralDfa10_2(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjMoveStringLiteralDfa10_2(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 68: case 100: if ((active5 & 0x4000000000L) != 0L) @@ -13874,13 +13901,13 @@ else if ((active9 & 0x1000000000L) != 0L) return jjStartNfaWithStates_2(9, 612, 96); else if ((active9 & 0x800000000000L) != 0L) return jjStartNfaWithStates_2(9, 623, 96); - else if ((active11 & 0x800000L) != 0L) - return jjStartNfaWithStates_2(9, 727, 96); - else if ((active11 & 0x2000000L) != 0L) - return jjStartNfaWithStates_2(9, 729, 96); - else if ((active11 & 0x8000000L) != 0L) - return jjStartNfaWithStates_2(9, 731, 96); - return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x200000000000L); + else if ((active11 & 0x1000000L) != 0L) + return jjStartNfaWithStates_2(9, 728, 96); + else if ((active11 & 0x4000000L) != 0L) + return jjStartNfaWithStates_2(9, 730, 96); + else if ((active11 & 0x10000000L) != 0L) + return jjStartNfaWithStates_2(9, 732, 96); + return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x400000000000L); case 71: case 103: if ((active6 & 0x200000L) != 0L) @@ -13889,8 +13916,8 @@ else if ((active8 & 0x1000000000L) != 0L) return jjStartNfaWithStates_2(9, 548, 96); else if ((active9 & 0x40000000L) != 0L) return jjStartNfaWithStates_2(9, 606, 96); - else if ((active10 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_2(9, 700, 96); + else if ((active10 & 0x2000000000000000L) != 0L) + return jjStartNfaWithStates_2(9, 701, 96); return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x2000000000000000L, active6, 0x400000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: @@ -13902,7 +13929,7 @@ else if ((active10 & 0x1000000000000000L) != 0L) case 107: if ((active2 & 0x400000000L) != 0L) return jjStartNfaWithStates_2(9, 162, 96); - return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80010L); + return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100020L); case 76: case 108: return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2L, active5, 0L, active6, 0L, active7, 0x100000000L, active8, 0L, active9, 0x1000000000000L, active10, 0L, active11, 0L); @@ -13918,10 +13945,10 @@ else if ((active10 & 0x1000000000000000L) != 0L) jjmatchedKind = 98; jjmatchedPos = 9; } - return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x3c0000000000L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x1000000L); + return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x2000000L); case 80: case 112: if ((active1 & 0x4000000000000L) != 0L) @@ -13952,10 +13979,10 @@ else if ((active7 & 0x400L) != 0L) return jjStartNfaWithStates_2(9, 458, 96); else if ((active10 & 0x100L) != 0L) return jjStartNfaWithStates_2(9, 648, 96); - else if ((active11 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_2(9, 741, 96); - else if ((active11 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_2(9, 746, 96); + else if ((active11 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_2(9, 742, 96); + else if ((active11 & 0x80000000000L) != 0L) + return jjStartNfaWithStates_2(9, 747, 96); return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0x80000000000L, active2, 0x40000000004L, active3, 0L, active4, 0x8000000000000000L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: @@ -13975,7 +14002,7 @@ else if ((active8 & 0x2000000000L) != 0L) return jjMoveStringLiteralDfa10_2(active0, 0x80021000000000L, active1, 0x1e000000008L, active2, 0x8000L, active3, 0x2L, active4, 0x400000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100L, active10, 0L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x800000L); case 86: case 118: return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -14002,7 +14029,7 @@ else if ((active10 & 0x40000L) != 0L) return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x200000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa10_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L); default : break; } @@ -14039,7 +14066,7 @@ else if ((active5 & 0x200000L) != 0L) return jjStartNfaWithStates_2(10, 341, 96); else if ((active10 & 0x8000000L) != 0L) return jjStartNfaWithStates_2(10, 667, 96); - return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x400000000000L); case 69: case 101: if ((active0 & 0x10000000000L) != 0L) @@ -14060,9 +14087,9 @@ else if ((active9 & 0x100000000000L) != 0L) return jjStartNfaWithStates_2(10, 620, 96); else if ((active9 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_2(10, 624, 96); - else if ((active11 & 0x80000000L) != 0L) - return jjStartNfaWithStates_2(10, 735, 96); - return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x1e0000000000L, active11, 0x80010L); + else if ((active11 & 0x100000000L) != 0L) + return jjStartNfaWithStates_2(10, 736, 96); + return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x3c0000000000L, active11, 0x100020L); case 70: case 102: return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -14077,7 +14104,7 @@ else if ((active11 & 0x80000000L) != 0L) return jjStartNfaWithStates_2(10, 67, 96); else if ((active6 & 0x400000000L) != 0L) return jjStartNfaWithStates_2(10, 418, 96); - return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 73: case 105: return jjMoveStringLiteralDfa11_2(active0, 0x21000000000L, active1, 0x800000002000L, active2, 0x1000L, active3, 0x2L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0L, active8, 0L, active9, 0x4400000000000000L, active10, 0L, active11, 0L); @@ -14104,8 +14131,8 @@ else if ((active10 & 0x8L) != 0L) } else if ((active10 & 0x800L) != 0L) return jjStartNfaWithStates_2(10, 651, 96); - else if ((active11 & 0x1000000L) != 0L) - return jjStartNfaWithStates_2(10, 728, 96); + else if ((active11 & 0x2000000L) != 0L) + return jjStartNfaWithStates_2(10, 729, 96); return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0x10c200000L, active2, 0x180000000006000L, active3, 0L, active4, 0L, active5, 0x10000L, active6, 0x40002000000L, active7, 0L, active8, 0L, active9, 0xc040L, active10, 0x10000070L, active11, 0L); case 79: case 111: @@ -14114,8 +14141,8 @@ else if ((active11 & 0x1000000L) != 0L) case 112: if ((active9 & 0x10000000L) != 0L) return jjStartNfaWithStates_2(10, 604, 96); - else if ((active11 & 0x400000L) != 0L) - return jjStartNfaWithStates_2(10, 726, 96); + else if ((active11 & 0x800000L) != 0L) + return jjStartNfaWithStates_2(10, 727, 96); return jjMoveStringLiteralDfa11_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 81: case 113: @@ -14191,7 +14218,7 @@ private final int jjMoveStringLiteralDfa11_2(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa12_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa12_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 65: case 97: if ((active8 & 0x1L) != 0L) @@ -14207,7 +14234,7 @@ private final int jjMoveStringLiteralDfa11_2(long old0, long active0, long old1, case 100: if ((active9 & 0x200000000000000L) != 0L) return jjStartNfaWithStates_2(11, 633, 96); - return jjMoveStringLiteralDfa12_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa12_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 69: case 101: if ((active0 & 0x2000000000000000L) != 0L) @@ -14292,7 +14319,7 @@ else if ((active9 & 0x1000L) != 0L) return jjStartNfaWithStates_2(11, 588, 96); else if ((active9 & 0x80000L) != 0L) return jjStartNfaWithStates_2(11, 595, 96); - return jjMoveStringLiteralDfa12_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa12_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x400000L); case 83: case 115: return jjMoveStringLiteralDfa12_2(active0, 0L, active1, 0x8000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x70L, active11, 0L); @@ -14304,16 +14331,16 @@ else if ((active5 & 0x40000L) != 0L) return jjStartNfaWithStates_2(11, 338, 96); else if ((active9 & 0x40L) != 0L) return jjStartNfaWithStates_2(11, 582, 96); - else if ((active11 & 0x10L) != 0L) - return jjStartNfaWithStates_2(11, 708, 96); + else if ((active11 & 0x20L) != 0L) + return jjStartNfaWithStates_2(11, 709, 96); return jjMoveStringLiteralDfa12_2(active0, 0x20000800000L, active1, 0x200L, active2, 0x6000L, active3, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x8000L, active10, 0L, active11, 0L); case 85: case 117: return jjMoveStringLiteralDfa12_2(active0, 0L, active1, 0x100000000L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2000000000004000L, active10, 0L, active11, 0L); case 89: case 121: - if ((active11 & 0x80000L) != 0L) - return jjStartNfaWithStates_2(11, 723, 96); + if ((active11 & 0x100000L) != 0L) + return jjStartNfaWithStates_2(11, 724, 96); break; default : break; @@ -14332,7 +14359,7 @@ private final int jjMoveStringLiteralDfa12_2(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa13_2(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x1e0000000070L, active11, 0L); + return jjMoveStringLiteralDfa13_2(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x3c0000000070L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa13_2(active0, 0L, active1, 0x6800000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -14388,12 +14415,12 @@ else if ((active3 & 0x2L) != 0L) return jjMoveStringLiteralDfa13_2(active0, 0L, active1, 0x20L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x20000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa13_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa13_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x400000L); case 80: case 112: if ((active9 & 0x100L) != 0L) return jjStartNfaWithStates_2(12, 584, 96); - return jjMoveStringLiteralDfa13_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa13_2(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 82: case 114: if ((active9 & 0x2000000000000000L) != 0L) @@ -14439,7 +14466,7 @@ else if ((active7 & 0x400000000000L) != 0L) return jjStartNfaWithStates_2(13, 494, 96); else if ((active10 & 0x10000L) != 0L) return jjStartNfaWithStates_2(13, 656, 96); - return jjMoveStringLiteralDfa14_2(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa14_2(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 66: case 98: return jjMoveStringLiteralDfa14_2(active0, 0L, active1, 0x100000000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -14492,7 +14519,7 @@ else if ((active9 & 0x4000L) != 0L) case 110: if ((active4 & 0x4L) != 0L) return jjStartNfaWithStates_2(13, 258, 96); - return jjMoveStringLiteralDfa14_2(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x200000L); + return jjMoveStringLiteralDfa14_2(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x400000L); case 79: case 111: return jjMoveStringLiteralDfa14_2(active0, 0x20000000000L, active1, 0x100000000000000L, active2, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0L, active10, 0x4000L, active11, 0L); @@ -14513,7 +14540,7 @@ else if ((active9 & 0x4000L) != 0L) case 116: if ((active7 & 0x8000L) != 0L) return jjStartNfaWithStates_2(13, 463, 96); - return jjMoveStringLiteralDfa14_2(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa14_2(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x3c0000000000L, active11, 0L); case 88: case 120: if ((active6 & 0x8000000000000L) != 0L) @@ -14580,7 +14607,7 @@ else if ((active10 & 0x4000L) != 0L) break; case 73: case 105: - return jjMoveStringLiteralDfa15_2(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa15_2(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x400000L); case 76: case 108: return jjMoveStringLiteralDfa15_2(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -14607,7 +14634,7 @@ else if ((active8 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_2(14, 575, 96); else if ((active9 & 0x10000L) != 0L) return jjStartNfaWithStates_2(14, 592, 96); - return jjMoveStringLiteralDfa15_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa15_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 83: case 115: if ((active1 & 0x200L) != 0L) @@ -14632,7 +14659,7 @@ else if ((active10 & 0x400L) != 0L) break; case 89: case 121: - return jjMoveStringLiteralDfa15_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa15_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); default : break; } @@ -14699,7 +14726,7 @@ else if ((active2 & 0x80000000000000L) != 0L) return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 82: case 114: if ((active1 & 0x100000000L) != 0L) @@ -14709,7 +14736,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xe0000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -14723,7 +14750,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa16_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); default : break; } @@ -14746,12 +14773,12 @@ private final int jjMoveStringLiteralDfa16_2(long old0, long active0, long old1, case 97: if ((active1 & 0x8000000000L) != 0L) return jjStartNfaWithStates_2(16, 103, 96); - return jjMoveStringLiteralDfa17_2(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa17_2(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: if ((active7 & 0x400000000L) != 0L) return jjStartNfaWithStates_2(16, 482, 96); - return jjMoveStringLiteralDfa17_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa17_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active1 & 0x100000L) != 0L) @@ -14762,7 +14789,7 @@ private final int jjMoveStringLiteralDfa16_2(long old0, long active0, long old1, return jjMoveStringLiteralDfa17_2(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa17_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa17_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 76: case 108: return jjMoveStringLiteralDfa17_2(active0, 0L, active1, 0L, active2, 0x6000L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0L, active10, 0x40L, active11, 0L); @@ -14826,7 +14853,7 @@ private final int jjMoveStringLiteralDfa17_2(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa18_2(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa18_2(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa18_2(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -14862,7 +14889,7 @@ private final int jjMoveStringLiteralDfa17_2(long old0, long active0, long old1, return jjMoveStringLiteralDfa18_2(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa18_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa18_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 86: case 118: return jjMoveStringLiteralDfa18_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0L); @@ -14889,7 +14916,7 @@ private final int jjMoveStringLiteralDfa18_2(long old0, long active0, long old1, return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x60000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0xc0000000000L, active11, 0L); case 68: case 100: if ((active8 & 0x800000000000000L) != 0L) @@ -14914,7 +14941,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa19_2(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa19_2(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 76: case 108: return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -14923,7 +14950,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); case 79: case 111: return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -14932,7 +14959,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0x4000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000L, active11, 0L); case 84: case 116: return jjMoveStringLiteralDfa19_2(active0, 0L, active1, 0L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0x80000000L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x20L, active11, 0L); @@ -14958,10 +14985,10 @@ private final int jjMoveStringLiteralDfa19_2(long old0, long active0, long old1, case 97: if ((active1 & 0x100L) != 0L) return jjStartNfaWithStates_2(19, 72, 96); - return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0xa0000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0x140000000000L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x200000000000L, active11, 0L); case 68: case 100: return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -14975,7 +15002,7 @@ private final int jjMoveStringLiteralDfa19_2(long old0, long active0, long old1, return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0x10000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x40000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x80000000000L, active11, 0x400000400000L); case 82: case 114: return jjMoveStringLiteralDfa20_2(active0, 0L, active1, 0L, active2, 0x4002L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -15019,7 +15046,7 @@ private final int jjMoveStringLiteralDfa20_2(long old0, long active0, long old1, return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0x20000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 68: case 100: - return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x80000000000L, active11, 0L); case 69: case 101: if ((active1 & 0x8000000L) != 0L) @@ -15036,13 +15063,13 @@ else if ((active2 & 0x100000000000000L) != 0L) case 104: if ((active7 & 0x200000000L) != 0L) return jjStartNfaWithStates_2(20, 481, 96); - return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x200000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x100000000000L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 79: case 111: return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0x2L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -15051,7 +15078,7 @@ else if ((active2 & 0x100000000000000L) != 0L) return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0x400000000000000L, active2, 0L, active6, 0x4000000L, active7, 0L, active8, 0x10000000000000L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_2(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x40000000000L, active11, 0L); case 89: case 121: if ((active0 & 0x1000000L) != 0L) @@ -15074,10 +15101,10 @@ private final int jjMoveStringLiteralDfa21_2(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa22_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa22_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 65: case 97: - return jjMoveStringLiteralDfa22_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000040L, active11, 0L); + return jjMoveStringLiteralDfa22_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000040L, active11, 0L); case 67: case 99: return jjMoveStringLiteralDfa22_2(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -15090,11 +15117,11 @@ private final int jjMoveStringLiteralDfa21_2(long old0, long active0, long old1, case 101: if ((active2 & 0x2000L) != 0L) return jjStartNfaWithStates_2(21, 141, 96); - else if ((active10 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_2(21, 682, 96); else if ((active10 & 0x80000000000L) != 0L) return jjStartNfaWithStates_2(21, 683, 96); - return jjMoveStringLiteralDfa22_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x100000000000L, active11, 0L); + else if ((active10 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_2(21, 684, 96); + return jjMoveStringLiteralDfa22_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x200000000000L, active11, 0L); case 70: case 102: return jjMoveStringLiteralDfa22_2(active1, 0x400000000000000L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -15153,10 +15180,10 @@ private final int jjMoveStringLiteralDfa22_2(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 76: case 108: - return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x100000000000L, active11, 0x200000L); + return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x200000000000L, active11, 0x400000L); case 78: case 110: return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x8000000000000L, active10, 0L, active11, 0L); @@ -15168,7 +15195,7 @@ private final int jjMoveStringLiteralDfa22_2(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 82: case 114: - return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa23_2(active1, 0L, active2, 0L, active6, 0x4000000L, active8, 0L, active10, 0L, active11, 0L); @@ -15195,8 +15222,8 @@ private final int jjMoveStringLiteralDfa23_2(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_2(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 65: case 97: - if ((active10 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_2(23, 684, 96); + if ((active10 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_2(23, 685, 96); break; case 67: case 99: @@ -15220,7 +15247,7 @@ private final int jjMoveStringLiteralDfa23_2(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x2040000000000000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa24_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x20000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa24_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x40000000000L, active11, 0x400000400000L); case 82: case 114: if ((active8 & 0x4000000000000L) != 0L) @@ -15255,7 +15282,7 @@ private final int jjMoveStringLiteralDfa24_2(long old1, long active1, long old2, break; case 68: case 100: - return jjMoveStringLiteralDfa25_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa25_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: return jjMoveStringLiteralDfa25_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x200000000000000L, active10, 0L, active11, 0L); @@ -15264,8 +15291,8 @@ private final int jjMoveStringLiteralDfa24_2(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_2(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_2(24, 681, 96); + if ((active10 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_2(24, 682, 96); break; case 73: case 105: @@ -15287,7 +15314,7 @@ private final int jjMoveStringLiteralDfa24_2(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 87: case 119: - return jjMoveStringLiteralDfa25_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa25_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); default : break; } @@ -15318,8 +15345,8 @@ private final int jjMoveStringLiteralDfa25_2(long old1, long active1, long old2, case 101: if ((active8 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_2(25, 563, 96); - else if ((active11 & 0x200000L) != 0L) - return jjStartNfaWithStates_2(25, 725, 96); + else if ((active11 & 0x400000L) != 0L) + return jjStartNfaWithStates_2(25, 726, 96); break; case 71: case 103: @@ -15341,7 +15368,7 @@ else if ((active11 & 0x200000L) != 0L) return jjMoveStringLiteralDfa26_2(active1, 0L, active2, 0x4002L, active6, 0L, active8, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa26_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa26_2(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa26_2(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active11, 0L); @@ -15362,7 +15389,7 @@ private final int jjMoveStringLiteralDfa26_2(long old1, long active1, long old2, switch(curChar) { case 95: - return jjMoveStringLiteralDfa27_2(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa27_2(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 68: case 100: if ((active8 & 0x80000000000000L) != 0L) @@ -15410,7 +15437,7 @@ private final int jjMoveStringLiteralDfa27_2(long old1, long active1, long old2, return jjMoveStringLiteralDfa28_2(active1, 0L, active2, 0L, active8, 0x200000000000000L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa28_2(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa28_2(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 82: case 114: return jjMoveStringLiteralDfa28_2(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -15437,7 +15464,7 @@ private final int jjMoveStringLiteralDfa28_2(long old1, long active1, long old2, break; case 69: case 101: - return jjMoveStringLiteralDfa29_2(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa29_2(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 79: case 111: return jjMoveStringLiteralDfa29_2(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -15462,7 +15489,7 @@ private final int jjMoveStringLiteralDfa29_2(long old1, long active1, long old2, { case 82: case 114: - return jjMoveStringLiteralDfa30_2(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa30_2(active1, 0L, active2, 0L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa30_2(active1, 0x400000000000000L, active2, 0L, active11, 0L); @@ -15487,7 +15514,7 @@ private final int jjMoveStringLiteralDfa30_2(long old1, long active1, long old2, { case 67: case 99: - return jjMoveStringLiteralDfa31_2(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa31_2(active1, 0L, active2, 0L, active11, 0x400000000000L); case 80: case 112: if ((active1 & 0x400000000000000L) != 0L) @@ -15513,7 +15540,7 @@ private final int jjMoveStringLiteralDfa31_2(long old1, long active1, long old2, case 101: if ((active2 & 0x2L) != 0L) return jjStartNfaWithStates_2(31, 129, 96); - return jjMoveStringLiteralDfa32_2(active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa32_2(active2, 0L, active11, 0x400000000000L); default : break; } @@ -15532,7 +15559,7 @@ private final int jjMoveStringLiteralDfa32_2(long old2, long active2, long old11 { case 78: case 110: - return jjMoveStringLiteralDfa33_2(active11, 0x200000000000L); + return jjMoveStringLiteralDfa33_2(active11, 0x400000000000L); default : break; } @@ -15551,8 +15578,8 @@ private final int jjMoveStringLiteralDfa33_2(long old11, long active11) { case 84: case 116: - if ((active11 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_2(33, 749, 96); + if ((active11 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_2(33, 750, 96); break; default : break; @@ -15589,21 +15616,21 @@ else if (curChar == 46) jjCheckNAddTwoStates(56, 57); else if (curChar == 7) { - if (kind > 826) - kind = 826; + if (kind > 829) + kind = 829; } else if (curChar == 45) jjstateSet[jjnewStateCnt++] = 23; if ((0x3ff000000000000L & l) != 0L) { - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(9, 15); } else if (curChar == 36) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -15616,8 +15643,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -15630,8 +15657,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -15646,8 +15673,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -15664,8 +15691,8 @@ else if (curChar == 38) jjstateSet[jjnewStateCnt++] = 67; if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -15674,8 +15701,8 @@ else if (curChar == 38) case 92: if (curChar == 47) { - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); } else if (curChar == 42) @@ -15690,8 +15717,8 @@ else if (curChar == 39) jjCheckNAddStates(0, 2); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (curChar == 36) @@ -15712,8 +15739,8 @@ else if (curChar == 39) jjCheckNAddStates(32, 34); else if (curChar == 39) { - if (kind > 758) - kind = 758; + if (kind > 759) + kind = 759; } if ((0xfc00f7faffffc9ffL & l) != 0L) jjstateSet[jjnewStateCnt++] = 64; @@ -15723,8 +15750,8 @@ else if (curChar == 39) case 97: if ((0x3ff000000000000L & l) != 0L) { - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(57); } if ((0x3ff000000000000L & l) != 0L) @@ -15749,8 +15776,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 3; break; case 5: - if (curChar == 39 && kind > 757) - kind = 757; + if (curChar == 39 && kind > 758) + kind = 758; break; case 7: if ((0x3ff000000000000L & l) != 0L) @@ -15774,8 +15801,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 11; break; case 13: - if (curChar == 39 && kind > 759) - kind = 759; + if (curChar == 39 && kind > 760) + kind = 760; break; case 17: if ((0xffffff7fffffffffL & l) != 0L) @@ -15793,30 +15820,30 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 20; break; case 22: - if (curChar == 39 && kind > 761) - kind = 761; + if (curChar == 39 && kind > 762) + kind = 762; break; case 23: if (curChar != 45) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; case 24: if ((0xffffffffffffdbffL & l) == 0L) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; case 25: - if ((0x2400L & l) != 0L && kind > 812) - kind = 812; + if ((0x2400L & l) != 0L && kind > 815) + kind = 815; break; case 26: - if (curChar == 10 && kind > 812) - kind = 812; + if (curChar == 10 && kind > 815) + kind = 815; break; case 27: if (curChar == 13) @@ -15833,15 +15860,15 @@ else if (curChar == 39) case 34: if (curChar != 36) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -15859,8 +15886,8 @@ else if (curChar == 39) case 39: if (curChar != 36) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAddTwoStates(39, 40); break; case 40: @@ -15870,26 +15897,26 @@ else if (curChar == 39) case 41: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAdd(41); break; case 42: - if (curChar == 7 && kind > 826) - kind = 826; + if (curChar == 7 && kind > 829) + kind = 829; break; case 43: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(9, 15); break; case 44: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAdd(44); break; case 45: @@ -15903,8 +15930,8 @@ else if (curChar == 39) case 48: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 752) - kind = 752; + if (kind > 753) + kind = 753; jjCheckNAdd(48); break; case 49: @@ -15918,22 +15945,22 @@ else if (curChar == 39) case 51: if (curChar != 46) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); break; case 52: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); break; case 53: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAddStates(35, 37); break; case 54: @@ -15951,8 +15978,8 @@ else if (curChar == 39) case 57: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(57); break; case 58: @@ -15972,12 +15999,12 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 60; break; case 62: - if (curChar == 39 && kind > 758) - kind = 758; + if (curChar == 39 && kind > 759) + kind = 759; break; case 64: - if (curChar == 39 && kind > 765) - kind = 765; + if (curChar == 39 && kind > 766) + kind = 766; break; case 67: case 69: @@ -15993,8 +16020,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 69; break; case 71: - if (curChar == 39 && kind > 760) - kind = 760; + if (curChar == 39 && kind > 761) + kind = 761; break; case 72: if (curChar == 38) @@ -16017,8 +16044,8 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 75; break; case 77: - if (curChar == 34 && kind > 823) - kind = 823; + if (curChar == 34 && kind > 826) + kind = 826; break; case 79: if (curChar == 32) @@ -16045,14 +16072,14 @@ else if (curChar == 39) jjstateSet[jjnewStateCnt++] = 91; break; case 91: - if ((0xffff7fffffffffffL & l) != 0L && kind > 810) - kind = 810; + if ((0xffff7fffffffffffL & l) != 0L && kind > 813) + kind = 813; break; case 93: if (curChar != 47) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(25, 27); break; default : break; @@ -16075,8 +16102,8 @@ else if (curChar == 96) jjCheckNAddTwoStates(30, 32); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if ((0x20000000200000L & l) != 0L) @@ -16097,8 +16124,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -16109,8 +16136,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -16121,8 +16148,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -16133,8 +16160,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -16145,8 +16172,8 @@ else if (curChar == 95) jjCheckNAddStates(0, 2); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } break; @@ -16157,13 +16184,13 @@ else if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 85; else if ((0x1000000010L & l) != 0L) { - if (kind > 768) - kind = 768; + if (kind > 769) + kind = 769; } if ((0x10000000100000L & l) != 0L) { - if (kind > 769) - kind = 769; + if (kind > 770) + kind = 770; } break; case 63: @@ -16214,8 +16241,8 @@ else if ((0x1000000010L & l) != 0L) jjCheckNAddStates(28, 31); break; case 24: - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(25, 27); break; case 29: @@ -16235,21 +16262,21 @@ else if ((0x1000000010L & l) != 0L) jjstateSet[jjnewStateCnt++] = 31; break; case 33: - if (curChar == 96 && kind > 818) - kind = 818; + if (curChar == 96 && kind > 821) + kind = 821; break; case 34: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -16259,15 +16286,15 @@ else if ((0x1000000010L & l) != 0L) case 39: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(58, 59); break; case 41: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 41; break; case 46: @@ -16292,32 +16319,32 @@ else if ((0x1000000010L & l) != 0L) jjAddStates(48, 55); break; case 80: - if ((0x1000000010L & l) != 0L && kind > 768) - kind = 768; + if ((0x1000000010L & l) != 0L && kind > 769) + kind = 769; break; case 82: - if ((0x10000000100000L & l) != 0L && kind > 769) - kind = 769; + if ((0x10000000100000L & l) != 0L && kind > 770) + kind = 770; break; case 84: if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 85; break; case 85: - if ((0x8000000080000L & l) != 0L && kind > 770) - kind = 770; + if ((0x8000000080000L & l) != 0L && kind > 771) + kind = 771; break; case 87: if ((0x4000000040L & l) != 0L) jjstateSet[jjnewStateCnt++] = 88; break; case 88: - if ((0x400000004000L & l) != 0L && kind > 771) - kind = 771; + if ((0x400000004000L & l) != 0L && kind > 772) + kind = 772; break; case 91: - if (kind > 810) - kind = 810; + if (kind > 813) + kind = 813; break; default : break; } @@ -16337,8 +16364,8 @@ else if ((0x1000000010L & l) != 0L) case 0: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -16347,8 +16374,8 @@ else if ((0x1000000010L & l) != 0L) case 1: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -16359,8 +16386,8 @@ else if ((0x1000000010L & l) != 0L) case 96: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -16371,8 +16398,8 @@ else if ((0x1000000010L & l) != 0L) case 95: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -16383,8 +16410,8 @@ else if ((0x1000000010L & l) != 0L) case 66: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -16395,8 +16422,8 @@ else if ((0x1000000010L & l) != 0L) case 16: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -16431,8 +16458,8 @@ else if ((0x1000000010L & l) != 0L) case 24: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(25, 27); break; case 30: @@ -16442,15 +16469,15 @@ else if ((0x1000000010L & l) != 0L) case 34: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 35: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(35); break; case 36: @@ -16460,15 +16487,15 @@ else if ((0x1000000010L & l) != 0L) case 39: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(58, 59); break; case 41: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 41; break; case 59: @@ -16484,8 +16511,8 @@ else if ((0x1000000010L & l) != 0L) jjAddStates(45, 47); break; case 91: - if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 810) - kind = 810; + if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 813) + kind = 813; break; default : break; } @@ -16509,402 +16536,402 @@ private final int jjStopStringLiteralDfa_3(int pos, long active0, long active1, switch (pos) { case 0: - if ((active11 & 0x1000L) != 0L) + if ((active10 & 0x7fffffe000000L) != 0L) { - jjmatchedKind = 821; - return 1; + jjmatchedKind = 824; + return 31; } - if ((active12 & 0x10000200L) != 0L) - return 76; - if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0xffffffffffffffc0L) != 0L || (active3 & 0xff8001ffffffffffL) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xfffffff000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffc000001ffffffL) != 0L || (active11 & 0x4e57ff27efffL) != 0L) + if ((active11 & 0x2000L) != 0L) { - jjmatchedKind = 821; - return 77; + jjmatchedKind = 824; + return 1; } - if ((active12 & 0x20000000L) != 0L) + if ((active12 & 0x20000400L) != 0L) + return 76; + if ((active12 & 0x40000000L) != 0L) return 58; - if ((active12 & 0x10L) != 0L) - return 78; - if ((active12 & 0x90001000000L) != 0L) + if ((active12 & 0x20L) != 0L) + return 77; + if ((active12 & 0x480002000000L) != 0L) return 74; - if ((active10 & 0x3fffffe000000L) != 0L) + if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0xffffffffffffffc0L) != 0L || (active3 & 0xff8001ffffffffffL) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xfffffff000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfff8000001ffffffL) != 0L || (active11 & 0x9caffe4fdfffL) != 0L) { - jjmatchedKind = 821; - return 31; + jjmatchedKind = 824; + return 78; } - if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x31a800d80000L) != 0L || (active12 & 0x200000000L) != 0L) - return 77; - if ((active12 & 0x600000L) != 0L) + if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x635001b00000L) != 0L || (active12 & 0x1000000000L) != 0L) + return 78; + if ((active12 & 0xc00000L) != 0L) return 11; - if ((active12 & 0x40000000L) != 0L) + if ((active12 & 0x80000000L) != 0L) return 79; return -1; case 1: - if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x3efd5feeffffL) != 0L) + if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x7dfabfddffffL) != 0L) { if (jjmatchedPos != 1) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 1; } - return 77; + return 78; } - if ((active12 & 0x90000000000L) != 0L) + if ((active12 & 0x480000000000L) != 0L) return 72; - if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x4102a0110000L) != 0L) - return 77; + if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x820540220000L) != 0L) + return 78; return -1; case 2: - if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0x57fffffeefffL) != 0L) + if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0xaffffffddfffL) != 0L) { if (jjmatchedPos != 2) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 2; } - return 77; + return 78; } - if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x280000001000L) != 0L) - return 77; + if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x500000002000L) != 0L) + return 78; return -1; case 3: - if ((active2 & 0x8000000000000000L) != 0L) - return 80; - if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0xa0025f00010e0000L) != 0L || (active11 & 0x180100e3c7L) != 0L) - return 77; - if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0x5ffda0fffef1fffeL) != 0L || (active11 & 0x7fe7fefe0c38L) != 0L) + if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0xbffb41fffef1fffeL) != 0L || (active11 & 0xffcffdfc1870L) != 0L) { if (jjmatchedPos != 3) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 3; } - return 77; + return 78; } + if ((active2 & 0x8000000000000000L) != 0L) + return 80; + if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0x4004be00010e0000L) != 0L || (active11 & 0x300201c78fL) != 0L) + return 78; return -1; case 4: - if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0x5fe01e5f9ef5effeL) != 0L || (active11 & 0x3ce7ddde05b4L) != 0L) + if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0xbfc03cbf9ef5effeL) != 0L || (active11 & 0x79cfbbbc0b68L) != 0L) { if (jjmatchedPos != 4) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 4; } - return 77; + return 78; } if ((active2 & 0x8000000000000000L) != 0L) return 80; - if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x1da0a060001000L) != 0L || (active11 & 0x430022204809L) != 0L) - return 77; + if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x3b414060001000L) != 0L || (active11 & 0x860044409012L) != 0L) + return 78; return -1; case 5: - if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0x5ff01e071e75effeL) != 0L || (active11 & 0x3ce7dfee0514L) != 0L) + if ((active2 & 0x8000000000000000L) != 0L) + return 80; + if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x1000a880800000L) != 0L || (active11 & 0x200140L) != 0L) + return 78; + if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0xbfe03c171e75effeL) != 0L || (active11 & 0x79cfbfdc0a28L) != 0L) { if (jjmatchedPos != 5) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 5; } - return 77; + return 78; } - if ((active2 & 0x8000000000000000L) != 0L) - return 80; - if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x8005880800000L) != 0L || (active11 & 0x1000a0L) != 0L) - return 77; return -1; case 6: - if ((active2 & 0x8000000000000000L) != 0L) - return 80; - if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x1f2000070241e000L) != 0L || (active11 & 0x18c100040500L) != 0L) - return 77; - if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x40d01e001c340ffeL) != 0L || (active11 & 0x2426dffa0014L) != 0L) + if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x81a03c101c340ffeL) != 0L || (active11 & 0x484dbff40028L) != 0L) { if (jjmatchedPos != 6) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 6; } - return 77; + return 78; } - return -1; - case 7: if ((active2 & 0x8000000000000000L) != 0L) return 80; - if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0x50000000300004L) != 0L || (active11 & 0x444020004L) != 0L) - return 77; - if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0x50801e001c05cffaL) != 0L || (active11 & 0x24229bf80010L) != 0L) + if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x3e4000070241e000L) != 0L || (active11 & 0x318200080a00L) != 0L) + return 78; + return -1; + case 7: + if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0xa1003c001c05cffaL) != 0L || (active11 & 0x484537f00020L) != 0L) { if (jjmatchedPos != 7) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 7; } - return 77; + return 78; } + if ((active2 & 0x8000000000000000L) != 0L) + return 80; + if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0xa0001000300004L) != 0L || (active11 & 0x888040008L) != 0L) + return 78; return -1; case 8: - if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x10001e001805c87aL) != 0L || (active11 & 0x24208be80010L) != 0L) + if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x20003c001805c87aL) != 0L || (active11 & 0x484117d00020L) != 0L) { if (jjmatchedPos != 8) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 8; } - return 77; + return 78; } - if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x4080000004000780L) != 0L || (active11 & 0x210100000L) != 0L) - return 77; + if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x8100000004000780L) != 0L || (active11 & 0x420200000L) != 0L) + return 78; return -1; case 9: - if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x1e001801cc7aL) != 0L || (active11 & 0x200081680010L) != 0L) + if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x2000000000040100L) != 0L || (active11 & 0x84015000000L) != 0L) + return 78; + if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x3c001801cc7aL) != 0L || (active11 & 0x400102d00020L) != 0L) { if (jjmatchedPos != 9) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 9; } - return 77; + return 78; } - if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x1000000000040100L) != 0L || (active11 & 0x4200a800000L) != 0L) - return 77; return -1; case 10: - if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x81400000L) != 0L) - return 77; - if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x1e001001c402L) != 0L || (active11 & 0x200000280010L) != 0L) + if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x102800000L) != 0L) + return 78; + if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x3c001001c402L) != 0L || (active11 & 0x400000500020L) != 0L) { if (jjmatchedPos != 10) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 10; } - return 77; + return 78; } return -1; case 11: - if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x1e0010014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x3c0010014472L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 11) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 11; } - return 77; + return 78; } - if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x80010L) != 0L) - return 77; + if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x100020L) != 0L) + return 78; return -1; case 12: - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x1e0000014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x3c0000014472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 12; - return 77; + return 78; } if ((active0 & 0x1000000000L) != 0L || (active1 & 0x800000000000L) != 0L || (active2 & 0x40000001000L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x200000000L) != 0L || (active8 & 0x80000000L) != 0L || (active9 & 0x2400000000108100L) != 0L || (active10 & 0x10000000L) != 0L) - return 77; + return 78; return -1; case 13: if ((active1 & 0x4000000000200000L) != 0L || (active2 & 0x8000L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x10000L) != 0L || (active6 & 0x8000003000000L) != 0L || (active7 & 0x4000400000008000L) != 0L || (active9 & 0x800000000024000L) != 0L || (active10 & 0x10000L) != 0L) - return 77; - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x1e0000004472L) != 0L || (active11 & 0x200000200000L) != 0L) + return 78; + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x3c0000004472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 13; - return 77; + return 78; } return -1; case 14: if ((active0 & 0x20000000000L) != 0L || (active1 & 0x100084800000200L) != 0L || (active5 & 0x280L) != 0L || (active6 & 0x30000000000L) != 0L || (active7 & 0x100100000000L) != 0L || (active8 & 0x8000000000000000L) != 0L || (active9 & 0x5000004200010000L) != 0L || (active10 & 0x4402L) != 0L) - return 77; - if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + return 78; + if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 14; - return 77; + return 78; } return -1; case 15: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 15) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 15; } - return 77; + return 78; } if ((active0 & 0x800000L) != 0L || (active1 & 0x10c400020L) != 0L || (active2 & 0x180000000000000L) != 0L || (active8 & 0x1e000000000000L) != 0L || (active9 & 0x1L) != 0L) - return 77; + return 78; return -1; case 16: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 16) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 16; } - return 77; + return 78; } if ((active1 & 0x8000100000L) != 0L || (active2 & 0x1L) != 0L || (active5 & 0x1000000000000000L) != 0L || (active7 & 0x400000000L) != 0L || (active8 & 0x70e0000000000000L) != 0L) - return 77; + return 78; return -1; case 17: if ((active1 & 0x2000000080L) != 0L || (active8 & 0x400000000000000L) != 0L) - return 77; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + return 78; + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 17; - return 77; + return 78; } return -1; case 18: - if ((active8 & 0xb00000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x10L) != 0L) - return 77; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 18) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 18; } - return 77; + return 78; } + if ((active8 & 0xb00000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x10L) != 0L) + return 78; return -1; case 19: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 19; - return 77; + return 78; } if ((active1 & 0x100L) != 0L || (active5 & 0x20000L) != 0L || (active7 & 0x80000000L) != 0L) - return 77; + return 78; return -1; case 20: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x8000040L) != 0L || (active2 & 0x100000000000000L) != 0L || (active7 & 0x200000000L) != 0L) + return 78; + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 20; - return 77; + return 78; } - if ((active0 & 0x1000000L) != 0L || (active1 & 0x8000040L) != 0L || (active2 & 0x100000000000000L) != 0L || (active7 & 0x200000000L) != 0L) - return 77; return -1; case 21: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 21; - return 77; + return 78; } - if ((active2 & 0x2000L) != 0L || (active10 & 0xc0000000020L) != 0L) - return 77; + if ((active2 & 0x2000L) != 0L || (active10 & 0x180000000020L) != 0L) + return 78; return -1; case 22: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 22; - return 77; + return 78; } if ((active6 & 0x10000000L) != 0L) - return 77; + return 78; return -1; case 23: - if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x100000000040L) != 0L) - return 77; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x20000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x200000000040L) != 0L) + return 78; + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x40000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 23; - return 77; + return 78; } return -1; case 24: - if ((active6 & 0x20000000L) != 0L || (active10 & 0x20000000000L) != 0L) - return 77; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active6 & 0x20000000L) != 0L || (active10 & 0x40000000000L) != 0L) + return 78; + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 24; - return 77; + return 78; } return -1; case 25: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 25; - return 77; + return 78; } - if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x200000L) != 0L) - return 77; + if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x400000L) != 0L) + return 78; return -1; case 26: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 26; - return 77; + return 78; } if ((active2 & 0x4000L) != 0L || (active8 & 0xc0000000000000L) != 0L) - return 77; + return 78; return -1; case 27: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 27; - return 77; + return 78; } return -1; case 28: - if ((active8 & 0x200000000000000L) != 0L) - return 77; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 28; - return 77; + return 78; } + if ((active8 & 0x200000000000000L) != 0L) + return 78; return -1; case 29: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 29; - return 77; + return 78; } return -1; case 30: - if ((active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L) + return 78; + if ((active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 30; - return 77; + return 78; } - if ((active1 & 0x400000000000000L) != 0L) - return 77; return -1; case 31: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 31; - return 77; + return 78; } if ((active2 & 0x2L) != 0L) - return 77; + return 78; return -1; case 32: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 821; + jjmatchedKind = 824; jjmatchedPos = 32; - return 77; + return 78; } return -1; default : @@ -16928,74 +16955,76 @@ private final int jjMoveStringLiteralDfa0_3() switch(curChar) { case 33: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000L); case 34: - return jjStartNfaWithStates_3(0, 798, 79); + return jjStartNfaWithStates_3(0, 799, 79); case 36: - return jjStartNfaWithStates_3(0, 801, 77); + return jjStartNfaWithStates_3(0, 804, 78); case 37: - return jjStopAtPos(0, 793); + return jjStopAtPos(0, 794); + case 38: + return jjStopAtPos(0, 802); case 39: - return jjStartNfaWithStates_3(0, 797, 58); + return jjStartNfaWithStates_3(0, 798, 58); case 40: - return jjStopAtPos(0, 766); - case 41: return jjStopAtPos(0, 767); + case 41: + return jjStopAtPos(0, 768); case 42: - jjmatchedKind = 791; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000000L); + jjmatchedKind = 792; + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000000L); case 43: - return jjStopAtPos(0, 788); + return jjStopAtPos(0, 789); case 44: - return jjStopAtPos(0, 778); + return jjStopAtPos(0, 779); case 45: - jjmatchedKind = 789; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000L); + jjmatchedKind = 790; + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000L); case 46: - jjmatchedKind = 777; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + jjmatchedKind = 778; + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L); case 47: - jjmatchedKind = 792; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x90000000000L); + jjmatchedKind = 793; + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x480000000000L); case 58: - jjmatchedKind = 783; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L); + jjmatchedKind = 784; + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000000L); case 59: - return jjStopAtPos(0, 776); + return jjStopAtPos(0, 777); case 60: - jjmatchedKind = 781; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x50000L); + jjmatchedKind = 782; + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000a0000L); case 61: - jjmatchedKind = 779; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); - case 62: jjmatchedKind = 780; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + case 62: + jjmatchedKind = 781; + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L); case 63: - return jjStopAtPos(0, 782); + return jjStopAtPos(0, 783); case 91: - return jjStopAtPos(0, 774); - case 93: return jjStopAtPos(0, 775); + case 93: + return jjStopAtPos(0, 776); case 94: - return jjStopAtPos(0, 800); + return jjStopAtPos(0, 801); case 65: case 97: jjmatchedKind = 3; - return jjMoveStringLiteralDfa1_3(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x110000180000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x220000300000L, 0x0L); case 66: case 98: - return jjMoveStringLiteralDfa1_3(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L, 0x0L); case 67: case 99: jjmatchedKind = 52; - return jjMoveStringLiteralDfa1_3(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa000c00000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x14001800000L, 0x0L); case 68: case 100: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000L, 0x0L); case 69: case 101: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L, 0x0L); case 70: case 102: return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x1fffff80000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); @@ -17008,67 +17037,67 @@ private final int jjMoveStringLiteralDfa0_3() return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x1f80000000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 73: case 105: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa0010000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x140020000L, 0x0L); case 74: case 106: return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0xffe0000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 75: case 107: jjmatchedKind = 296; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000000L, 0x0L); case 76: case 108: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); case 77: case 109: jjmatchedKind = 322; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x200000000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x400000000000L, 0x0L); case 78: case 110: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L, 0x0L); case 79: case 111: return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xf800000000000000L, 0x3fffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 80: case 112: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x440000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x880000000L, 0x0L); case 81: case 113: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x20000000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x40000000000L, 0x0L); case 82: case 114: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x80000000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x100000000000L, 0x0L); case 83: case 115: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x45000000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x8a000000000L, 0x0L); case 84: case 116: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x400000020000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x800000040000L, 0x0L); case 85: case 117: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3fffffe000000L, 0x0L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffffe000000L, 0x0L, 0x0L); case 86: case 118: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3ffc000000000000L, 0x2000000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7ff8000000000000L, 0x4000000L, 0x0L); case 87: case 119: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000000000000000L, 0xc200fffL, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000000000000L, 0x18401fffL, 0x0L); case 88: case 120: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000L, 0x0L); case 89: case 121: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x6000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000L, 0x0L); case 90: case 122: - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000L, 0x0L); + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000L, 0x0L); case 123: - return jjStartNfaWithStates_3(0, 772, 78); + return jjStartNfaWithStates_3(0, 773, 77); case 124: - jjmatchedKind = 799; - return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x4000000L); + jjmatchedKind = 800; + return jjMoveStringLiteralDfa1_3(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); case 125: - return jjStopAtPos(0, 773); + return jjStopAtPos(0, 774); default : return jjMoveNfa_3(0, 0); } @@ -17083,55 +17112,59 @@ private final int jjMoveStringLiteralDfa1_3(long active0, long active1, long act switch(curChar) { case 42: - if ((active12 & 0x80000000000L) != 0L) + if ((active12 & 0x400000000000L) != 0L) { - jjmatchedKind = 811; + jjmatchedKind = 814; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x10000000000L); + return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x80000000000L); case 46: - if ((active12 & 0x10000000L) != 0L) - return jjStopAtPos(1, 796); + if ((active12 & 0x20000000L) != 0L) + return jjStopAtPos(1, 797); break; case 47: - if ((active12 & 0x20000000000L) != 0L) - return jjStopAtPos(1, 809); + if ((active12 & 0x100000000000L) != 0L) + return jjStopAtPos(1, 812); break; case 58: - if ((active12 & 0x400000000L) != 0L) - return jjStopAtPos(1, 802); + if ((active12 & 0x2000000000L) != 0L) + return jjStopAtPos(1, 805); + break; + case 60: + if ((active12 & 0x800000000L) != 0L) + return jjStopAtPos(1, 803); break; case 61: - if ((active12 & 0x10000L) != 0L) - return jjStopAtPos(1, 784); - else if ((active12 & 0x20000L) != 0L) + if ((active12 & 0x20000L) != 0L) return jjStopAtPos(1, 785); - else if ((active12 & 0x80000L) != 0L) - return jjStopAtPos(1, 787); + else if ((active12 & 0x40000L) != 0L) + return jjStopAtPos(1, 786); + else if ((active12 & 0x100000L) != 0L) + return jjStopAtPos(1, 788); break; case 62: - if ((active12 & 0x40000L) != 0L) - return jjStopAtPos(1, 786); - else if ((active12 & 0x400000L) != 0L) - return jjStopAtPos(1, 790); - else if ((active12 & 0x8000000L) != 0L) - return jjStopAtPos(1, 795); + if ((active12 & 0x80000L) != 0L) + return jjStopAtPos(1, 787); + else if ((active12 & 0x800000L) != 0L) + return jjStopAtPos(1, 791); + else if ((active12 & 0x10000000L) != 0L) + return jjStopAtPos(1, 796); break; case 65: case 97: - return jjMoveStringLiteralDfa2_3(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0x7fc000000000000L, active11, 0x200443c40000L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0xff8000000000000L, active11, 0x400887880000L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa2_3(active0, 0x70L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 67: case 99: - return jjMoveStringLiteralDfa2_3(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x1000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x2000000000L, active12, 0L); case 68: case 100: return jjMoveStringLiteralDfa2_3(active0, 0x700L, active1, 0L, active2, 0L, active3, 0x2000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 69: case 101: - return jjMoveStringLiteralDfa2_3(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xd800000002000000L, active11, 0x84000026001L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xb000000002000000L, active11, 0x10800004c003L, active12, 0L); case 70: case 102: if ((active5 & 0x8000000000000000L) != 0L) @@ -17139,18 +17172,18 @@ else if ((active12 & 0x8000000L) != 0L) jjmatchedKind = 383; jjmatchedPos = 1; } - else if ((active11 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(1, 720, 77); - return jjMoveStringLiteralDfa2_3(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000L, active12, 0L); + else if ((active11 & 0x20000L) != 0L) + return jjStartNfaWithStates_3(1, 721, 78); + return jjMoveStringLiteralDfa2_3(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); case 71: case 103: return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 72: case 104: - return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0xeL, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0x1cL, active12, 0L); case 73: case 105: - return jjMoveStringLiteralDfa2_3(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x2000000000000000L, active11, 0x8000001f0L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x4000000000000000L, active11, 0x10000003e0L, active12, 0L); case 75: case 107: return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -17159,7 +17192,7 @@ else if ((active11 & 0x10000L) != 0L) return jjMoveStringLiteralDfa2_3(active0, 0x80000001f000L, active1, 0xf000L, active2, 0xc00000000000000L, active3, 0x8000400006000000L, active4, 0L, active5, 0L, active6, 0x1c00000000002L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 77: case 109: - return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x1000L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x2000L, active12, 0L); case 78: case 110: if ((active4 & 0x10L) != 0L) @@ -17168,13 +17201,13 @@ else if ((active11 & 0x10000L) != 0L) jjmatchedPos = 1; } else if ((active4 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(1, 316, 77); + return jjStartNfaWithStates_3(1, 316, 78); else if ((active6 & 0x8L) != 0L) { jjmatchedKind = 387; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_3(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0xffc000000L, active11, 0x1000b0000000L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1ffc000000L, active11, 0x200160000000L, active12, 0L); case 79: case 111: if ((active3 & 0x800000000000L) != 0L) @@ -17192,10 +17225,10 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 640; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_3(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x40a300008200L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x814600010400L, active12, 0L); case 80: case 112: - return jjMoveStringLiteralDfa2_3(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0x7000000000L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0xe000000000L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x8L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xfffffffe00000000L, active9, 0x7fffffL, active10, 0L, active11, 0L, active12, 0L); @@ -17206,7 +17239,7 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 393; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_3(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0xc200c00L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0x18401800L, active12, 0L); case 83: case 115: if ((active0 & 0x2000000L) != 0L) @@ -17219,7 +17252,7 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 281; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_3(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3f8000000000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x7f0000000000L, active11, 0x20000000000L, active12, 0L); case 84: case 116: if ((active0 & 0x100000000L) != 0L) @@ -17227,10 +17260,10 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 32; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_3(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x1c00000000000L, active11, 0x40000100000L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x3800000000000L, active11, 0x80000200000L, active12, 0L); case 85: case 117: - return jjMoveStringLiteralDfa2_3(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x2000000c00000L, active11, 0x20000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_3(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x4000000c00000L, active11, 0x40000000000L, active12, 0L); case 86: case 118: return jjMoveStringLiteralDfa2_3(active0, 0x2000000000L, active1, 0L, active2, 0L, active3, 0x40L, active4, 0L, active5, 0L, active6, 0x3c0000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -17240,11 +17273,11 @@ else if ((active4 & 0x2000000L) != 0L) case 89: case 121: if ((active0 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(1, 51, 77); + return jjStartNfaWithStates_3(1, 51, 78); return jjMoveStringLiteralDfa2_3(active0, 0L, active1, 0L, active2, 0x1c0000000000020L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x3c0000000000L, active10, 0x1000000L, active11, 0L, active12, 0L); case 124: - if ((active12 & 0x4000000L) != 0L) - return jjStopAtPos(1, 794); + if ((active12 & 0x8000000L) != 0L) + return jjStopAtPos(1, 795); break; default : break; @@ -17263,33 +17296,33 @@ private final int jjMoveStringLiteralDfa2_3(long old0, long active0, long old1, switch(curChar) { case 43: - if ((active12 & 0x10000000000L) != 0L) - return jjStopAtPos(2, 808); + if ((active12 & 0x80000000000L) != 0L) + return jjStopAtPos(2, 811); break; case 65: case 97: if ((active0 & 0x100L) != 0L) - return jjStartNfaWithStates_3(2, 8, 77); - return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x8000000ffcL, active11, 0x14100c006400L, active12, 0L); + return jjStartNfaWithStates_3(2, 8, 78); + return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x10000000ffcL, active11, 0x28201800c800L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0x20000000020000L, active2, 0L, active3, 0L, active4, 0x100100000000000L, active5, 0L, active6, 0x8000000000000000L, active7, 0L, active8, 0L, active9, 0x1c07e00000000L, active10, 0x4000000L, active11, 0L, active12, 0L); case 67: case 99: if ((active0 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(2, 27, 77); + return jjStartNfaWithStates_3(2, 27, 78); else if ((active2 & 0x200000L) != 0L) { jjmatchedKind = 149; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x10c40000L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x21880000L, active12, 0L); case 68: case 100: if ((active0 & 0x200L) != 0L) - return jjStartNfaWithStates_3(2, 9, 77); + return jjStartNfaWithStates_3(2, 9, 78); else if ((active0 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(2, 17, 77); + return jjStartNfaWithStates_3(2, 17, 78); else if ((active2 & 0x4000000000000000L) != 0L) { jjmatchedKind = 190; @@ -17301,17 +17334,17 @@ else if ((active5 & 0x8000000L) != 0L) jjmatchedPos = 2; } else if ((active6 & 0x2L) != 0L) - return jjStartNfaWithStates_3(2, 385, 77); + return jjStartNfaWithStates_3(2, 385, 78); else if ((active6 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(2, 406, 77); - return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x4000001020000000L, active11, 0x20000010L, active12, 0L); + return jjStartNfaWithStates_3(2, 406, 78); + return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x8000002020000000L, active11, 0x40000020L, active12, 0L); case 69: case 101: if ((active0 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(2, 20, 77); + return jjStartNfaWithStates_3(2, 20, 78); else if ((active6 & 0x10L) != 0L) - return jjStartNfaWithStates_3(2, 388, 77); - return jjMoveStringLiteralDfa3_3(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0xa0001f0000401000L, active11, 0x2000000000fL, active12, 0L); + return jjStartNfaWithStates_3(2, 388, 78); + return jjMoveStringLiteralDfa3_3(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0x40003e0000401000L, active11, 0x4000000001fL, active12, 0L); case 70: case 102: if ((active7 & 0x200L) != 0L) @@ -17319,22 +17352,22 @@ else if ((active6 & 0x10L) != 0L) jjmatchedKind = 457; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_3(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x1c00000000000L, active11, 0x80000080000L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x3800000000000L, active11, 0x100000100000L, active12, 0L); case 71: case 103: if ((active0 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(2, 37, 77); + return jjStartNfaWithStates_3(2, 37, 78); else if ((active4 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(2, 301, 77); - return jjMoveStringLiteralDfa3_3(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L, active12, 0L); + return jjStartNfaWithStates_3(2, 301, 78); + return jjMoveStringLiteralDfa3_3(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000L, active12, 0L); case 72: case 104: return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x8020000000000L, active6, 0x4000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 73: case 105: if ((active6 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(2, 432, 77); - return jjMoveStringLiteralDfa3_3(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x22000c007e000L, active11, 0x200800L, active12, 0L); + return jjStartNfaWithStates_3(2, 432, 78); + return jjMoveStringLiteralDfa3_3(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x44000c007e000L, active11, 0x401000L, active12, 0L); case 74: case 106: return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -17353,14 +17386,14 @@ else if ((active8 & 0x200000000L) != 0L) jjmatchedKind = 545; jjmatchedPos = 2; } - else if ((active11 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(2, 716, 77); - return jjMoveStringLiteralDfa3_3(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x1c000000000000L, active11, 0xa82000000L, active12, 0L); + else if ((active11 & 0x2000L) != 0L) + return jjStartNfaWithStates_3(2, 717, 78); + return jjMoveStringLiteralDfa3_3(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x38000000000000L, active11, 0x1504000000L, active12, 0L); case 77: case 109: if ((active9 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(2, 616, 77); - return jjMoveStringLiteralDfa3_3(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x8000020000L, active12, 0L); + return jjStartNfaWithStates_3(2, 616, 78); + return jjMoveStringLiteralDfa3_3(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x10000040000L, active12, 0L); case 78: case 110: if ((active5 & 0x800000L) != 0L) @@ -17368,10 +17401,10 @@ else if ((active11 & 0x1000L) != 0L) jjmatchedKind = 343; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_3(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x2000008020L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x4000010040L, active12, 0L); case 79: case 111: - return jjMoveStringLiteralDfa3_3(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x200000L, active12, 0L); case 80: case 112: if ((active3 & 0x4000L) != 0L) @@ -17380,10 +17413,10 @@ else if ((active11 & 0x1000L) != 0L) jjmatchedPos = 2; } else if ((active3 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(2, 250, 77); + return jjStartNfaWithStates_3(2, 250, 78); else if ((active5 & 0x8L) != 0L) - return jjStartNfaWithStates_3(2, 323, 77); - return jjMoveStringLiteralDfa3_3(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x2201000002L, active11, 0L, active12, 0L); + return jjStartNfaWithStates_3(2, 323, 78); + return jjMoveStringLiteralDfa3_3(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x4201000002L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -17399,7 +17432,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 422; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_3(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x1fe0000000000000L, active11, 0x4040000200L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x3fc0000000000000L, active11, 0x8080000400L, active12, 0L); case 83: case 115: if ((active0 & 0x10L) != 0L) @@ -17407,22 +17440,22 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 4; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_3(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x4002000000L, active11, 0x400000000L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x9002000000L, active11, 0x800000000L, active12, 0L); case 84: case 116: if ((active0 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(2, 46, 77); + return jjStartNfaWithStates_3(2, 46, 78); else if ((active2 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(2, 177, 77); + return jjStartNfaWithStates_3(2, 177, 78); else if ((active3 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(2, 237, 77); + return jjStartNfaWithStates_3(2, 237, 78); else if ((active4 & 0x40000L) != 0L) { jjmatchedKind = 274; jjmatchedPos = 2; } else if ((active5 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(2, 370, 77); + return jjStartNfaWithStates_3(2, 370, 78); else if ((active6 & 0x8000L) != 0L) { jjmatchedKind = 399; @@ -17433,7 +17466,7 @@ else if ((active8 & 0x40000L) != 0L) jjmatchedKind = 530; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_3(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x4000010001c0L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x800002000380L, active12, 0L); case 85: case 117: return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0x1000000000000L, active2, 0x4000000000000L, active3, 0x1800000100000008L, active4, 0L, active5, 0L, active6, 0L, active7, 0x780000000000L, active8, 0x10000000L, active9, 0x8000000000000L, active10, 0x180000L, active11, 0L, active12, 0L); @@ -17443,9 +17476,9 @@ else if ((active8 & 0x40000L) != 0L) case 87: case 119: if ((active2 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(2, 179, 77); + return jjStartNfaWithStates_3(2, 179, 78); else if ((active5 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(2, 364, 77); + return jjStartNfaWithStates_3(2, 364, 78); else if ((active7 & 0x800000000000L) != 0L) { jjmatchedKind = 495; @@ -17459,24 +17492,24 @@ else if ((active7 & 0x800000000000L) != 0L) jjmatchedKind = 330; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L, active12, 0L); case 89: case 121: if ((active0 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(2, 18, 77); + return jjStartNfaWithStates_3(2, 18, 78); else if ((active2 & 0x10000L) != 0L) { jjmatchedKind = 144; jjmatchedPos = 2; } else if ((active2 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(2, 180, 77); + return jjStartNfaWithStates_3(2, 180, 78); else if ((active4 & 0x20000000000L) != 0L) { jjmatchedKind = 297; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_3(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_3(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x20000000000L, active12, 0L); case 90: case 122: return jjMoveStringLiteralDfa3_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -17499,15 +17532,15 @@ private final int jjMoveStringLiteralDfa3_3(long old0, long active0, long old1, case 45: return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 49: - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x800000000000L, active11, 0L); - case 51: return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1000000000000L, active11, 0L); + case 51: + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000000000L, active11, 0L); case 56: - if ((active10 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(3, 686, 77); + if ((active10 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_3(3, 687, 78); break; case 95: - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0x60000000200002L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0xc0000000200002L, active11, 0x400000000000L); case 65: case 97: if ((active2 & 0x40L) != 0L) @@ -17516,15 +17549,15 @@ private final int jjMoveStringLiteralDfa3_3(long old0, long active0, long old1, jjmatchedPos = 3; } else if ((active4 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(3, 285, 77); - return jjMoveStringLiteralDfa4_3(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x1400001000L, active11, 0x400041000000L); + return jjStartNfaWithStates_3(3, 285, 78); + return jjMoveStringLiteralDfa4_3(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x2400001000L, active11, 0x800082000000L); case 66: case 98: if ((active0 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(3, 47, 77); + return jjStartNfaWithStates_3(3, 47, 78); else if ((active1 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(3, 78, 77); - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000800000L, active11, 0L); + return jjStartNfaWithStates_3(3, 78, 78); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000800000L, active11, 0L); case 67: case 99: if ((active2 & 0x4000000000L) != 0L) @@ -17537,11 +17570,11 @@ else if ((active3 & 0x800L) != 0L) jjmatchedKind = 203; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_3(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x100000002000000L, active11, 0L); + return jjMoveStringLiteralDfa4_3(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x200000002000000L, active11, 0L); case 68: case 100: if ((active3 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 249, 77); + return jjStartNfaWithStates_3(3, 249, 78); else if ((active4 & 0x8000000000000L) != 0L) { jjmatchedKind = 307; @@ -17552,97 +17585,97 @@ else if ((active7 & 0x20L) != 0L) jjmatchedKind = 453; jjmatchedPos = 3; } - else if ((active10 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 689, 77); - return jjMoveStringLiteralDfa4_3(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x20L); + else if ((active10 & 0x4000000000000L) != 0L) + return jjStartNfaWithStates_3(3, 690, 78); + return jjMoveStringLiteralDfa4_3(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x40L); case 69: case 101: if ((active0 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 58, 77); + return jjStartNfaWithStates_3(3, 58, 78); else if ((active1 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 117, 77); + return jjStartNfaWithStates_3(3, 117, 78); else if ((active2 & 0x100L) != 0L) { jjmatchedKind = 136; jjmatchedPos = 3; } else if ((active2 & 0x800000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 187, 77); + return jjStartNfaWithStates_3(3, 187, 78); else if ((active3 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(3, 227, 77); + return jjStartNfaWithStates_3(3, 227, 78); else if ((active4 & 0x200000000000000L) != 0L) { jjmatchedKind = 313; jjmatchedPos = 3; } else if ((active5 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(3, 353, 77); + return jjStartNfaWithStates_3(3, 353, 78); else if ((active5 & 0x1000000000L) != 0L) { jjmatchedKind = 356; jjmatchedPos = 3; } else if ((active5 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(3, 367, 77); + return jjStartNfaWithStates_3(3, 367, 78); else if ((active7 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(3, 488, 77); + return jjStartNfaWithStates_3(3, 488, 78); else if ((active8 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(3, 536, 77); + return jjStartNfaWithStates_3(3, 536, 78); else if ((active8 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(3, 539, 77); + return jjStartNfaWithStates_3(3, 539, 78); else if ((active9 & 0x20000000000000L) != 0L) { jjmatchedKind = 629; jjmatchedPos = 3; } else if ((active10 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(3, 659, 77); + return jjStartNfaWithStates_3(3, 659, 78); else if ((active10 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(3, 664, 77); - else if ((active11 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(3, 719, 77); - return jjMoveStringLiteralDfa4_3(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0x6820000000L, active11, 0x20000000L); + return jjStartNfaWithStates_3(3, 664, 78); + else if ((active11 & 0x10000L) != 0L) + return jjStartNfaWithStates_3(3, 720, 78); + return jjMoveStringLiteralDfa4_3(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0xc820000000L, active11, 0x40000000L); case 70: case 102: if ((active0 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(3, 26, 77); + return jjStartNfaWithStates_3(3, 26, 78); else if ((active8 & 0x200L) != 0L) - return jjStartNfaWithStates_3(3, 521, 77); + return jjStartNfaWithStates_3(3, 521, 78); break; case 71: case 103: - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x800001e000L, active11, 0x100000000L); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x1000001e000L, active11, 0x200000000L); case 72: case 104: if ((active0 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 49, 77); + return jjStartNfaWithStates_3(3, 49, 78); else if ((active2 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 185, 77); + return jjStartNfaWithStates_3(3, 185, 78); else if ((active6 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(3, 420, 77); - else if ((active11 & 0x40L) != 0L) + return jjStartNfaWithStates_3(3, 420, 78); + else if ((active11 & 0x80L) != 0L) { - jjmatchedKind = 710; + jjmatchedKind = 711; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_3(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0xc00180L); + return jjMoveStringLiteralDfa4_3(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x1800300L); case 73: case 105: - return jjMoveStringLiteralDfa4_3(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x200000200000004L, active11, 0x80080000L); + return jjMoveStringLiteralDfa4_3(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x400001200000004L, active11, 0x100100000L); case 75: case 107: if ((active7 & 0x10L) != 0L) - return jjStartNfaWithStates_3(3, 452, 77); + return jjStartNfaWithStates_3(3, 452, 78); else if ((active8 & 0x80L) != 0L) - return jjStartNfaWithStates_3(3, 519, 77); - else if ((active10 & 0x8000000000000000L) != 0L) + return jjStartNfaWithStates_3(3, 519, 78); + else if ((active11 & 0x1L) != 0L) { - jjmatchedKind = 703; + jjmatchedKind = 704; jjmatchedPos = 3; } - else if ((active11 & 0x200L) != 0L) - return jjStartNfaWithStates_3(3, 713, 77); - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x40001L); + else if ((active11 & 0x400L) != 0L) + return jjStartNfaWithStates_3(3, 714, 78); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80002L); case 76: case 108: if ((active0 & 0x20000000000000L) != 0L) @@ -17656,64 +17689,64 @@ else if ((active0 & 0x4000000000000000L) != 0L) jjmatchedPos = 3; } else if ((active3 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(3, 230, 77); + return jjStartNfaWithStates_3(3, 230, 78); else if ((active5 & 0x20000000000000L) != 0L) { jjmatchedKind = 373; jjmatchedPos = 3; } else if ((active7 & 0x80L) != 0L) - return jjStartNfaWithStates_3(3, 455, 77); - else if ((active11 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(3, 739, 77); - return jjMoveStringLiteralDfa4_3(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x100000000000L); + return jjStartNfaWithStates_3(3, 455, 78); + else if ((active11 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_3(3, 740, 78); + return jjMoveStringLiteralDfa4_3(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x200000000000L); case 77: case 109: if ((active3 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(3, 229, 77); + return jjStartNfaWithStates_3(3, 229, 78); else if ((active10 & 0x20000L) != 0L) { jjmatchedKind = 657; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_3(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x100000L); + return jjMoveStringLiteralDfa4_3(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x200000L); case 78: case 110: if ((active4 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(3, 286, 77); + return jjStartNfaWithStates_3(3, 286, 78); else if ((active4 & 0x80000000L) != 0L) { jjmatchedKind = 287; jjmatchedPos = 3; } else if ((active6 & 0x40L) != 0L) - return jjStartNfaWithStates_3(3, 390, 77); + return jjStartNfaWithStates_3(3, 390, 78); else if ((active6 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(3, 431, 77); + return jjStartNfaWithStates_3(3, 431, 78); else if ((active9 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 626, 77); - else if ((active11 & 0x2L) != 0L) + return jjStartNfaWithStates_3(3, 626, 78); + else if ((active11 & 0x4L) != 0L) { - jjmatchedKind = 705; + jjmatchedKind = 706; jjmatchedPos = 3; } - else if ((active11 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(3, 740, 77); - return jjMoveStringLiteralDfa4_3(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x4000200100100ff8L, active11, 0x10000000004L); + else if ((active11 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_3(3, 741, 78); + return jjMoveStringLiteralDfa4_3(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x8000400100100ff8L, active11, 0x20000000008L); case 79: case 111: if ((active3 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 240, 77); + return jjStartNfaWithStates_3(3, 240, 78); else if ((active4 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(3, 279, 77); - return jjMoveStringLiteralDfa4_3(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x200000000L); + return jjStartNfaWithStates_3(3, 279, 78); + return jjMoveStringLiteralDfa4_3(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x400000000L); case 80: case 112: if ((active2 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 181, 77); + return jjStartNfaWithStates_3(3, 181, 78); else if ((active8 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(3, 537, 77); - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x800c020400L); + return jjStartNfaWithStates_3(3, 537, 78); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x10018040800L); case 81: case 113: return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000L, active11, 0L); @@ -17739,68 +17772,68 @@ else if ((active6 & 0x40000L) != 0L) jjmatchedKind = 402; jjmatchedPos = 3; } - else if ((active10 & 0x10000000000L) != 0L) + else if ((active10 & 0x20000000000L) != 0L) { - jjmatchedKind = 680; + jjmatchedKind = 681; jjmatchedPos = 3; } - else if ((active11 & 0x2000L) != 0L) + else if ((active11 & 0x4000L) != 0L) { - jjmatchedKind = 717; + jjmatchedKind = 718; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_3(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x1e0000000000L, active11, 0xa0010004008L); + return jjMoveStringLiteralDfa4_3(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x3c0000000000L, active11, 0x140020008010L); case 83: case 115: if ((active2 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(3, 147, 77); + return jjStartNfaWithStates_3(3, 147, 78); else if ((active7 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 498, 77); + return jjStartNfaWithStates_3(3, 498, 78); else if ((active8 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(3, 531, 77); + return jjStartNfaWithStates_3(3, 531, 78); else if ((active9 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 628, 77); - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x1800000000400000L, active11, 0x400000000L); + return jjStartNfaWithStates_3(3, 628, 78); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x3000000000400000L, active11, 0x800000000L); case 84: case 116: if ((active0 & 0x800000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 59, 77); + return jjStartNfaWithStates_3(3, 59, 78); else if ((active4 & 0x1000000000000L) != 0L) { jjmatchedKind = 304; jjmatchedPos = 3; } else if ((active4 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 309, 77); + return jjStartNfaWithStates_3(3, 309, 78); else if ((active5 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(3, 365, 77); + return jjStartNfaWithStates_3(3, 365, 78); else if ((active6 & 0x4L) != 0L) - return jjStartNfaWithStates_3(3, 386, 77); + return jjStartNfaWithStates_3(3, 386, 78); else if ((active6 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(3, 419, 77); + return jjStartNfaWithStates_3(3, 419, 78); else if ((active9 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(3, 598, 77); - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x42000200810L); + return jjStartNfaWithStates_3(3, 598, 78); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x84000401020L); case 85: case 117: - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x1c000000000000L, active11, 0x2000000L); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x38000000000000L, active11, 0x4000000L); case 86: case 118: if ((active6 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 442, 77); - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x4000000000L); + return jjStartNfaWithStates_3(3, 442, 78); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x8000000000L); case 87: case 119: if ((active8 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(3, 533, 77); - else if ((active10 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(3, 701, 77); + return jjStartNfaWithStates_3(3, 533, 78); + else if ((active10 & 0x4000000000000000L) != 0L) + return jjStartNfaWithStates_3(3, 702, 78); return jjMoveStringLiteralDfa4_3(active0, 0x80000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: if ((active6 & 0x20L) != 0L) - return jjStartNfaWithStates_3(3, 389, 77); - return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x400000000000000L, active11, 0L); + return jjStartNfaWithStates_3(3, 389, 78); + return jjMoveStringLiteralDfa4_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x800000000000000L, active11, 0L); default : break; } @@ -17818,107 +17851,107 @@ private final int jjMoveStringLiteralDfa4_3(long old0, long active0, long old1, switch(curChar) { case 50: - if ((active10 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 688, 77); + if ((active10 & 0x2000000000000L) != 0L) + return jjStartNfaWithStates_3(4, 689, 78); break; case 54: - if ((active10 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(4, 687, 77); + if ((active10 & 0x1000000000000L) != 0L) + return jjStartNfaWithStates_3(4, 688, 78); break; case 95: - return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x1e0000040000L, active11, 0xd000000L); + return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x3c0000040000L, active11, 0x1a000000L); case 65: case 97: - return jjMoveStringLiteralDfa5_3(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x200000002000000L, active11, 0L); + return jjMoveStringLiteralDfa5_3(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x400000002000000L, active11, 0L); case 66: case 98: if ((active5 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(4, 362, 77); + return jjStartNfaWithStates_3(4, 362, 78); return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0x80L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000L, active8, 0x3e000000000L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - if ((active11 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(4, 744, 77); - return jjMoveStringLiteralDfa5_3(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x200000000000L); + if ((active11 & 0x20000000000L) != 0L) + return jjStartNfaWithStates_3(4, 745, 78); + return jjMoveStringLiteralDfa5_3(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x400000000000L); case 68: case 100: if ((active3 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(4, 224, 77); + return jjStartNfaWithStates_3(4, 224, 78); return jjMoveStringLiteralDfa5_3(active0, 0x4000000000000L, active1, 0L, active2, 0x2000000000400000L, active3, 0L, active4, 0x3L, active5, 0L, active6, 0L, active7, 0L, active8, 0x700000000000L, active9, 0L, active10, 0x400000L, active11, 0L); case 69: case 101: if ((active1 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(4, 79, 77); + return jjStartNfaWithStates_3(4, 79, 78); else if ((active2 & 0x20L) != 0L) - return jjStartNfaWithStates_3(4, 133, 77); + return jjStartNfaWithStates_3(4, 133, 78); else if ((active3 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(4, 211, 77); + return jjStartNfaWithStates_3(4, 211, 78); else if ((active3 & 0x8000000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 255, 77); + return jjStartNfaWithStates_3(4, 255, 78); else if ((active4 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(4, 303, 77); + return jjStartNfaWithStates_3(4, 303, 78); else if ((active5 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(4, 335, 77); + return jjStartNfaWithStates_3(4, 335, 78); else if ((active5 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 372, 77); + return jjStartNfaWithStates_3(4, 372, 78); else if ((active7 & 0x8L) != 0L) - return jjStartNfaWithStates_3(4, 451, 77); + return jjStartNfaWithStates_3(4, 451, 78); else if ((active7 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(4, 487, 77); + return jjStartNfaWithStates_3(4, 487, 78); else if ((active7 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 506, 77); + return jjStartNfaWithStates_3(4, 506, 78); else if ((active7 & 0x2000000000000000L) != 0L) { jjmatchedKind = 509; jjmatchedPos = 4; } else if ((active8 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(4, 541, 77); + return jjStartNfaWithStates_3(4, 541, 78); else if ((active9 & 0x1000000L) != 0L) { jjmatchedKind = 600; jjmatchedPos = 4; } else if ((active9 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(4, 608, 77); + return jjStartNfaWithStates_3(4, 608, 78); else if ((active9 & 0x400000000000L) != 0L) { jjmatchedKind = 622; jjmatchedPos = 4; } - else if ((active10 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(4, 679, 77); - else if ((active10 & 0x4000000000000L) != 0L) + else if ((active10 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_3(4, 680, 78); + else if ((active10 & 0x8000000000000L) != 0L) { - jjmatchedKind = 690; + jjmatchedKind = 691; jjmatchedPos = 4; } - else if ((active11 & 0x8L) != 0L) - return jjStartNfaWithStates_3(4, 707, 77); - else if ((active11 & 0x800L) != 0L) + else if ((active11 & 0x10L) != 0L) + return jjStartNfaWithStates_3(4, 708, 78); + else if ((active11 & 0x1000L) != 0L) { - jjmatchedKind = 715; + jjmatchedKind = 716; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_3(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x4018000000000000L, active11, 0x80002e00004L); + return jjMoveStringLiteralDfa5_3(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x8030000000000000L, active11, 0x100005c00008L); case 70: case 102: if ((active2 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(4, 164, 77); + return jjStartNfaWithStates_3(4, 164, 78); return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0x60000L, active3, 0x1L, active4, 0L, active5, 0x10000000L, active6, 0L, active7, 0L, active8, 0x800000000000L, active9, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(4, 685, 77); - return jjMoveStringLiteralDfa5_3(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e000L, active11, 0x200000000L); + if ((active10 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_3(4, 686, 78); + return jjMoveStringLiteralDfa5_3(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100001e000L, active11, 0x400000000L); case 72: case 104: if ((active2 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(4, 163, 77); + return jjStartNfaWithStates_3(4, 163, 78); else if ((active3 & 0x4L) != 0L) - return jjStartNfaWithStates_3(4, 194, 77); + return jjStartNfaWithStates_3(4, 194, 78); else if ((active3 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(4, 212, 77); + return jjStartNfaWithStates_3(4, 212, 78); else if ((active5 & 0x10L) != 0L) { jjmatchedKind = 324; @@ -17929,53 +17962,53 @@ else if ((active5 & 0x80000000L) != 0L) jjmatchedKind = 351; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000000L, active11, 0x10L); + return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000000L, active11, 0x20L); case 73: case 105: - return jjMoveStringLiteralDfa5_3(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x1c80000000000000L, active11, 0x46100100080L); + return jjMoveStringLiteralDfa5_3(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x3900000000000000L, active11, 0x8c200200100L); case 75: case 107: if ((active1 & 0x800L) != 0L) - return jjStartNfaWithStates_3(4, 75, 77); + return jjStartNfaWithStates_3(4, 75, 78); return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x1000000L, active5, 0L, active6, 0L, active7, 0x2000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 76: case 108: if ((active1 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(4, 81, 77); + return jjStartNfaWithStates_3(4, 81, 78); else if ((active3 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(4, 214, 77); + return jjStartNfaWithStates_3(4, 214, 78); else if ((active4 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(4, 300, 77); + return jjStartNfaWithStates_3(4, 300, 78); else if ((active4 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 311, 77); + return jjStartNfaWithStates_3(4, 311, 78); else if ((active4 & 0x2000000000000000L) != 0L) { jjmatchedKind = 317; jjmatchedPos = 4; } - else if ((active11 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(4, 750, 77); - return jjMoveStringLiteralDfa5_3(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x40020000L); + else if ((active11 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_3(4, 751, 78); + return jjMoveStringLiteralDfa5_3(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x80040000L); case 77: case 109: return jjMoveStringLiteralDfa5_3(active0, 0x80000000L, active1, 0x3000000L, active2, 0x1c0000000800000L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0x3f800000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0x408000000L, active11, 0L); case 78: case 110: if ((active0 & 0x400L) != 0L) - return jjStartNfaWithStates_3(4, 10, 77); + return jjStartNfaWithStates_3(4, 10, 78); else if ((active0 & 0x8000000000L) != 0L) { jjmatchedKind = 39; jjmatchedPos = 4; } else if ((active1 & 0x2L) != 0L) - return jjStartNfaWithStates_3(4, 65, 77); + return jjStartNfaWithStates_3(4, 65, 78); else if ((active10 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(4, 670, 77); - return jjMoveStringLiteralDfa5_3(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x80080000L); + return jjStartNfaWithStates_3(4, 670, 78); + return jjMoveStringLiteralDfa5_3(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x100100000L); case 79: case 111: - return jjMoveStringLiteralDfa5_3(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x120L); + return jjMoveStringLiteralDfa5_3(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x240L); case 80: case 112: if ((active3 & 0x8000000000000L) != 0L) @@ -17983,125 +18016,125 @@ else if ((active10 & 0x40000000L) != 0L) jjmatchedKind = 243; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x20000000000000L, active11, 0x400L); + return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x40000000000000L, active11, 0x800L); case 82: case 114: if ((active0 & 0x800L) != 0L) - return jjStartNfaWithStates_3(4, 11, 77); + return jjStartNfaWithStates_3(4, 11, 78); else if ((active0 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(4, 15, 77); + return jjStartNfaWithStates_3(4, 15, 78); else if ((active3 & 0x10L) != 0L) - return jjStartNfaWithStates_3(4, 196, 77); + return jjStartNfaWithStates_3(4, 196, 78); else if ((active3 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(4, 218, 77); + return jjStartNfaWithStates_3(4, 218, 78); else if ((active4 & 0x800L) != 0L) - return jjStartNfaWithStates_3(4, 267, 77); + return jjStartNfaWithStates_3(4, 267, 78); else if ((active5 & 0x2L) != 0L) - return jjStartNfaWithStates_3(4, 321, 77); + return jjStartNfaWithStates_3(4, 321, 78); else if ((active5 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(4, 361, 77); + return jjStartNfaWithStates_3(4, 361, 78); else if ((active6 & 0x400L) != 0L) { jjmatchedKind = 394; jjmatchedPos = 4; } else if ((active6 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(4, 400, 77); + return jjStartNfaWithStates_3(4, 400, 78); else if ((active6 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 436, 77); + return jjStartNfaWithStates_3(4, 436, 78); else if ((active6 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 444, 77); + return jjStartNfaWithStates_3(4, 444, 78); else if ((active10 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(4, 669, 77); - else if ((active10 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(4, 677, 77); - return jjMoveStringLiteralDfa5_3(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x4000000000L, active11, 0L); + return jjStartNfaWithStates_3(4, 669, 78); + else if ((active10 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_3(4, 678, 78); + return jjMoveStringLiteralDfa5_3(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x8000000000L, active11, 0L); case 83: case 115: if ((active1 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 116, 77); + return jjStartNfaWithStates_3(4, 116, 78); else if ((active3 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 252, 77); + return jjStartNfaWithStates_3(4, 252, 78); else if ((active5 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(4, 355, 77); + return jjStartNfaWithStates_3(4, 355, 78); else if ((active5 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(4, 357, 77); + return jjStartNfaWithStates_3(4, 357, 78); else if ((active5 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 376, 77); + return jjStartNfaWithStates_3(4, 376, 78); else if ((active7 & 0x40L) != 0L) - return jjStartNfaWithStates_3(4, 454, 77); + return jjStartNfaWithStates_3(4, 454, 78); else if ((active8 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(4, 532, 77); - else if ((active11 & 0x1L) != 0L) - return jjStartNfaWithStates_3(4, 704, 77); - else if ((active11 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(4, 718, 77); - return jjMoveStringLiteralDfa5_3(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x40000800000ff8L, active11, 0L); + return jjStartNfaWithStates_3(4, 532, 78); + else if ((active11 & 0x2L) != 0L) + return jjStartNfaWithStates_3(4, 705, 78); + else if ((active11 & 0x8000L) != 0L) + return jjStartNfaWithStates_3(4, 719, 78); + return jjMoveStringLiteralDfa5_3(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x80000800000ff8L, active11, 0L); case 84: case 116: if ((active1 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 112, 77); + return jjStartNfaWithStates_3(4, 112, 78); else if ((active3 & 0x800000L) != 0L) { jjmatchedKind = 215; jjmatchedPos = 4; } else if ((active3 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(4, 217, 77); + return jjStartNfaWithStates_3(4, 217, 78); else if ((active3 & 0x2000000000000L) != 0L) { jjmatchedKind = 241; jjmatchedPos = 4; } else if ((active4 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(4, 268, 77); + return jjStartNfaWithStates_3(4, 268, 78); else if ((active4 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(4, 269, 77); + return jjStartNfaWithStates_3(4, 269, 78); else if ((active4 & 0x800000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 315, 77); + return jjStartNfaWithStates_3(4, 315, 78); else if ((active6 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(4, 429, 77); + return jjStartNfaWithStates_3(4, 429, 78); else if ((active7 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(4, 473, 77); + return jjStartNfaWithStates_3(4, 473, 78); else if ((active7 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(4, 486, 77); + return jjStartNfaWithStates_3(4, 486, 78); else if ((active9 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(4, 599, 77); + return jjStartNfaWithStates_3(4, 599, 78); else if ((active10 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(4, 652, 77); - return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x1000000000L, active11, 0L); + return jjStartNfaWithStates_3(4, 652, 78); + return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x2000000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x8000040000L); + return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x10000080000L); case 86: case 118: return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0x2000000000L, active3, 0L, active4, 0L, active5, 0x8000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x300000L, active10, 0x200000000L, active11, 0L); case 87: case 119: if ((active0 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(4, 14, 77); - return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000L); + return jjStartNfaWithStates_3(4, 14, 78); + return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x800000000L); case 88: case 120: - if ((active11 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(4, 733, 77); + if ((active11 & 0x40000000L) != 0L) + return jjStartNfaWithStates_3(4, 734, 78); return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: if ((active0 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(4, 19, 77); + return jjStartNfaWithStates_3(4, 19, 78); else if ((active0 & 0x200000L) != 0L) { jjmatchedKind = 21; jjmatchedPos = 4; } else if ((active2 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(4, 188, 77); + return jjStartNfaWithStates_3(4, 188, 78); else if ((active3 & 0x40L) != 0L) - return jjStartNfaWithStates_3(4, 198, 77); - else if ((active11 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(4, 745, 77); - return jjMoveStringLiteralDfa5_3(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100010000000L); + return jjStartNfaWithStates_3(4, 198, 78); + else if ((active11 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_3(4, 746, 78); + return jjMoveStringLiteralDfa5_3(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200020000000L); case 90: case 122: return jjMoveStringLiteralDfa5_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x6000000000000000L, active10, 0L, active11, 0L); @@ -18122,7 +18155,7 @@ private final int jjMoveStringLiteralDfa5_3(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa6_3(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x10000000000000L, active11, 0x2e00010L); + return jjMoveStringLiteralDfa6_3(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x20000000000000L, active11, 0x5c00020L); case 65: case 97: if ((active7 & 0x800000000000000L) != 0L) @@ -18130,7 +18163,7 @@ private final int jjMoveStringLiteralDfa5_3(long old0, long active0, long old1, jjmatchedKind = 507; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_3(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x140000000740078L, active11, 0x20000L); + return jjMoveStringLiteralDfa6_3(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x280000000740078L, active11, 0x40000L); case 66: case 98: return jjMoveStringLiteralDfa6_3(active0, 0xc00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x40000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -18142,105 +18175,105 @@ private final int jjMoveStringLiteralDfa5_3(long old0, long active0, long old1, jjmatchedPos = 5; } else if ((active6 & 0x8000000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 447, 77); + return jjStartNfaWithStates_3(5, 447, 78); else if ((active9 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(5, 602, 77); - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x4000100000L); + return jjStartNfaWithStates_3(5, 602, 78); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x8000200000L); case 68: case 100: if ((active0 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 54, 77); + return jjStartNfaWithStates_3(5, 54, 78); else if ((active3 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(5, 208, 77); + return jjStartNfaWithStates_3(5, 208, 78); else if ((active5 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(5, 339, 77); + return jjStartNfaWithStates_3(5, 339, 78); else if ((active6 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(5, 427, 77); + return jjStartNfaWithStates_3(5, 427, 78); else if ((active8 & 0x8L) != 0L) { jjmatchedKind = 515; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_3(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x1e0010000000L, active11, 0L); + return jjMoveStringLiteralDfa6_3(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x3c0010000000L, active11, 0L); case 69: case 101: if ((active0 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(5, 38, 77); + return jjStartNfaWithStates_3(5, 38, 78); else if ((active1 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 115, 77); + return jjStartNfaWithStates_3(5, 115, 78); else if ((active2 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(5, 150, 77); + return jjStartNfaWithStates_3(5, 150, 78); else if ((active2 & 0x20000000L) != 0L) { jjmatchedKind = 157; jjmatchedPos = 5; } else if ((active2 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(5, 160, 77); + return jjStartNfaWithStates_3(5, 160, 78); else if ((active2 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(5, 161, 77); + return jjStartNfaWithStates_3(5, 161, 78); else if ((active2 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 178, 77); + return jjStartNfaWithStates_3(5, 178, 78); else if ((active3 & 0x20L) != 0L) - return jjStartNfaWithStates_3(5, 197, 77); + return jjStartNfaWithStates_3(5, 197, 78); else if ((active3 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 254, 77); + return jjStartNfaWithStates_3(5, 254, 78); else if ((active5 & 0x1000000L) != 0L) { jjmatchedKind = 344; jjmatchedPos = 5; } else if ((active5 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(5, 349, 77); + return jjStartNfaWithStates_3(5, 349, 78); else if ((active7 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(5, 485, 77); + return jjStartNfaWithStates_3(5, 485, 78); else if ((active8 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(5, 535, 77); + return jjStartNfaWithStates_3(5, 535, 78); else if ((active8 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(5, 540, 77); + return jjStartNfaWithStates_3(5, 540, 78); else if ((active10 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(5, 663, 77); + return jjStartNfaWithStates_3(5, 663, 78); else if ((active10 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(5, 671, 77); - else if ((active10 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(5, 676, 77); - return jjMoveStringLiteralDfa6_3(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x80000400L); + return jjStartNfaWithStates_3(5, 671, 78); + else if ((active10 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_3(5, 677, 78); + return jjMoveStringLiteralDfa6_3(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x100000800L); case 70: case 102: if ((active5 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 375, 77); + return jjStartNfaWithStates_3(5, 375, 78); return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1L, active8, 0x1c0000000L, active9, 0L, active10, 0x180L, active11, 0L); case 71: case 103: if ((active3 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 247, 77); - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x200000000L); + return jjStartNfaWithStates_3(5, 247, 78); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x400000000L); case 72: case 104: if ((active4 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 310, 77); + return jjStartNfaWithStates_3(5, 310, 78); else if ((active8 & 0x4L) != 0L) - return jjStartNfaWithStates_3(5, 514, 77); - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjStartNfaWithStates_3(5, 514, 78); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 73: case 105: - return jjMoveStringLiteralDfa6_3(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x80000L); + return jjMoveStringLiteralDfa6_3(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x100000L); case 75: case 107: - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x4000000L); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x8000000L); case 76: case 108: if ((active3 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(5, 238, 77); + return jjStartNfaWithStates_3(5, 238, 78); else if ((active6 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(5, 416, 77); + return jjStartNfaWithStates_3(5, 416, 78); else if ((active8 & 0x2L) != 0L) - return jjStartNfaWithStates_3(5, 513, 77); - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x40000000L); + return jjStartNfaWithStates_3(5, 513, 78); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x80000000L); case 77: case 109: if ((active9 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(5, 605, 77); + return jjStartNfaWithStates_3(5, 605, 78); else if ((active9 & 0x80000000000L) != 0L) { jjmatchedKind = 619; @@ -18250,16 +18283,16 @@ else if ((active9 & 0x80000000000L) != 0L) case 78: case 110: if ((active0 & 0x80L) != 0L) - return jjStartNfaWithStates_3(5, 7, 77); + return jjStartNfaWithStates_3(5, 7, 78); else if ((active1 & 0x1000000L) != 0L) { jjmatchedKind = 88; jjmatchedPos = 5; } else if ((active2 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 176, 77); + return jjStartNfaWithStates_3(5, 176, 78); else if ((active3 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(5, 232, 77); + return jjStartNfaWithStates_3(5, 232, 78); else if ((active6 & 0x80L) != 0L) { jjmatchedKind = 391; @@ -18270,17 +18303,17 @@ else if ((active7 & 0x40000000L) != 0L) jjmatchedKind = 478; jjmatchedPos = 5; } - else if ((active11 & 0x80L) != 0L) - return jjStartNfaWithStates_3(5, 711, 77); - return jjMoveStringLiteralDfa6_3(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0x680000004000000L, active11, 0x2100000000L); + else if ((active11 & 0x100L) != 0L) + return jjStartNfaWithStates_3(5, 712, 78); + return jjMoveStringLiteralDfa6_3(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0xd00001004000000L, active11, 0x4200000000L); case 79: case 111: - return jjMoveStringLiteralDfa6_3(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x1820000200000000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa6_3(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x3040000200000000L, active11, 0x800000000L); case 80: case 112: if ((active7 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(5, 490, 77); - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x10040000L); + return jjStartNfaWithStates_3(5, 490, 78); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x20080000L); case 81: case 113: return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -18292,44 +18325,44 @@ else if ((active11 & 0x80L) != 0L) jjmatchedPos = 5; } else if ((active3 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(5, 213, 77); + return jjStartNfaWithStates_3(5, 213, 78); else if ((active5 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(5, 334, 77); + return jjStartNfaWithStates_3(5, 334, 78); else if ((active5 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 377, 77); + return jjStartNfaWithStates_3(5, 377, 78); else if ((active7 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 505, 77); + return jjStartNfaWithStates_3(5, 505, 78); else if ((active8 & 0x4000L) != 0L) { jjmatchedKind = 526; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_3(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa6_3(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x2000000L); case 83: case 115: if ((active0 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(5, 16, 77); + return jjStartNfaWithStates_3(5, 16, 78); else if ((active3 & 0x8L) != 0L) - return jjStartNfaWithStates_3(5, 195, 77); + return jjStartNfaWithStates_3(5, 195, 78); else if ((active3 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(5, 205, 77); + return jjStartNfaWithStates_3(5, 205, 78); else if ((active3 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 246, 77); + return jjStartNfaWithStates_3(5, 246, 78); else if ((active5 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(5, 352, 77); + return jjStartNfaWithStates_3(5, 352, 78); else if ((active5 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 382, 77); + return jjStartNfaWithStates_3(5, 382, 78); else if ((active6 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(5, 398, 77); - else if ((active10 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 691, 77); - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x4000000000000000L, active11, 0xc0000000000L); + return jjStartNfaWithStates_3(5, 398, 78); + else if ((active10 & 0x10000000000000L) != 0L) + return jjStartNfaWithStates_3(5, 692, 78); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x8000000000000000L, active11, 0x180000000000L); case 84: case 116: if ((active0 & 0x20L) != 0L) - return jjStartNfaWithStates_3(5, 5, 77); + return jjStartNfaWithStates_3(5, 5, 78); else if ((active0 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(5, 44, 77); + return jjStartNfaWithStates_3(5, 44, 78); else if ((active1 & 0x10000000L) != 0L) { jjmatchedKind = 92; @@ -18341,40 +18374,40 @@ else if ((active3 & 0x80L) != 0L) jjmatchedPos = 5; } else if ((active3 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(5, 221, 77); + return jjStartNfaWithStates_3(5, 221, 78); else if ((active4 & 0x8L) != 0L) - return jjStartNfaWithStates_3(5, 259, 77); + return jjStartNfaWithStates_3(5, 259, 78); else if ((active4 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(5, 271, 77); + return jjStartNfaWithStates_3(5, 271, 78); else if ((active5 & 0x800000000000000L) != 0L) - return jjStartNfaWithStates_3(5, 379, 77); + return jjStartNfaWithStates_3(5, 379, 78); else if ((active6 & 0x1L) != 0L) - return jjStartNfaWithStates_3(5, 384, 77); + return jjStartNfaWithStates_3(5, 384, 78); else if ((active6 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(5, 401, 77); + return jjStartNfaWithStates_3(5, 401, 78); else if ((active7 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(5, 477, 77); + return jjStartNfaWithStates_3(5, 477, 78); else if ((active8 & 0x100L) != 0L) - return jjStartNfaWithStates_3(5, 520, 77); + return jjStartNfaWithStates_3(5, 520, 78); else if ((active9 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(5, 611, 77); + return jjStartNfaWithStates_3(5, 611, 78); else if ((active10 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(5, 675, 77); - else if ((active10 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(5, 678, 77); - return jjMoveStringLiteralDfa6_3(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x8000000000L); + return jjStartNfaWithStates_3(5, 675, 78); + else if ((active10 & 0x8000000000L) != 0L) + return jjStartNfaWithStates_3(5, 679, 78); + return jjMoveStringLiteralDfa6_3(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x10000000000L); case 85: case 117: - return jjMoveStringLiteralDfa6_3(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x100L); + return jjMoveStringLiteralDfa6_3(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x200L); case 86: case 118: - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x8000004L); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x10000008L); case 87: case 119: if ((active4 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(5, 282, 77); - else if ((active11 & 0x20L) != 0L) - return jjStartNfaWithStates_3(5, 709, 77); + return jjStartNfaWithStates_3(5, 282, 78); + else if ((active11 & 0x40L) != 0L) + return jjStartNfaWithStates_3(5, 710, 78); return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0x20000L, active3, 0x8000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000L, active11, 0L); case 88: case 120: @@ -18382,17 +18415,17 @@ else if ((active11 & 0x20L) != 0L) case 89: case 121: if ((active0 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(5, 45, 77); + return jjStartNfaWithStates_3(5, 45, 78); else if ((active3 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(5, 228, 77); + return jjStartNfaWithStates_3(5, 228, 78); else if ((active5 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(5, 350, 77); + return jjStartNfaWithStates_3(5, 350, 78); else if ((active9 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(5, 617, 77); + return jjStartNfaWithStates_3(5, 617, 78); return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0x40000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000000L); + return jjMoveStringLiteralDfa6_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); default : break; } @@ -18411,16 +18444,16 @@ private final int jjMoveStringLiteralDfa6_3(long old0, long active0, long old1, { case 50: if ((active7 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(6, 464, 77); + return jjStartNfaWithStates_3(6, 464, 78); break; case 95: - return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x100000000L); case 65: case 97: - return jjMoveStringLiteralDfa7_3(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x80000000000e00L, active11, 0x200008000000L); + return jjMoveStringLiteralDfa7_3(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x100000000000e00L, active11, 0x400010000000L); case 66: case 98: - return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x20L); case 67: case 99: if ((active2 & 0x40000000000000L) != 0L) @@ -18429,21 +18462,21 @@ private final int jjMoveStringLiteralDfa6_3(long old0, long active0, long old1, jjmatchedPos = 6; } else if ((active5 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 378, 77); + return jjStartNfaWithStates_3(6, 378, 78); return jjMoveStringLiteralDfa7_3(active0, 0x800000L, active1, 0x10000L, active2, 0x180c00000100000L, active3, 0x110000000000000L, active4, 0x4000010000L, active5, 0x4000000080L, active6, 0L, active7, 0x4000020010000000L, active8, 0x200000001000L, active9, 0L, active10, 0x78L, active11, 0L); case 68: case 100: if ((active2 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(6, 158, 77); + return jjStartNfaWithStates_3(6, 158, 78); else if ((active2 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(6, 165, 77); + return jjStartNfaWithStates_3(6, 165, 78); else if ((active3 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 242, 77); + return jjStartNfaWithStates_3(6, 242, 78); else if ((active5 & 0x20L) != 0L) - return jjStartNfaWithStates_3(6, 325, 77); + return jjStartNfaWithStates_3(6, 325, 78); else if ((active10 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(6, 674, 77); - return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x4000000004000000L, active11, 0L); + return jjStartNfaWithStates_3(6, 674, 78); + return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x8000000004000000L, active11, 0L); case 69: case 101: if ((active0 & 0x100000000000000L) != 0L) @@ -18452,42 +18485,42 @@ else if ((active10 & 0x400000000L) != 0L) jjmatchedPos = 6; } else if ((active1 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(6, 82, 77); + return jjStartNfaWithStates_3(6, 82, 78); else if ((active2 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(6, 152, 77); + return jjStartNfaWithStates_3(6, 152, 78); else if ((active3 & 0x200L) != 0L) - return jjStartNfaWithStates_3(6, 201, 77); + return jjStartNfaWithStates_3(6, 201, 78); else if ((active3 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(6, 204, 77); + return jjStartNfaWithStates_3(6, 204, 78); else if ((active4 & 0x20L) != 0L) - return jjStartNfaWithStates_3(6, 261, 77); + return jjStartNfaWithStates_3(6, 261, 78); else if ((active5 & 0x1000L) != 0L) { jjmatchedKind = 332; jjmatchedPos = 6; } else if ((active6 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(6, 428, 77); + return jjStartNfaWithStates_3(6, 428, 78); else if ((active6 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 440, 77); + return jjStartNfaWithStates_3(6, 440, 78); else if ((active7 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(6, 470, 77); + return jjStartNfaWithStates_3(6, 470, 78); else if ((active7 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(6, 472, 77); + return jjStartNfaWithStates_3(6, 472, 78); else if ((active7 & 0x80000000000L) != 0L) { jjmatchedKind = 491; jjmatchedPos = 6; } else if ((active10 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(6, 665, 77); - else if ((active11 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(6, 742, 77); + return jjStartNfaWithStates_3(6, 665, 78); else if ((active11 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(6, 743, 77); - else if ((active11 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(6, 748, 77); - return jjMoveStringLiteralDfa7_3(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x1e0000000000L, active11, 0x45000004L); + return jjStartNfaWithStates_3(6, 743, 78); + else if ((active11 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_3(6, 744, 78); + else if ((active11 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_3(6, 749, 78); + return jjMoveStringLiteralDfa7_3(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x3c1000000000L, active11, 0x8a000008L); case 70: case 102: return jjMoveStringLiteralDfa7_3(active0, 0x10000000000L, active1, 0x1000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -18499,152 +18532,152 @@ else if ((active11 & 0x100000000000L) != 0L) jjmatchedPos = 6; } else if ((active0 & 0x8000000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 63, 77); + return jjStartNfaWithStates_3(6, 63, 78); else if ((active4 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 308, 77); + return jjStartNfaWithStates_3(6, 308, 78); else if ((active5 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(6, 363, 77); + return jjStartNfaWithStates_3(6, 363, 78); else if ((active6 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(6, 417, 77); + return jjStartNfaWithStates_3(6, 417, 78); else if ((active6 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(6, 430, 77); + return jjStartNfaWithStates_3(6, 430, 78); else if ((active7 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 499, 77); - else if ((active10 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 698, 77); - else if ((active11 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(6, 736, 77); - return jjMoveStringLiteralDfa7_3(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x400000L); + return jjStartNfaWithStates_3(6, 499, 78); + else if ((active10 & 0x800000000000000L) != 0L) + return jjStartNfaWithStates_3(6, 699, 78); + else if ((active11 & 0x200000000L) != 0L) + return jjStartNfaWithStates_3(6, 737, 78); + return jjMoveStringLiteralDfa7_3(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x800000L); case 72: case 104: if ((active0 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 50, 77); - else if ((active11 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(6, 747, 77); + return jjStartNfaWithStates_3(6, 50, 78); + else if ((active11 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_3(6, 748, 78); return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa7_3(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x200100000L); + return jjMoveStringLiteralDfa7_3(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x400200000L); case 76: case 108: if ((active2 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(6, 151, 77); + return jjStartNfaWithStates_3(6, 151, 78); else if ((active3 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(6, 234, 77); + return jjStartNfaWithStates_3(6, 234, 78); else if ((active4 & 0x200L) != 0L) { jjmatchedKind = 265; jjmatchedPos = 6; } else if ((active4 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 306, 77); + return jjStartNfaWithStates_3(6, 306, 78); else if ((active5 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(6, 360, 77); + return jjStartNfaWithStates_3(6, 360, 78); else if ((active6 & 0x1000L) != 0L) { jjmatchedKind = 396; jjmatchedPos = 6; } else if ((active6 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(6, 414, 77); + return jjStartNfaWithStates_3(6, 414, 78); return jjMoveStringLiteralDfa7_3(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400L, active5, 0x2048000000000000L, active6, 0x2000L, active7, 0x20000L, active8, 0L, active9, 0x4L, active10, 0L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa7_3(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x40000000000000L, active11, 0L); + return jjMoveStringLiteralDfa7_3(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x80000000000000L, active11, 0L); case 78: case 110: if ((active0 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(6, 43, 77); + return jjStartNfaWithStates_3(6, 43, 78); else if ((active0 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 48, 77); + return jjStartNfaWithStates_3(6, 48, 78); else if ((active3 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(6, 207, 77); + return jjStartNfaWithStates_3(6, 207, 78); else if ((active3 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(6, 222, 77); + return jjStartNfaWithStates_3(6, 222, 78); else if ((active3 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(6, 223, 77); + return jjStartNfaWithStates_3(6, 223, 78); else if ((active6 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(6, 421, 77); + return jjStartNfaWithStates_3(6, 421, 78); else if ((active6 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 433, 77); + return jjStartNfaWithStates_3(6, 433, 78); else if ((active8 & 0x20L) != 0L) - return jjStartNfaWithStates_3(6, 517, 77); + return jjStartNfaWithStates_3(6, 517, 78); else if ((active8 & 0x10000L) != 0L) { jjmatchedKind = 528; jjmatchedPos = 6; } else if ((active10 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(6, 672, 77); - else if ((active10 & 0x800000000000000L) != 0L) + return jjStartNfaWithStates_3(6, 672, 78); + else if ((active10 & 0x1000000000000000L) != 0L) { - jjmatchedKind = 699; + jjmatchedKind = 700; jjmatchedPos = 6; } - return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x1000000000000004L, active11, 0x800000L); + return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x2000000000000004L, active11, 0x1000000L); case 79: case 111: - return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x10000000000180L, active11, 0L); + return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x20000000000180L, active11, 0L); case 80: case 112: - if ((active10 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 693, 77); + if ((active10 & 0x40000000000000L) != 0L) + return jjStartNfaWithStates_3(6, 694, 78); return jjMoveStringLiteralDfa7_3(active0, 0x20000000000L, active1, 0x2800000000000L, active2, 0x30000000000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0x80000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 82: case 114: if ((active2 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(6, 159, 77); + return jjStartNfaWithStates_3(6, 159, 78); else if ((active4 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(6, 275, 77); + return jjStartNfaWithStates_3(6, 275, 78); else if ((active4 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(6, 280, 77); + return jjStartNfaWithStates_3(6, 280, 78); else if ((active4 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(6, 283, 77); + return jjStartNfaWithStates_3(6, 283, 78); else if ((active5 & 0x1L) != 0L) - return jjStartNfaWithStates_3(6, 320, 77); + return jjStartNfaWithStates_3(6, 320, 78); else if ((active7 & 0x2L) != 0L) { jjmatchedKind = 449; jjmatchedPos = 6; } else if ((active8 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(6, 534, 77); + return jjStartNfaWithStates_3(6, 534, 78); else if ((active10 & 0x2000L) != 0L) { jjmatchedKind = 653; jjmatchedPos = 6; } - else if ((active10 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 696, 77); - else if ((active11 & 0x400L) != 0L) - return jjStartNfaWithStates_3(6, 714, 77); - return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x400000000L); + else if ((active10 & 0x200000000000000L) != 0L) + return jjStartNfaWithStates_3(6, 697, 78); + else if ((active11 & 0x800L) != 0L) + return jjStartNfaWithStates_3(6, 715, 78); + return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x800000000L); case 83: case 115: if ((active5 & 0x40L) != 0L) - return jjStartNfaWithStates_3(6, 326, 77); + return jjStartNfaWithStates_3(6, 326, 78); else if ((active5 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(6, 345, 77); + return jjStartNfaWithStates_3(6, 345, 78); else if ((active6 & 0x100L) != 0L) - return jjStartNfaWithStates_3(6, 392, 77); + return jjStartNfaWithStates_3(6, 392, 78); else if ((active7 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(6, 484, 77); + return jjStartNfaWithStates_3(6, 484, 78); else if ((active8 & 0x10L) != 0L) - return jjStartNfaWithStates_3(6, 516, 77); - else if ((active11 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(6, 722, 77); - return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x200000L); + return jjStartNfaWithStates_3(6, 516, 78); + else if ((active11 & 0x80000L) != 0L) + return jjStartNfaWithStates_3(6, 723, 78); + return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x400000L); case 84: case 116: if ((active1 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(6, 87, 77); + return jjStartNfaWithStates_3(6, 87, 78); else if ((active1 & 0x200000000L) != 0L) { jjmatchedKind = 97; jjmatchedPos = 6; } else if ((active1 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(6, 109, 77); + return jjStartNfaWithStates_3(6, 109, 78); else if ((active1 & 0x80000000000000L) != 0L) { jjmatchedKind = 119; @@ -18656,32 +18689,32 @@ else if ((active2 & 0x2000000L) != 0L) jjmatchedPos = 6; } else if ((active2 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 186, 77); + return jjStartNfaWithStates_3(6, 186, 78); else if ((active3 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(6, 210, 77); + return jjStartNfaWithStates_3(6, 210, 78); else if ((active6 & 0x8000000000L) != 0L) { jjmatchedKind = 423; jjmatchedPos = 6; } else if ((active7 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(6, 474, 77); + return jjStartNfaWithStates_3(6, 474, 78); else if ((active7 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(6, 475, 77); + return jjStartNfaWithStates_3(6, 475, 78); else if ((active8 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(6, 551, 77); + return jjStartNfaWithStates_3(6, 551, 78); else if ((active9 & 0x8000000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 639, 77); + return jjStartNfaWithStates_3(6, 639, 78); else if ((active10 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(6, 673, 77); - else if ((active10 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 697, 77); - else if ((active11 & 0x100L) != 0L) - return jjStartNfaWithStates_3(6, 712, 77); - return jjMoveStringLiteralDfa7_3(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x400120a0000L); + return jjStartNfaWithStates_3(6, 673, 78); + else if ((active10 & 0x400000000000000L) != 0L) + return jjStartNfaWithStates_3(6, 698, 78); + else if ((active11 & 0x200L) != 0L) + return jjStartNfaWithStates_3(6, 713, 78); + return jjMoveStringLiteralDfa7_3(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x80024140000L); case 85: case 117: - return jjMoveStringLiteralDfa7_3(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa7_3(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x4000000000L); case 86: case 118: return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0x200000000000000L, active7, 0x203000L, active8, 0L, active9, 0L, active10, 0x2L, active11, 0L); @@ -18691,17 +18724,17 @@ else if ((active11 & 0x100L) != 0L) case 89: case 121: if ((active1 & 0x1L) != 0L) - return jjStartNfaWithStates_3(6, 64, 77); + return jjStartNfaWithStates_3(6, 64, 78); else if ((active4 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 312, 77); + return jjStartNfaWithStates_3(6, 312, 78); else if ((active6 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(6, 404, 77); + return jjStartNfaWithStates_3(6, 404, 78); else if ((active6 & 0x800000000000000L) != 0L) - return jjStartNfaWithStates_3(6, 443, 77); + return jjStartNfaWithStates_3(6, 443, 78); else if ((active7 & 0x1L) != 0L) - return jjStartNfaWithStates_3(6, 448, 77); + return jjStartNfaWithStates_3(6, 448, 78); else if ((active10 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(6, 662, 77); + return jjStartNfaWithStates_3(6, 662, 78); return jjMoveStringLiteralDfa7_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); default : break; @@ -18723,13 +18756,13 @@ private final int jjMoveStringLiteralDfa7_3(long old0, long active0, long old1, return jjMoveStringLiteralDfa8_3(active0, 0x2000000000000000L, active1, 0xff0000000c000000L, active2, 0x180000000000007L, active3, 0L, active4, 0L, active5, 0x70000L, active6, 0x40000000000L, active7, 0x700000000000L, active8, 0x20000L, active9, 0xffc00L, active10, 0x1c000L, active11, 0L); case 65: case 97: - return jjMoveStringLiteralDfa8_3(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x4000000000000000L, active11, 0x800000L); + return jjMoveStringLiteralDfa8_3(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x8000000000000000L, active11, 0x1000000L); case 66: case 98: if ((active8 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(7, 552, 77); + return jjStartNfaWithStates_3(7, 552, 78); else if ((active8 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(7, 555, 77); + return jjStartNfaWithStates_3(7, 555, 78); return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0x8000000L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000800000L, active8, 0x400000000000L, active9, 0x100000L, active10, 0L, active11, 0L); case 67: case 99: @@ -18744,136 +18777,138 @@ else if ((active8 & 0x40000000L) != 0L) case 68: case 100: if ((active0 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 57, 77); + return jjStartNfaWithStates_3(7, 57, 78); else if ((active2 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(7, 156, 77); - else if ((active11 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(7, 738, 77); + return jjStartNfaWithStates_3(7, 156, 78); + else if ((active10 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_3(7, 676, 78); + else if ((active11 & 0x800000000L) != 0L) + return jjStartNfaWithStates_3(7, 739, 78); return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40000780000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 69: case 101: if ((active0 & 0x40L) != 0L) - return jjStartNfaWithStates_3(7, 6, 77); + return jjStartNfaWithStates_3(7, 6, 78); else if ((active0 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(7, 13, 77); + return jjStartNfaWithStates_3(7, 13, 78); else if ((active1 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(7, 80, 77); + return jjStartNfaWithStates_3(7, 80, 78); else if ((active1 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(7, 108, 77); + return jjStartNfaWithStates_3(7, 108, 78); else if ((active2 & 0x80L) != 0L) - return jjStartNfaWithStates_3(7, 135, 77); + return jjStartNfaWithStates_3(7, 135, 78); else if ((active2 & 0x800L) != 0L) { jjmatchedKind = 139; jjmatchedPos = 7; } else if ((active2 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(7, 167, 77); + return jjStartNfaWithStates_3(7, 167, 78); else if ((active4 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(7, 272, 77); + return jjStartNfaWithStates_3(7, 272, 78); else if ((active4 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(7, 299, 77); + return jjStartNfaWithStates_3(7, 299, 78); else if ((active4 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(7, 302, 77); + return jjStartNfaWithStates_3(7, 302, 78); else if ((active5 & 0x800L) != 0L) - return jjStartNfaWithStates_3(7, 331, 77); + return jjStartNfaWithStates_3(7, 331, 78); else if ((active5 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(7, 346, 77); + return jjStartNfaWithStates_3(7, 346, 78); else if ((active5 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 374, 77); + return jjStartNfaWithStates_3(7, 374, 78); else if ((active6 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 441, 77); + return jjStartNfaWithStates_3(7, 441, 78); else if ((active7 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(7, 469, 77); + return jjStartNfaWithStates_3(7, 469, 78); else if ((active8 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(7, 524, 77); + return jjStartNfaWithStates_3(7, 524, 78); else if ((active8 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(7, 547, 77); + return jjStartNfaWithStates_3(7, 547, 78); else if ((active8 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(7, 556, 77); + return jjStartNfaWithStates_3(7, 556, 78); else if ((active9 & 0x80L) != 0L) { jjmatchedKind = 583; jjmatchedPos = 7; } else if ((active10 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(7, 660, 77); - else if ((active11 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(7, 721, 77); - return jjMoveStringLiteralDfa8_3(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x10000000L); + return jjStartNfaWithStates_3(7, 660, 78); + else if ((active11 & 0x40000L) != 0L) + return jjStartNfaWithStates_3(7, 722, 78); + return jjMoveStringLiteralDfa8_3(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x20000000L); case 70: case 102: - if ((active10 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 692, 77); - return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x1e0000000000L, active11, 0L); + if ((active10 & 0x20000000000000L) != 0L) + return jjStartNfaWithStates_3(7, 693, 78); + return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active2 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 189, 77); + return jjStartNfaWithStates_3(7, 189, 78); else if ((active3 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 245, 77); + return jjStartNfaWithStates_3(7, 245, 78); else if ((active6 & 0x800L) != 0L) - return jjStartNfaWithStates_3(7, 395, 77); + return jjStartNfaWithStates_3(7, 395, 78); else if ((active10 & 0x4L) != 0L) - return jjStartNfaWithStates_3(7, 642, 77); - return jjMoveStringLiteralDfa8_3(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x1000000L); + return jjStartNfaWithStates_3(7, 642, 78); + return jjMoveStringLiteralDfa8_3(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x2000000L); case 72: case 104: if ((active2 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(7, 174, 77); + return jjStartNfaWithStates_3(7, 174, 78); return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa8_3(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x1000000000000000L, active11, 0x40000000000L); + return jjMoveStringLiteralDfa8_3(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x2000000000000000L, active11, 0x80000000000L); case 74: case 106: return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 75: case 107: if ((active7 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(7, 489, 77); + return jjStartNfaWithStates_3(7, 489, 78); break; case 76: case 108: if ((active3 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(7, 209, 77); + return jjStartNfaWithStates_3(7, 209, 78); else if ((active4 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(7, 278, 77); + return jjStartNfaWithStates_3(7, 278, 78); else if ((active5 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(7, 359, 77); + return jjStartNfaWithStates_3(7, 359, 78); else if ((active9 & 0x20L) != 0L) - return jjStartNfaWithStates_3(7, 581, 77); - else if ((active11 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(7, 734, 77); - return jjMoveStringLiteralDfa8_3(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x8000000L); + return jjStartNfaWithStates_3(7, 581, 78); + else if ((active11 & 0x80000000L) != 0L) + return jjStartNfaWithStates_3(7, 735, 78); + return jjMoveStringLiteralDfa8_3(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x10000000L); case 77: case 109: return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0L, active3, 0x1L, active4, 0xc000000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f01000000000000L, active10, 0L, active11, 0L); case 78: case 110: if ((active3 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(7, 231, 77); + return jjStartNfaWithStates_3(7, 231, 78); else if ((active6 & 0x4000000000000L) != 0L) { jjmatchedKind = 434; jjmatchedPos = 7; } - return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x200200000000L); + return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x400400000000L); case 79: case 111: - return jjMoveStringLiteralDfa8_3(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa8_3(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x4000000000L); case 80: case 112: - if ((active10 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 694, 77); + if ((active10 & 0x80000000000000L) != 0L) + return jjStartNfaWithStates_3(7, 695, 78); return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0x8000000L, active10, 0L, active11, 0L); case 82: case 114: if ((active8 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(7, 554, 77); - else if ((active11 & 0x4L) != 0L) - return jjStartNfaWithStates_3(7, 706, 77); - return jjMoveStringLiteralDfa8_3(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x80000000040180L, active11, 0x400000L); + return jjStartNfaWithStates_3(7, 554, 78); + else if ((active11 & 0x8L) != 0L) + return jjStartNfaWithStates_3(7, 707, 78); + return jjMoveStringLiteralDfa8_3(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x100000000040180L, active11, 0x800000L); case 83: case 115: if ((active1 & 0x40000000000L) != 0L) @@ -18882,68 +18917,68 @@ else if ((active11 & 0x4L) != 0L) jjmatchedPos = 7; } else if ((active2 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(7, 154, 77); + return jjStartNfaWithStates_3(7, 154, 78); else if ((active5 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(7, 333, 77); + return jjStartNfaWithStates_3(7, 333, 78); else if ((active5 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(7, 348, 77); + return jjStartNfaWithStates_3(7, 348, 78); else if ((active6 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(7, 403, 77); + return jjStartNfaWithStates_3(7, 403, 78); else if ((active6 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 437, 77); + return jjStartNfaWithStates_3(7, 437, 78); else if ((active7 & 0x4L) != 0L) - return jjStartNfaWithStates_3(7, 450, 77); + return jjStartNfaWithStates_3(7, 450, 78); else if ((active9 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(7, 615, 77); - return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x80000000L); + return jjStartNfaWithStates_3(7, 615, 78); + return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x100000000L); case 84: case 116: if ((active2 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(7, 175, 77); + return jjStartNfaWithStates_3(7, 175, 78); else if ((active5 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(7, 354, 77); + return jjStartNfaWithStates_3(7, 354, 78); else if ((active7 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(7, 476, 77); + return jjStartNfaWithStates_3(7, 476, 78); else if ((active8 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(7, 538, 77); + return jjStartNfaWithStates_3(7, 538, 78); else if ((active10 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(7, 661, 77); - return jjMoveStringLiteralDfa8_3(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x100000L); + return jjStartNfaWithStates_3(7, 661, 78); + return jjMoveStringLiteralDfa8_3(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x200000L); case 85: case 117: - return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x20L); case 86: case 118: return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100L, active8, 0x400L, active9, 0L, active10, 0L, active11, 0L); case 87: case 119: if ((active2 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(7, 172, 77); + return jjStartNfaWithStates_3(7, 172, 78); break; case 88: case 120: if ((active7 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(7, 466, 77); + return jjStartNfaWithStates_3(7, 466, 78); break; case 89: case 121: if ((active3 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(7, 236, 77); + return jjStartNfaWithStates_3(7, 236, 78); else if ((active3 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 253, 77); + return jjStartNfaWithStates_3(7, 253, 78); else if ((active7 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(7, 467, 77); + return jjStartNfaWithStates_3(7, 467, 78); else if ((active7 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(7, 468, 77); + return jjStartNfaWithStates_3(7, 468, 78); else if ((active7 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 503, 77); + return jjStartNfaWithStates_3(7, 503, 78); else if ((active8 & 0x40L) != 0L) - return jjStartNfaWithStates_3(7, 518, 77); + return jjStartNfaWithStates_3(7, 518, 78); else if ((active9 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(7, 627, 77); - else if ((active11 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(7, 730, 77); - return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x2280000L); + return jjStartNfaWithStates_3(7, 627, 78); + else if ((active11 & 0x8000000L) != 0L) + return jjStartNfaWithStates_3(7, 731, 78); + return jjMoveStringLiteralDfa8_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x4500000L); case 90: case 122: return jjMoveStringLiteralDfa8_3(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x3000000000000L, active6, 0L, active7, 0L, active8, 0x2000L, active9, 0L, active10, 0L, active11, 0L); @@ -18964,30 +18999,30 @@ private final int jjMoveStringLiteralDfa8_3(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x80000L); + return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x100000L); case 65: case 97: return jjMoveStringLiteralDfa9_3(active0, 0x11000000000L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0x300020000L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0xa000L, active9, 0x10000000L, active10, 0x40000L, active11, 0L); case 66: case 98: if ((active9 & 0x4L) != 0L) - return jjStartNfaWithStates_3(8, 578, 77); + return jjStartNfaWithStates_3(8, 578, 78); break; case 67: case 99: if ((active9 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(8, 618, 77); - return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x40000000010L); + return jjStartNfaWithStates_3(8, 618, 78); + return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x80000000020L); case 68: case 100: if ((active1 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(8, 93, 77); + return jjStartNfaWithStates_3(8, 93, 78); else if ((active3 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(8, 235, 77); + return jjStartNfaWithStates_3(8, 235, 78); else if ((active10 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(8, 666, 77); - else if ((active11 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(8, 732, 77); + return jjStartNfaWithStates_3(8, 666, 78); + else if ((active11 & 0x20000000L) != 0L) + return jjStartNfaWithStates_3(8, 733, 78); return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x600000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x400L, active10, 0L, active11, 0L); case 69: case 101: @@ -18997,7 +19032,7 @@ else if ((active11 & 0x10000000L) != 0L) jjmatchedPos = 8; } else if ((active3 & 0x1L) != 0L) - return jjStartNfaWithStates_3(8, 192, 77); + return jjStartNfaWithStates_3(8, 192, 78); else if ((active4 & 0x1L) != 0L) { jjmatchedKind = 256; @@ -19014,15 +19049,15 @@ else if ((active5 & 0x1000000000000L) != 0L) jjmatchedPos = 8; } else if ((active5 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 371, 77); + return jjStartNfaWithStates_3(8, 371, 78); else if ((active6 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 446, 77); + return jjStartNfaWithStates_3(8, 446, 78); else if ((active7 & 0x100L) != 0L) - return jjStartNfaWithStates_3(8, 456, 77); + return jjStartNfaWithStates_3(8, 456, 78); else if ((active8 & 0x400L) != 0L) - return jjStartNfaWithStates_3(8, 522, 77); + return jjStartNfaWithStates_3(8, 522, 78); else if ((active9 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(8, 607, 77); + return jjStartNfaWithStates_3(8, 607, 78); else if ((active10 & 0x200L) != 0L) { jjmatchedKind = 649; @@ -19032,44 +19067,44 @@ else if ((active10 & 0x200L) != 0L) case 70: case 102: if ((active2 & 0x200L) != 0L) - return jjStartNfaWithStates_3(8, 137, 77); + return jjStartNfaWithStates_3(8, 137, 78); else if ((active9 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 630, 77); + return jjStartNfaWithStates_3(8, 630, 78); return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x800L, active10, 0L, active11, 0L); case 71: case 103: if ((active0 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(8, 22, 77); + return jjStartNfaWithStates_3(8, 22, 78); else if ((active3 & 0x400L) != 0L) - return jjStartNfaWithStates_3(8, 202, 77); + return jjStartNfaWithStates_3(8, 202, 78); else if ((active3 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(8, 219, 77); + return jjStartNfaWithStates_3(8, 219, 78); else if ((active4 & 0x40L) != 0L) - return jjStartNfaWithStates_3(8, 262, 77); + return jjStartNfaWithStates_3(8, 262, 78); else if ((active6 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 438, 77); + return jjStartNfaWithStates_3(8, 438, 78); else if ((active7 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(8, 483, 77); + return jjStartNfaWithStates_3(8, 483, 78); else if ((active9 & 0x2000000000L) != 0L) { jjmatchedKind = 613; jjmatchedPos = 8; } - else if ((active11 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(8, 737, 77); - return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x200000000000L); + else if ((active11 & 0x400000000L) != 0L) + return jjStartNfaWithStates_3(8, 738, 78); + return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x400000000000L); case 72: case 104: return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x201000L, active10, 0L, active11, 0L); case 73: case 105: if ((active0 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(8, 42, 77); - return jjMoveStringLiteralDfa9_3(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x1e0010000878L, active11, 0x81000000L); + return jjStartNfaWithStates_3(8, 42, 78); + return jjMoveStringLiteralDfa9_3(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x3c0010000878L, active11, 0x102000000L); case 75: case 107: if ((active2 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(8, 145, 77); + return jjStartNfaWithStates_3(8, 145, 78); break; case 76: case 108: @@ -19081,11 +19116,11 @@ else if ((active11 & 0x200000000L) != 0L) jjmatchedKind = 647; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x800000L); + return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x1000000L); case 78: case 110: if ((active0 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(8, 29, 77); + return jjStartNfaWithStates_3(8, 29, 78); else if ((active1 & 0x80000L) != 0L) { jjmatchedKind = 83; @@ -19097,27 +19132,27 @@ else if ((active1 & 0x40000000L) != 0L) jjmatchedPos = 8; } else if ((active3 & 0x100L) != 0L) - return jjStartNfaWithStates_3(8, 200, 77); + return jjStartNfaWithStates_3(8, 200, 78); else if ((active4 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(8, 284, 77); + return jjStartNfaWithStates_3(8, 284, 78); else if ((active6 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(8, 415, 77); + return jjStartNfaWithStates_3(8, 415, 78); else if ((active6 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 439, 77); - return jjMoveStringLiteralDfa9_3(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x1000000000008000L, active11, 0x200000L); + return jjStartNfaWithStates_3(8, 439, 78); + return jjMoveStringLiteralDfa9_3(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x2000000000008000L, active11, 0x400000L); case 79: case 111: - return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x800000L); case 80: case 112: if ((active1 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 113, 77); + return jjStartNfaWithStates_3(8, 113, 78); else if ((active9 & 0x100000000000000L) != 0L) { jjmatchedKind = 632; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x2000000L); + return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x4000000L); case 81: case 113: return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0L); @@ -19129,18 +19164,18 @@ else if ((active9 & 0x100000000000000L) != 0L) jjmatchedPos = 8; } else if ((active2 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(8, 146, 77); + return jjStartNfaWithStates_3(8, 146, 78); else if ((active4 & 0x100L) != 0L) - return jjStartNfaWithStates_3(8, 264, 77); + return jjStartNfaWithStates_3(8, 264, 78); else if ((active6 & 0x800000L) != 0L) { jjmatchedKind = 407; jjmatchedPos = 8; } else if ((active8 & 0x800L) != 0L) - return jjStartNfaWithStates_3(8, 523, 77); + return jjStartNfaWithStates_3(8, 523, 78); else if ((active9 & 0x2L) != 0L) - return jjStartNfaWithStates_3(8, 577, 77); + return jjStartNfaWithStates_3(8, 577, 78); return jjMoveStringLiteralDfa9_3(active0, 0x20000000000L, active1, 0x30000000000007e0L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0L, active6, 0x4003f000000L, active7, 0L, active8, 0x3ffe004000000000L, active9, 0x8L, active10, 0L, active11, 0L); case 83: case 115: @@ -19148,57 +19183,57 @@ else if ((active9 & 0x2L) != 0L) case 84: case 116: if ((active1 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 118, 77); + return jjStartNfaWithStates_3(8, 118, 78); else if ((active4 & 0x80L) != 0L) - return jjStartNfaWithStates_3(8, 263, 77); + return jjStartNfaWithStates_3(8, 263, 78); else if ((active4 & 0x100000L) != 0L) { jjmatchedKind = 276; jjmatchedPos = 8; } else if ((active7 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 496, 77); + return jjStartNfaWithStates_3(8, 496, 78); else if ((active7 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 500, 77); + return jjStartNfaWithStates_3(8, 500, 78); else if ((active7 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 504, 77); + return jjStartNfaWithStates_3(8, 504, 78); else if ((active8 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(8, 559, 77); + return jjStartNfaWithStates_3(8, 559, 78); else if ((active9 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(8, 601, 77); + return jjStartNfaWithStates_3(8, 601, 78); return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0x8000020000000000L, active2, 0x100003L, active3, 0L, active4, 0x200004L, active5, 0x40000L, active6, 0x2000L, active7, 0x4000000000000000L, active8, 0x500000000L, active9, 0x1000000000L, active10, 0x8000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x2008000000L); + return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x4010000000L); case 86: case 118: return jjMoveStringLiteralDfa9_3(active0, 0x10000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0L); case 87: case 119: if ((active3 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(8, 226, 77); + return jjStartNfaWithStates_3(8, 226, 78); return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000L, active10, 0L, active11, 0L); case 88: case 120: if ((active7 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(8, 460, 77); + return jjStartNfaWithStates_3(8, 460, 78); return jjMoveStringLiteralDfa9_3(active0, 0x1000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: if ((active3 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 248, 77); + return jjStartNfaWithStates_3(8, 248, 78); else if ((active4 & 0x400L) != 0L) - return jjStartNfaWithStates_3(8, 266, 77); + return jjStartNfaWithStates_3(8, 266, 78); else if ((active7 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(8, 461, 77); + return jjStartNfaWithStates_3(8, 461, 78); else if ((active9 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 625, 77); - else if ((active10 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 695, 77); - else if ((active10 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_3(8, 702, 77); - else if ((active11 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(8, 724, 77); + return jjStartNfaWithStates_3(8, 625, 78); + else if ((active10 & 0x100000000000000L) != 0L) + return jjStartNfaWithStates_3(8, 696, 78); + else if ((active10 & 0x8000000000000000L) != 0L) + return jjStartNfaWithStates_3(8, 703, 78); + else if ((active11 & 0x200000L) != 0L) + return jjStartNfaWithStates_3(8, 725, 78); return jjMoveStringLiteralDfa9_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x80000L, active10, 0L, active11, 0L); default : break; @@ -19227,62 +19262,62 @@ private final int jjMoveStringLiteralDfa9_3(long old0, long active0, long old1, case 67: case 99: if ((active0 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(9, 31, 77); + return jjStartNfaWithStates_3(9, 31, 78); else if ((active2 & 0x400L) != 0L) - return jjStartNfaWithStates_3(9, 138, 77); + return jjStartNfaWithStates_3(9, 138, 78); else if ((active9 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 631, 77); - return jjMoveStringLiteralDfa10_3(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjStartNfaWithStates_3(9, 631, 78); + return jjMoveStringLiteralDfa10_3(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 68: case 100: if ((active5 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(9, 358, 77); + return jjStartNfaWithStates_3(9, 358, 78); else if ((active5 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 369, 77); + return jjStartNfaWithStates_3(9, 369, 78); return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x800000000000L, active2, 0x1000L, active3, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0L, active8, 0L, active9, 0x400000000000000L, active10, 0L, active11, 0L); case 69: case 101: if ((active0 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(9, 28, 77); + return jjStartNfaWithStates_3(9, 28, 78); else if ((active2 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(9, 148, 77); + return jjStartNfaWithStates_3(9, 148, 78); else if ((active2 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(9, 155, 77); + return jjStartNfaWithStates_3(9, 155, 78); else if ((active4 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(9, 294, 77); + return jjStartNfaWithStates_3(9, 294, 78); else if ((active4 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(9, 295, 77); + return jjStartNfaWithStates_3(9, 295, 78); else if ((active4 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 305, 77); + return jjStartNfaWithStates_3(9, 305, 78); else if ((active7 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(9, 465, 77); + return jjStartNfaWithStates_3(9, 465, 78); else if ((active7 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(9, 471, 77); + return jjStartNfaWithStates_3(9, 471, 78); else if ((active7 & 0x8000000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 511, 77); + return jjStartNfaWithStates_3(9, 511, 78); else if ((active8 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(9, 558, 77); + return jjStartNfaWithStates_3(9, 558, 78); else if ((active9 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(9, 612, 77); + return jjStartNfaWithStates_3(9, 612, 78); else if ((active9 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(9, 623, 77); - else if ((active11 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(9, 727, 77); - else if ((active11 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(9, 729, 77); - else if ((active11 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(9, 731, 77); - return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x200000000000L); + return jjStartNfaWithStates_3(9, 623, 78); + else if ((active11 & 0x1000000L) != 0L) + return jjStartNfaWithStates_3(9, 728, 78); + else if ((active11 & 0x4000000L) != 0L) + return jjStartNfaWithStates_3(9, 730, 78); + else if ((active11 & 0x10000000L) != 0L) + return jjStartNfaWithStates_3(9, 732, 78); + return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x400000000000L); case 71: case 103: if ((active6 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(9, 405, 77); + return jjStartNfaWithStates_3(9, 405, 78); else if ((active8 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(9, 548, 77); + return jjStartNfaWithStates_3(9, 548, 78); else if ((active9 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(9, 606, 77); - else if ((active10 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 700, 77); + return jjStartNfaWithStates_3(9, 606, 78); + else if ((active10 & 0x2000000000000000L) != 0L) + return jjStartNfaWithStates_3(9, 701, 78); return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x2000000000000000L, active6, 0x400000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: @@ -19293,15 +19328,15 @@ else if ((active10 & 0x1000000000000000L) != 0L) case 75: case 107: if ((active2 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(9, 162, 77); - return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80010L); + return jjStartNfaWithStates_3(9, 162, 78); + return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100020L); case 76: case 108: return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2L, active5, 0L, active6, 0L, active7, 0x100000000L, active8, 0L, active9, 0x1000000000000L, active10, 0L, active11, 0L); case 77: case 109: if ((active5 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(9, 342, 77); + return jjStartNfaWithStates_3(9, 342, 78); return jjMoveStringLiteralDfa10_3(active0, 0x10000000000L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x4000100010000000L, active10, 0L, active11, 0L); case 78: case 110: @@ -19310,71 +19345,71 @@ else if ((active10 & 0x1000000000000000L) != 0L) jjmatchedKind = 98; jjmatchedPos = 9; } - return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x3c0000000000L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x1000000L); + return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x2000000L); case 80: case 112: if ((active1 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 114, 77); + return jjStartNfaWithStates_3(9, 114, 78); else if ((active9 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(9, 603, 77); + return jjStartNfaWithStates_3(9, 603, 78); break; case 82: case 114: if ((active1 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(9, 76, 77); + return jjStartNfaWithStates_3(9, 76, 78); else if ((active2 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(9, 169, 77); + return jjStartNfaWithStates_3(9, 169, 78); else if ((active4 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(9, 298, 77); + return jjStartNfaWithStates_3(9, 298, 78); else if ((active7 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 497, 77); + return jjStartNfaWithStates_3(9, 497, 78); return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0L, active2, 0x2L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x8000L, active8, 0L, active9, 0x800L, active10, 0L, active11, 0L); case 83: case 115: if ((active0 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(9, 35, 77); + return jjStartNfaWithStates_3(9, 35, 78); else if ((active1 & 0x400L) != 0L) - return jjStartNfaWithStates_3(9, 74, 77); + return jjStartNfaWithStates_3(9, 74, 78); else if ((active6 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 445, 77); + return jjStartNfaWithStates_3(9, 445, 78); else if ((active7 & 0x400L) != 0L) - return jjStartNfaWithStates_3(9, 458, 77); + return jjStartNfaWithStates_3(9, 458, 78); else if ((active10 & 0x100L) != 0L) - return jjStartNfaWithStates_3(9, 648, 77); - else if ((active11 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(9, 741, 77); - else if ((active11 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(9, 746, 77); + return jjStartNfaWithStates_3(9, 648, 78); + else if ((active11 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_3(9, 742, 78); + else if ((active11 & 0x80000000000L) != 0L) + return jjStartNfaWithStates_3(9, 747, 78); return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0x80000000000L, active2, 0x40000000004L, active3, 0L, active4, 0x8000000000000000L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: if ((active0 & 0x40000000L) != 0L) - return jjStartNfaWithStates_3(9, 30, 77); + return jjStartNfaWithStates_3(9, 30, 78); else if ((active1 & 0x1000000000L) != 0L) { jjmatchedKind = 100; jjmatchedPos = 9; } else if ((active2 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(9, 173, 77); + return jjStartNfaWithStates_3(9, 173, 78); else if ((active7 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(9, 462, 77); + return jjStartNfaWithStates_3(9, 462, 78); else if ((active8 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(9, 549, 77); + return jjStartNfaWithStates_3(9, 549, 78); return jjMoveStringLiteralDfa10_3(active0, 0x80021000000000L, active1, 0x1e000000008L, active2, 0x8000L, active3, 0x2L, active4, 0x400000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100L, active10, 0L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x800000L); case 86: case 118: return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0L, active10, 0L, active11, 0L); case 88: case 120: if ((active4 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(9, 314, 77); + return jjStartNfaWithStates_3(9, 314, 78); break; case 89: case 121: @@ -19384,17 +19419,17 @@ else if ((active8 & 0x2000000000L) != 0L) jjmatchedPos = 9; } else if ((active4 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(9, 293, 77); + return jjStartNfaWithStates_3(9, 293, 78); else if ((active6 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(9, 397, 77); + return jjStartNfaWithStates_3(9, 397, 78); else if ((active8 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(9, 550, 77); + return jjStartNfaWithStates_3(9, 550, 78); else if ((active10 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(9, 658, 77); + return jjStartNfaWithStates_3(9, 658, 78); return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x200000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa10_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L); default : break; } @@ -19419,66 +19454,66 @@ private final int jjMoveStringLiteralDfa10_3(long old0, long active0, long old1, case 67: case 99: if ((active9 & 0x8L) != 0L) - return jjStartNfaWithStates_3(10, 579, 77); + return jjStartNfaWithStates_3(10, 579, 78); return jjMoveStringLiteralDfa11_3(active0, 0x1000000L, active1, 0x100000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x200008000L, active8, 0L, active9, 0x22000L, active10, 0x2L, active11, 0L); case 68: case 100: if ((active3 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(10, 225, 77); + return jjStartNfaWithStates_3(10, 225, 78); else if ((active5 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(10, 340, 77); + return jjStartNfaWithStates_3(10, 340, 78); else if ((active5 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(10, 341, 77); + return jjStartNfaWithStates_3(10, 341, 78); else if ((active10 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(10, 667, 77); - return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x200000000000L); + return jjStartNfaWithStates_3(10, 667, 78); + return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x400000000000L); case 69: case 101: if ((active0 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(10, 40, 77); + return jjStartNfaWithStates_3(10, 40, 78); else if ((active1 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(10, 89, 77); + return jjStartNfaWithStates_3(10, 89, 78); else if ((active2 & 0x10L) != 0L) - return jjStartNfaWithStates_3(10, 132, 77); + return jjStartNfaWithStates_3(10, 132, 78); else if ((active3 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(10, 216, 77); + return jjStartNfaWithStates_3(10, 216, 78); else if ((active4 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(10, 270, 77); + return jjStartNfaWithStates_3(10, 270, 78); else if ((active7 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(10, 508, 77); + return jjStartNfaWithStates_3(10, 508, 78); else if ((active8 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(10, 527, 77); + return jjStartNfaWithStates_3(10, 527, 78); else if ((active9 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(10, 620, 77); + return jjStartNfaWithStates_3(10, 620, 78); else if ((active9 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(10, 624, 77); - else if ((active11 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(10, 735, 77); - return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x1e0000000000L, active11, 0x80010L); + return jjStartNfaWithStates_3(10, 624, 78); + else if ((active11 & 0x100000000L) != 0L) + return jjStartNfaWithStates_3(10, 736, 78); + return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x3c0000000000L, active11, 0x100020L); case 70: case 102: return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 71: case 103: if ((active7 & 0x800L) != 0L) - return jjStartNfaWithStates_3(10, 459, 77); + return jjStartNfaWithStates_3(10, 459, 78); return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: if ((active1 & 0x8L) != 0L) - return jjStartNfaWithStates_3(10, 67, 77); + return jjStartNfaWithStates_3(10, 67, 78); else if ((active6 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(10, 418, 77); - return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjStartNfaWithStates_3(10, 418, 78); + return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 73: case 105: return jjMoveStringLiteralDfa11_3(active0, 0x21000000000L, active1, 0x800000002000L, active2, 0x1000L, active3, 0x2L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0L, active8, 0L, active9, 0x4400000000000000L, active10, 0L, active11, 0L); case 76: case 108: if ((active1 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(10, 95, 77); + return jjStartNfaWithStates_3(10, 95, 78); else if ((active8 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(10, 557, 77); + return jjStartNfaWithStates_3(10, 557, 78); return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0x1000000000000020L, active2, 0L, active3, 0L, active4, 0x20000L, active5, 0L, active6, 0L, active7, 0x4000000000000000L, active8, 0x2000L, active9, 0L, active10, 0L, active11, 0L); case 77: case 109: @@ -19486,18 +19521,18 @@ else if ((active8 & 0x200000000000L) != 0L) case 78: case 110: if ((active2 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(10, 168, 77); + return jjStartNfaWithStates_3(10, 168, 78); else if ((active8 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(10, 553, 77); + return jjStartNfaWithStates_3(10, 553, 78); else if ((active10 & 0x8L) != 0L) { jjmatchedKind = 643; jjmatchedPos = 10; } else if ((active10 & 0x800L) != 0L) - return jjStartNfaWithStates_3(10, 651, 77); - else if ((active11 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(10, 728, 77); + return jjStartNfaWithStates_3(10, 651, 78); + else if ((active11 & 0x2000000L) != 0L) + return jjStartNfaWithStates_3(10, 729, 78); return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0x10c200000L, active2, 0x180000000006000L, active3, 0L, active4, 0L, active5, 0x10000L, active6, 0x40002000000L, active7, 0L, active8, 0L, active9, 0xc040L, active10, 0x10000070L, active11, 0L); case 79: case 111: @@ -19505,9 +19540,9 @@ else if ((active11 & 0x1000000L) != 0L) case 80: case 112: if ((active9 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(10, 604, 77); - else if ((active11 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(10, 726, 77); + return jjStartNfaWithStates_3(10, 604, 78); + else if ((active11 & 0x800000L) != 0L) + return jjStartNfaWithStates_3(10, 727, 78); return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 81: case 113: @@ -19515,22 +19550,22 @@ else if ((active11 & 0x400000L) != 0L) case 82: case 114: if ((active1 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(10, 105, 77); + return jjStartNfaWithStates_3(10, 105, 78); else if ((active8 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_3(10, 560, 77); + return jjStartNfaWithStates_3(10, 560, 78); else if ((active9 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(10, 597, 77); + return jjStartNfaWithStates_3(10, 597, 78); else if ((active9 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(10, 621, 77); + return jjStartNfaWithStates_3(10, 621, 78); return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xc000000000000000L, active9, 0x4200000001L, active10, 0x400L, active11, 0L); case 83: case 115: if ((active1 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(10, 104, 77); + return jjStartNfaWithStates_3(10, 104, 78); else if ((active2 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(10, 171, 77); + return jjStartNfaWithStates_3(10, 171, 78); else if ((active4 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(10, 290, 77); + return jjStartNfaWithStates_3(10, 290, 78); return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0x4003c0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: @@ -19540,11 +19575,11 @@ else if ((active4 & 0x400000000L) != 0L) jjmatchedPos = 10; } else if ((active7 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_3(10, 501, 77); + return jjStartNfaWithStates_3(10, 501, 78); else if ((active9 & 0x200L) != 0L) - return jjStartNfaWithStates_3(10, 585, 77); + return jjStartNfaWithStates_3(10, 585, 78); else if ((active9 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(10, 610, 77); + return jjStartNfaWithStates_3(10, 610, 78); return jjMoveStringLiteralDfa11_3(active0, 0L, active1, 0xb00000000000000L, active2, 0x40000000000L, active3, 0L, active4, 0x8000001000000004L, active5, 0x2000000000020000L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x1000000000000000L, active10, 0x4000L, active11, 0L); case 85: case 117: @@ -19552,7 +19587,7 @@ else if ((active9 & 0x400000000L) != 0L) case 87: case 119: if ((active1 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(10, 125, 77); + return jjStartNfaWithStates_3(10, 125, 78); break; case 88: case 120: @@ -19560,11 +19595,11 @@ else if ((active9 & 0x400000000L) != 0L) case 89: case 121: if ((active0 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(10, 55, 77); + return jjStartNfaWithStates_3(10, 55, 78); else if ((active4 & 0x2L) != 0L) - return jjStartNfaWithStates_3(10, 257, 77); + return jjStartNfaWithStates_3(10, 257, 78); else if ((active9 & 0x400L) != 0L) - return jjStartNfaWithStates_3(10, 586, 77); + return jjStartNfaWithStates_3(10, 586, 78); break; default : break; @@ -19583,11 +19618,11 @@ private final int jjMoveStringLiteralDfa11_3(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 65: case 97: if ((active8 & 0x1L) != 0L) - return jjStartNfaWithStates_3(11, 512, 77); + return jjStartNfaWithStates_3(11, 512, 78); return jjMoveStringLiteralDfa12_3(active0, 0x1000000L, active1, 0x500000000300000L, active2, 0L, active3, 0L, active4, 0x8000001000000000L, active5, 0L, active6, 0x2000000L, active7, 0x100000000000L, active8, 0L, active9, 0L, active10, 0x10004000L, active11, 0L); case 66: case 98: @@ -19598,31 +19633,31 @@ private final int jjMoveStringLiteralDfa11_3(long old0, long active0, long old1, case 68: case 100: if ((active9 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(11, 633, 77); - return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjStartNfaWithStates_3(11, 633, 78); + return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 69: case 101: if ((active0 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(11, 61, 77); + return jjStartNfaWithStates_3(11, 61, 78); else if ((active1 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(11, 121, 77); + return jjStartNfaWithStates_3(11, 121, 78); else if ((active1 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(11, 124, 77); + return jjStartNfaWithStates_3(11, 124, 78); else if ((active1 & 0x8000000000000000L) != 0L) { jjmatchedKind = 127; jjmatchedPos = 11; } else if ((active4 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(11, 273, 77); + return jjStartNfaWithStates_3(11, 273, 78); else if ((active7 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(11, 493, 77); + return jjStartNfaWithStates_3(11, 493, 78); else if ((active8 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(11, 525, 77); + return jjStartNfaWithStates_3(11, 525, 78); else if ((active8 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(11, 544, 77); + return jjStartNfaWithStates_3(11, 544, 78); else if ((active10 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(11, 655, 77); + return jjStartNfaWithStates_3(11, 655, 78); return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0x40000000000001e0L, active2, 0x1L, active3, 0L, active4, 0L, active5, 0x20000L, active6, 0L, active7, 0x400000008000L, active8, 0L, active9, 0x4000000000L, active10, 0x10400L, active11, 0L); case 70: case 102: @@ -19633,9 +19668,9 @@ else if ((active10 & 0x8000L) != 0L) case 72: case 104: if ((active1 & 0x800000000000000L) != 0L) - return jjStartNfaWithStates_3(11, 123, 77); + return jjStartNfaWithStates_3(11, 123, 78); else if ((active5 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(11, 381, 77); + return jjStartNfaWithStates_3(11, 381, 78); break; case 73: case 105: @@ -19643,14 +19678,14 @@ else if ((active5 & 0x2000000000000000L) != 0L) case 75: case 107: if ((active6 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(11, 426, 77); + return jjStartNfaWithStates_3(11, 426, 78); else if ((active9 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(11, 594, 77); + return jjStartNfaWithStates_3(11, 594, 78); break; case 76: case 108: if ((active7 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(11, 502, 77); + return jjStartNfaWithStates_3(11, 502, 78); return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0x3ffe000000000000L, active9, 0L, active10, 0L, active11, 0L); case 77: case 109: @@ -19658,11 +19693,11 @@ else if ((active9 & 0x40000L) != 0L) case 78: case 110: if ((active1 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(11, 77, 77); + return jjStartNfaWithStates_3(11, 77, 78); else if ((active4 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(11, 277, 77); + return jjStartNfaWithStates_3(11, 277, 78); else if ((active8 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(11, 546, 77); + return jjStartNfaWithStates_3(11, 546, 78); return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0x804800000000L, active2, 0x2L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x100000000L, active8, 0L, active9, 0x4000000000000001L, active10, 0L, active11, 0L); case 79: case 111: @@ -19673,39 +19708,39 @@ else if ((active8 & 0x400000000L) != 0L) case 82: case 114: if ((active2 & 0x4L) != 0L) - return jjStartNfaWithStates_3(11, 130, 77); + return jjStartNfaWithStates_3(11, 130, 78); else if ((active5 & 0x100L) != 0L) - return jjStartNfaWithStates_3(11, 328, 77); + return jjStartNfaWithStates_3(11, 328, 78); else if ((active8 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(11, 529, 77); + return jjStartNfaWithStates_3(11, 529, 78); else if ((active9 & 0x10L) != 0L) - return jjStartNfaWithStates_3(11, 580, 77); + return jjStartNfaWithStates_3(11, 580, 78); else if ((active9 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(11, 588, 77); + return jjStartNfaWithStates_3(11, 588, 78); else if ((active9 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(11, 595, 77); - return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x200000L); + return jjStartNfaWithStates_3(11, 595, 78); + return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x400000L); case 83: case 115: return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0x8000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x70L, active11, 0L); case 84: case 116: if ((active3 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(11, 244, 77); + return jjStartNfaWithStates_3(11, 244, 78); else if ((active5 & 0x40000L) != 0L) - return jjStartNfaWithStates_3(11, 338, 77); + return jjStartNfaWithStates_3(11, 338, 78); else if ((active9 & 0x40L) != 0L) - return jjStartNfaWithStates_3(11, 582, 77); - else if ((active11 & 0x10L) != 0L) - return jjStartNfaWithStates_3(11, 708, 77); + return jjStartNfaWithStates_3(11, 582, 78); + else if ((active11 & 0x20L) != 0L) + return jjStartNfaWithStates_3(11, 709, 78); return jjMoveStringLiteralDfa12_3(active0, 0x20000800000L, active1, 0x200L, active2, 0x6000L, active3, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x8000L, active10, 0L, active11, 0L); case 85: case 117: return jjMoveStringLiteralDfa12_3(active0, 0L, active1, 0x100000000L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2000000000004000L, active10, 0L, active11, 0L); case 89: case 121: - if ((active11 & 0x80000L) != 0L) - return jjStartNfaWithStates_3(11, 723, 77); + if ((active11 & 0x100000L) != 0L) + return jjStartNfaWithStates_3(11, 724, 78); break; default : break; @@ -19724,14 +19759,14 @@ private final int jjMoveStringLiteralDfa12_3(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa13_3(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x1e0000000070L, active11, 0L); + return jjMoveStringLiteralDfa13_3(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x3c0000000070L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0x6800000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: if ((active2 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(12, 170, 77); + return jjStartNfaWithStates_3(12, 170, 78); return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0x8000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1L, active10, 0L, active11, 0L); case 68: case 100: @@ -19739,26 +19774,26 @@ private final int jjMoveStringLiteralDfa12_3(long old0, long active0, long old1, case 69: case 101: if ((active8 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(12, 543, 77); + return jjStartNfaWithStates_3(12, 543, 78); return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0L, active2, 0x6000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000038000000L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 70: case 102: if ((active2 & 0x1000L) != 0L) - return jjStartNfaWithStates_3(12, 140, 77); + return jjStartNfaWithStates_3(12, 140, 78); else if ((active9 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(12, 634, 77); + return jjStartNfaWithStates_3(12, 634, 78); return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x800000000000000L, active10, 0L, active11, 0L); case 71: case 103: if ((active1 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_3(12, 111, 77); + return jjStartNfaWithStates_3(12, 111, 78); else if ((active4 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(12, 289, 77); + return jjStartNfaWithStates_3(12, 289, 78); return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x1000000000L, active5, 0L, active6, 0L, active7, 0x4000000100000000L, active8, 0L, active9, 0x4200000000L, active10, 0x400L, active11, 0L); case 72: case 104: if ((active9 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(12, 591, 77); + return jjStartNfaWithStates_3(12, 591, 78); return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0x400000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: @@ -19766,7 +19801,7 @@ else if ((active4 & 0x200000000L) != 0L) case 76: case 108: if ((active10 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(12, 668, 77); + return jjStartNfaWithStates_3(12, 668, 78); return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0x100000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0L, active10, 0x4000L, active11, 0L); case 77: case 109: @@ -19774,22 +19809,22 @@ else if ((active4 & 0x200000000L) != 0L) case 78: case 110: if ((active0 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(12, 36, 77); + return jjStartNfaWithStates_3(12, 36, 78); else if ((active3 & 0x2L) != 0L) - return jjStartNfaWithStates_3(12, 193, 77); + return jjStartNfaWithStates_3(12, 193, 78); return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0x20L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x20000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x400000L); case 80: case 112: if ((active9 & 0x100L) != 0L) - return jjStartNfaWithStates_3(12, 584, 77); - return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjStartNfaWithStates_3(12, 584, 78); + return jjMoveStringLiteralDfa13_3(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 82: case 114: if ((active9 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(12, 637, 77); + return jjStartNfaWithStates_3(12, 637, 78); return jjMoveStringLiteralDfa13_3(active0, 0x1000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 83: case 115: @@ -19803,7 +19838,7 @@ else if ((active3 & 0x2L) != 0L) case 89: case 121: if ((active9 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(12, 596, 77); + return jjStartNfaWithStates_3(12, 596, 78); break; default : break; @@ -19826,50 +19861,50 @@ private final int jjMoveStringLiteralDfa13_3(long old0, long active0, long old1, case 65: case 97: if ((active1 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_3(13, 126, 77); + return jjStartNfaWithStates_3(13, 126, 78); else if ((active7 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_3(13, 494, 77); + return jjStartNfaWithStates_3(13, 494, 78); else if ((active10 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(13, 656, 77); - return jjMoveStringLiteralDfa14_3(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjStartNfaWithStates_3(13, 656, 78); + return jjMoveStringLiteralDfa14_3(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 66: case 98: return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0x100000000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: if ((active2 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(13, 143, 77); + return jjStartNfaWithStates_3(13, 143, 78); return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0x200L, active2, 0L, active4, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x20L, active11, 0L); case 68: case 100: if ((active9 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(13, 593, 77); + return jjStartNfaWithStates_3(13, 593, 78); return jjMoveStringLiteralDfa14_3(active0, 0x1000000L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1e000000000000L, active9, 0L, active10, 0L, active11, 0L); case 69: case 101: if ((active1 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(13, 85, 77); + return jjStartNfaWithStates_3(13, 85, 78); else if ((active6 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(13, 408, 77); + return jjStartNfaWithStates_3(13, 408, 78); else if ((active6 & 0x2000000L) != 0L) - return jjStartNfaWithStates_3(13, 409, 77); + return jjStartNfaWithStates_3(13, 409, 78); else if ((active9 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(13, 590, 77); + return jjStartNfaWithStates_3(13, 590, 78); return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0x400000L, active2, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x4000010000L, active10, 0x400L, active11, 0L); case 70: case 102: if ((active9 & 0x800000000000000L) != 0L) - return jjStartNfaWithStates_3(13, 635, 77); + return jjStartNfaWithStates_3(13, 635, 78); return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0L, active2, 0x2L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 71: case 103: if ((active4 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_3(13, 292, 77); + return jjStartNfaWithStates_3(13, 292, 78); return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0x20L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: if ((active5 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(13, 336, 77); + return jjStartNfaWithStates_3(13, 336, 78); return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0x8000000000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xe0000000000000L, active9, 0x1L, active10, 0L, active11, 0L); case 73: case 105: @@ -19883,15 +19918,15 @@ else if ((active9 & 0x4000L) != 0L) case 78: case 110: if ((active4 & 0x4L) != 0L) - return jjStartNfaWithStates_3(13, 258, 77); - return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x200000L); + return jjStartNfaWithStates_3(13, 258, 78); + return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x400000L); case 79: case 111: return jjMoveStringLiteralDfa14_3(active0, 0x20000000000L, active1, 0x100000000000000L, active2, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0L, active10, 0x4000L, active11, 0L); case 80: case 112: if ((active4 & 0x8000000000000000L) != 0L) - return jjStartNfaWithStates_3(13, 319, 77); + return jjStartNfaWithStates_3(13, 319, 78); break; case 82: case 114: @@ -19899,17 +19934,17 @@ else if ((active9 & 0x4000L) != 0L) case 83: case 115: if ((active7 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_3(13, 510, 77); + return jjStartNfaWithStates_3(13, 510, 78); return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0x800000000000000L, active9, 0x2800L, active10, 0L, active11, 0L); case 84: case 116: if ((active7 & 0x8000L) != 0L) - return jjStartNfaWithStates_3(13, 463, 77); - return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x1e0000000000L, active11, 0L); + return jjStartNfaWithStates_3(13, 463, 78); + return jjMoveStringLiteralDfa14_3(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x3c0000000000L, active11, 0L); case 88: case 120: if ((active6 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(13, 435, 77); + return jjStartNfaWithStates_3(13, 435, 78); break; case 89: case 121: @@ -19941,38 +19976,38 @@ private final int jjMoveStringLiteralDfa14_3(long old0, long active0, long old1, case 67: case 99: if ((active6 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(14, 425, 77); + return jjStartNfaWithStates_3(14, 425, 78); else if ((active9 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(14, 636, 77); + return jjStartNfaWithStates_3(14, 636, 78); return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0L); case 69: case 101: if ((active1 & 0x800000000L) != 0L) - return jjStartNfaWithStates_3(14, 99, 77); + return jjStartNfaWithStates_3(14, 99, 78); else if ((active1 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(14, 102, 77); + return jjStartNfaWithStates_3(14, 102, 78); else if ((active5 & 0x200L) != 0L) - return jjStartNfaWithStates_3(14, 329, 77); + return jjStartNfaWithStates_3(14, 329, 78); else if ((active9 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_3(14, 638, 77); + return jjStartNfaWithStates_3(14, 638, 78); return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0x8100000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3800000000000000L, active9, 0x2800L, active10, 0L, active11, 0L); case 71: case 103: if ((active1 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_3(14, 120, 77); + return jjStartNfaWithStates_3(14, 120, 78); else if ((active7 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(14, 492, 77); + return jjStartNfaWithStates_3(14, 492, 78); else if ((active10 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(14, 654, 77); + return jjStartNfaWithStates_3(14, 654, 78); return jjMoveStringLiteralDfa15_3(active0, 0x800000L, active1, 0L, active2, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: if ((active7 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(14, 480, 77); + return jjStartNfaWithStates_3(14, 480, 78); break; case 73: case 105: - return jjMoveStringLiteralDfa15_3(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa15_3(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x400000L); case 76: case 108: return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -19982,11 +20017,11 @@ else if ((active10 & 0x4000L) != 0L) case 78: case 110: if ((active0 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(14, 41, 77); + return jjStartNfaWithStates_3(14, 41, 78); else if ((active5 & 0x80L) != 0L) - return jjStartNfaWithStates_3(14, 327, 77); + return jjStartNfaWithStates_3(14, 327, 78); else if ((active9 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(14, 609, 77); + return jjStartNfaWithStates_3(14, 609, 78); return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0x80L, active2, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 79: case 111: @@ -19994,23 +20029,23 @@ else if ((active9 & 0x200000000L) != 0L) case 82: case 114: if ((active1 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(14, 107, 77); + return jjStartNfaWithStates_3(14, 107, 78); else if ((active8 & 0x8000000000000000L) != 0L) - return jjStartNfaWithStates_3(14, 575, 77); + return jjStartNfaWithStates_3(14, 575, 78); else if ((active9 & 0x10000L) != 0L) - return jjStartNfaWithStates_3(14, 592, 77); - return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjStartNfaWithStates_3(14, 592, 78); + return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 83: case 115: if ((active1 & 0x200L) != 0L) - return jjStartNfaWithStates_3(14, 73, 77); + return jjStartNfaWithStates_3(14, 73, 78); return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: if ((active6 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_3(14, 424, 77); + return jjStartNfaWithStates_3(14, 424, 78); else if ((active10 & 0x2L) != 0L) - return jjStartNfaWithStates_3(14, 641, 77); + return jjStartNfaWithStates_3(14, 641, 78); return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0x400000000000020L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 86: case 118: @@ -20018,13 +20053,13 @@ else if ((active10 & 0x2L) != 0L) case 88: case 120: if ((active9 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_3(14, 614, 77); + return jjStartNfaWithStates_3(14, 614, 78); else if ((active10 & 0x400L) != 0L) - return jjStartNfaWithStates_3(14, 650, 77); + return jjStartNfaWithStates_3(14, 650, 78); break; case 89: case 121: - return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa15_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); default : break; } @@ -20046,7 +20081,7 @@ private final int jjMoveStringLiteralDfa15_3(long old0, long active0, long old1, case 65: case 97: if ((active1 & 0x400000L) != 0L) - return jjStartNfaWithStates_3(15, 86, 77); + return jjStartNfaWithStates_3(15, 86, 78); return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0xc0L, active2, 0x6000L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0x3000000000000000L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: @@ -20060,12 +20095,12 @@ private final int jjMoveStringLiteralDfa15_3(long old0, long active0, long old1, case 71: case 103: if ((active0 & 0x800000L) != 0L) - return jjStartNfaWithStates_3(15, 23, 77); + return jjStartNfaWithStates_3(15, 23, 78); break; case 72: case 104: if ((active1 & 0x20L) != 0L) - return jjStartNfaWithStates_3(15, 69, 77); + return jjStartNfaWithStates_3(15, 69, 78); break; case 76: case 108: @@ -20091,17 +20126,17 @@ else if ((active2 & 0x80000000000000L) != 0L) return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 82: case 114: if ((active1 & 0x100000000L) != 0L) - return jjStartNfaWithStates_3(15, 96, 77); + return jjStartNfaWithStates_3(15, 96, 78); else if ((active9 & 0x1L) != 0L) - return jjStartNfaWithStates_3(15, 576, 77); + return jjStartNfaWithStates_3(15, 576, 78); return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xe0000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -20115,7 +20150,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa16_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); default : break; } @@ -20137,24 +20172,24 @@ private final int jjMoveStringLiteralDfa16_3(long old0, long active0, long old1, case 65: case 97: if ((active1 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_3(16, 103, 77); - return jjMoveStringLiteralDfa17_3(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjStartNfaWithStates_3(16, 103, 78); + return jjMoveStringLiteralDfa17_3(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: if ((active7 & 0x400000000L) != 0L) - return jjStartNfaWithStates_3(16, 482, 77); - return jjMoveStringLiteralDfa17_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjStartNfaWithStates_3(16, 482, 78); + return jjMoveStringLiteralDfa17_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active1 & 0x100000L) != 0L) - return jjStartNfaWithStates_3(16, 84, 77); + return jjStartNfaWithStates_3(16, 84, 78); break; case 72: case 104: return jjMoveStringLiteralDfa17_3(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa17_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa17_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 76: case 108: return jjMoveStringLiteralDfa17_3(active0, 0L, active1, 0L, active2, 0x6000L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0L, active10, 0x40L, active11, 0L); @@ -20170,7 +20205,7 @@ private final int jjMoveStringLiteralDfa16_3(long old0, long active0, long old1, case 80: case 112: if ((active2 & 0x1L) != 0L) - return jjStartNfaWithStates_3(16, 128, 77); + return jjStartNfaWithStates_3(16, 128, 78); break; case 82: case 114: @@ -20194,12 +20229,12 @@ else if ((active8 & 0x1000000000000000L) != 0L) case 88: case 120: if ((active5 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_3(16, 380, 77); + return jjStartNfaWithStates_3(16, 380, 78); break; case 89: case 121: if ((active8 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_3(16, 574, 77); + return jjStartNfaWithStates_3(16, 574, 78); break; default : break; @@ -20218,7 +20253,7 @@ private final int jjMoveStringLiteralDfa17_3(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -20228,17 +20263,17 @@ private final int jjMoveStringLiteralDfa17_3(long old0, long active0, long old1, case 69: case 101: if ((active1 & 0x80L) != 0L) - return jjStartNfaWithStates_3(17, 71, 77); + return jjStartNfaWithStates_3(17, 71, 78); return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x40L, active11, 0L); case 71: case 103: if ((active1 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_3(17, 101, 77); + return jjStartNfaWithStates_3(17, 101, 78); return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: if ((active8 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(17, 570, 77); + return jjStartNfaWithStates_3(17, 570, 78); break; case 73: case 105: @@ -20254,7 +20289,7 @@ private final int jjMoveStringLiteralDfa17_3(long old0, long active0, long old1, return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 86: case 118: return jjMoveStringLiteralDfa18_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0L); @@ -20281,15 +20316,15 @@ private final int jjMoveStringLiteralDfa18_3(long old0, long active0, long old1, return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x60000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0xc0000000000L, active11, 0L); case 68: case 100: if ((active8 & 0x800000000000000L) != 0L) - return jjStartNfaWithStates_3(18, 571, 77); + return jjStartNfaWithStates_3(18, 571, 78); else if ((active9 & 0x800L) != 0L) - return jjStartNfaWithStates_3(18, 587, 77); + return jjStartNfaWithStates_3(18, 587, 78); else if ((active9 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(18, 589, 77); + return jjStartNfaWithStates_3(18, 589, 78); return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x40L, active11, 0L); case 69: case 101: @@ -20299,14 +20334,14 @@ else if ((active9 & 0x2000L) != 0L) jjmatchedPos = 18; } else if ((active10 & 0x10L) != 0L) - return jjStartNfaWithStates_3(18, 644, 77); + return jjStartNfaWithStates_3(18, 644, 78); return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active9, 0L, active10, 0L, active11, 0L); case 71: case 103: return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa19_3(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa19_3(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 76: case 108: return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -20315,7 +20350,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); case 79: case 111: return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -20324,7 +20359,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0x4000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000L, active11, 0L); case 84: case 116: return jjMoveStringLiteralDfa19_3(active0, 0L, active1, 0L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0x80000000L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x20L, active11, 0L); @@ -20349,25 +20384,25 @@ private final int jjMoveStringLiteralDfa19_3(long old0, long active0, long old1, case 65: case 97: if ((active1 & 0x100L) != 0L) - return jjStartNfaWithStates_3(19, 72, 77); - return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0xa0000000000L, active11, 0L); + return jjStartNfaWithStates_3(19, 72, 78); + return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0x140000000000L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x200000000000L, active11, 0L); case 68: case 100: return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 72: case 104: if ((active5 & 0x20000L) != 0L) - return jjStartNfaWithStates_3(19, 337, 77); + return jjStartNfaWithStates_3(19, 337, 78); break; case 78: case 110: return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0x10000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x40000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x80000000000L, active11, 0x400000400000L); case 82: case 114: return jjMoveStringLiteralDfa20_3(active0, 0L, active1, 0L, active2, 0x4002L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -20380,7 +20415,7 @@ private final int jjMoveStringLiteralDfa19_3(long old0, long active0, long old1, case 89: case 121: if ((active7 & 0x80000000L) != 0L) - return jjStartNfaWithStates_3(19, 479, 77); + return jjStartNfaWithStates_3(19, 479, 78); break; default : break; @@ -20411,30 +20446,30 @@ private final int jjMoveStringLiteralDfa20_3(long old0, long active0, long old1, return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0x20000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 68: case 100: - return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x80000000000L, active11, 0L); case 69: case 101: if ((active1 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(20, 91, 77); + return jjStartNfaWithStates_3(20, 91, 78); else if ((active2 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_3(20, 184, 77); + return jjStartNfaWithStates_3(20, 184, 78); return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0x4000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x20L, active11, 0L); case 71: case 103: if ((active1 & 0x40L) != 0L) - return jjStartNfaWithStates_3(20, 70, 77); + return jjStartNfaWithStates_3(20, 70, 78); break; case 72: case 104: if ((active7 & 0x200000000L) != 0L) - return jjStartNfaWithStates_3(20, 481, 77); - return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x100000000000L, active11, 0L); + return jjStartNfaWithStates_3(20, 481, 78); + return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x200000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x100000000000L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 79: case 111: return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0x2L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -20443,11 +20478,11 @@ else if ((active2 & 0x100000000000000L) != 0L) return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0x400000000000000L, active2, 0L, active6, 0x4000000L, active7, 0L, active8, 0x10000000000000L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_3(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x40000000000L, active11, 0L); case 89: case 121: if ((active0 & 0x1000000L) != 0L) - return jjStartNfaWithStates_3(20, 24, 77); + return jjStartNfaWithStates_3(20, 24, 78); break; default : break; @@ -20466,27 +20501,27 @@ private final int jjMoveStringLiteralDfa21_3(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa22_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa22_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 65: case 97: - return jjMoveStringLiteralDfa22_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000040L, active11, 0L); + return jjMoveStringLiteralDfa22_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000040L, active11, 0L); case 67: case 99: return jjMoveStringLiteralDfa22_3(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 68: case 100: if ((active10 & 0x20L) != 0L) - return jjStartNfaWithStates_3(21, 645, 77); + return jjStartNfaWithStates_3(21, 645, 78); break; case 69: case 101: if ((active2 & 0x2000L) != 0L) - return jjStartNfaWithStates_3(21, 141, 77); - else if ((active10 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_3(21, 682, 77); + return jjStartNfaWithStates_3(21, 141, 78); else if ((active10 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_3(21, 683, 77); - return jjMoveStringLiteralDfa22_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x100000000000L, active11, 0L); + return jjStartNfaWithStates_3(21, 683, 78); + else if ((active10 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_3(21, 684, 78); + return jjMoveStringLiteralDfa22_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x200000000000L, active11, 0L); case 70: case 102: return jjMoveStringLiteralDfa22_3(active1, 0x400000000000000L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -20538,17 +20573,17 @@ private final int jjMoveStringLiteralDfa22_3(long old1, long active1, long old2, case 69: case 101: if ((active6 & 0x10000000L) != 0L) - return jjStartNfaWithStates_3(22, 412, 77); + return jjStartNfaWithStates_3(22, 412, 78); return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0x20000000L, active8, 0x80000000000000L, active10, 0L, active11, 0L); case 73: case 105: return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 76: case 108: - return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x100000000000L, active11, 0x200000L); + return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x200000000000L, active11, 0x400000L); case 78: case 110: return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x8000000000000L, active10, 0L, active11, 0L); @@ -20560,7 +20595,7 @@ private final int jjMoveStringLiteralDfa22_3(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 82: case 114: - return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa23_3(active1, 0L, active2, 0L, active6, 0x4000000L, active8, 0L, active10, 0L, active11, 0L); @@ -20587,8 +20622,8 @@ private final int jjMoveStringLiteralDfa23_3(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_3(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 65: case 97: - if ((active10 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_3(23, 684, 77); + if ((active10 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_3(23, 685, 78); break; case 67: case 99: @@ -20599,7 +20634,7 @@ private final int jjMoveStringLiteralDfa23_3(long old1, long active1, long old2, case 75: case 107: if ((active10 & 0x40L) != 0L) - return jjStartNfaWithStates_3(23, 646, 77); + return jjStartNfaWithStates_3(23, 646, 78); break; case 76: case 108: @@ -20612,11 +20647,11 @@ private final int jjMoveStringLiteralDfa23_3(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x2040000000000000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa24_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x20000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa24_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x40000000000L, active11, 0x400000400000L); case 82: case 114: if ((active8 & 0x4000000000000L) != 0L) - return jjStartNfaWithStates_3(23, 562, 77); + return jjStartNfaWithStates_3(23, 562, 78); return jjMoveStringLiteralDfa24_3(active1, 0x400000000000000L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 83: case 115: @@ -20643,11 +20678,11 @@ private final int jjMoveStringLiteralDfa24_3(long old1, long active1, long old2, case 65: case 97: if ((active6 & 0x20000000L) != 0L) - return jjStartNfaWithStates_3(24, 413, 77); + return jjStartNfaWithStates_3(24, 413, 78); break; case 68: case 100: - return jjMoveStringLiteralDfa25_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa25_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: return jjMoveStringLiteralDfa25_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x200000000000000L, active10, 0L, active11, 0L); @@ -20656,8 +20691,8 @@ private final int jjMoveStringLiteralDfa24_3(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_3(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_3(24, 681, 77); + if ((active10 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_3(24, 682, 78); break; case 73: case 105: @@ -20679,7 +20714,7 @@ private final int jjMoveStringLiteralDfa24_3(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 87: case 119: - return jjMoveStringLiteralDfa25_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa25_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); default : break; } @@ -20704,36 +20739,36 @@ private final int jjMoveStringLiteralDfa25_3(long old1, long active1, long old2, case 68: case 100: if ((active8 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_3(25, 564, 77); + return jjStartNfaWithStates_3(25, 564, 78); break; case 69: case 101: if ((active8 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_3(25, 563, 77); - else if ((active11 & 0x200000L) != 0L) - return jjStartNfaWithStates_3(25, 725, 77); + return jjStartNfaWithStates_3(25, 563, 78); + else if ((active11 & 0x400000L) != 0L) + return jjStartNfaWithStates_3(25, 726, 78); break; case 71: case 103: if ((active6 & 0x8000000L) != 0L) - return jjStartNfaWithStates_3(25, 411, 77); + return jjStartNfaWithStates_3(25, 411, 78); break; case 72: case 104: if ((active8 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_3(25, 573, 77); + return jjStartNfaWithStates_3(25, 573, 78); break; case 78: case 110: if ((active6 & 0x4000000L) != 0L) - return jjStartNfaWithStates_3(25, 410, 77); + return jjStartNfaWithStates_3(25, 410, 78); return jjMoveStringLiteralDfa26_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x80000000000000L, active11, 0L); case 79: case 111: return jjMoveStringLiteralDfa26_3(active1, 0L, active2, 0x4002L, active6, 0L, active8, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa26_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa26_3(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa26_3(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active11, 0L); @@ -20754,16 +20789,16 @@ private final int jjMoveStringLiteralDfa26_3(long old1, long active1, long old2, switch(curChar) { case 95: - return jjMoveStringLiteralDfa27_3(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa27_3(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 68: case 100: if ((active8 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_3(26, 567, 77); + return jjStartNfaWithStates_3(26, 567, 78); break; case 69: case 101: if ((active8 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_3(26, 566, 77); + return jjStartNfaWithStates_3(26, 566, 78); break; case 71: case 103: @@ -20771,7 +20806,7 @@ private final int jjMoveStringLiteralDfa26_3(long old1, long active1, long old2, case 78: case 110: if ((active2 & 0x4000L) != 0L) - return jjStartNfaWithStates_3(26, 142, 77); + return jjStartNfaWithStates_3(26, 142, 78); break; case 79: case 111: @@ -20802,7 +20837,7 @@ private final int jjMoveStringLiteralDfa27_3(long old1, long active1, long old2, return jjMoveStringLiteralDfa28_3(active1, 0L, active2, 0L, active8, 0x200000000000000L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa28_3(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa28_3(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 82: case 114: return jjMoveStringLiteralDfa28_3(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -20825,11 +20860,11 @@ private final int jjMoveStringLiteralDfa28_3(long old1, long active1, long old2, case 68: case 100: if ((active8 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_3(28, 569, 77); + return jjStartNfaWithStates_3(28, 569, 78); break; case 69: case 101: - return jjMoveStringLiteralDfa29_3(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa29_3(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 79: case 111: return jjMoveStringLiteralDfa29_3(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -20854,7 +20889,7 @@ private final int jjMoveStringLiteralDfa29_3(long old1, long active1, long old2, { case 82: case 114: - return jjMoveStringLiteralDfa30_3(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa30_3(active1, 0L, active2, 0L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa30_3(active1, 0x400000000000000L, active2, 0L, active11, 0L); @@ -20879,11 +20914,11 @@ private final int jjMoveStringLiteralDfa30_3(long old1, long active1, long old2, { case 67: case 99: - return jjMoveStringLiteralDfa31_3(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa31_3(active1, 0L, active2, 0L, active11, 0x400000000000L); case 80: case 112: if ((active1 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_3(30, 122, 77); + return jjStartNfaWithStates_3(30, 122, 78); return jjMoveStringLiteralDfa31_3(active1, 0L, active2, 0x2L, active11, 0L); default : break; @@ -20904,8 +20939,8 @@ private final int jjMoveStringLiteralDfa31_3(long old1, long active1, long old2, case 69: case 101: if ((active2 & 0x2L) != 0L) - return jjStartNfaWithStates_3(31, 129, 77); - return jjMoveStringLiteralDfa32_3(active2, 0L, active11, 0x200000000000L); + return jjStartNfaWithStates_3(31, 129, 78); + return jjMoveStringLiteralDfa32_3(active2, 0L, active11, 0x400000000000L); default : break; } @@ -20924,7 +20959,7 @@ private final int jjMoveStringLiteralDfa32_3(long old2, long active2, long old11 { case 78: case 110: - return jjMoveStringLiteralDfa33_3(active11, 0x200000000000L); + return jjMoveStringLiteralDfa33_3(active11, 0x400000000000L); default : break; } @@ -20943,8 +20978,8 @@ private final int jjMoveStringLiteralDfa33_3(long old11, long active11) { case 84: case 116: - if ((active11 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_3(33, 749, 77); + if ((active11 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_3(33, 750, 78); break; default : break; @@ -20975,8 +21010,8 @@ private final int jjMoveNfa_3(int startState, int curPos) jjCheckNAddStates(62, 64); else if (curChar == 34) { - if (kind > 763) - kind = 763; + if (kind > 764) + kind = 764; } break; case 58: @@ -20984,8 +21019,8 @@ else if (curChar == 34) jjCheckNAddStates(65, 67); else if (curChar == 39) { - if (kind > 764) - kind = 764; + if (kind > 765) + kind = 765; } if ((0xfc00f7faffffc9ffL & l) != 0L) jjstateSet[jjnewStateCnt++] = 59; @@ -20993,8 +21028,8 @@ else if (curChar == 39) case 76: if ((0x3ff000000000000L & l) != 0L) { - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); } if ((0x3ff000000000000L & l) != 0L) @@ -21009,30 +21044,28 @@ else if (curChar == 39) jjCheckNAddStates(68, 70); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } if (curChar == 36) jjCheckNAdd(27); break; - case 31: + case 78: if ((0x7ff601000000000L & l) != 0L) jjCheckNAddTwoStates(25, 26); - else if (curChar == 38) - jjstateSet[jjnewStateCnt++] = 32; if ((0x3ff001000000000L & l) != 0L) jjCheckNAddStates(68, 70); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } if (curChar == 36) jjCheckNAdd(27); break; - case 78: + case 77: if (curChar == 32) jjCheckNAddTwoStates(68, 69); if (curChar == 32) @@ -21042,15 +21075,17 @@ else if (curChar == 38) if (curChar == 32) jjCheckNAddTwoStates(61, 62); break; - case 77: + case 31: if ((0x7ff601000000000L & l) != 0L) jjCheckNAddTwoStates(25, 26); + else if (curChar == 38) + jjstateSet[jjnewStateCnt++] = 32; if ((0x3ff001000000000L & l) != 0L) jjCheckNAddStates(68, 70); if ((0x3ff001000000000L & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } if (curChar == 36) @@ -21065,8 +21100,8 @@ else if (curChar == 38) case 74: if (curChar == 47) { - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(71, 73); } else if (curChar == 42) @@ -21083,8 +21118,8 @@ else if (curChar == 46) jjCheckNAddTwoStates(51, 52); else if (curChar == 7) { - if (kind > 826) - kind = 826; + if (kind > 829) + kind = 829; } else if (curChar == 45) jjstateSet[jjnewStateCnt++] = 11; @@ -21092,14 +21127,14 @@ else if (curChar == 34) jjCheckNAddStates(62, 64); if ((0x3ff000000000000L & l) != 0L) { - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(80, 86); } else if (curChar == 36) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } break; @@ -21116,8 +21151,8 @@ else if (curChar == 36) jjstateSet[jjnewStateCnt++] = 3; break; case 5: - if (curChar == 39 && kind > 757) - kind = 757; + if (curChar == 39 && kind > 758) + kind = 758; break; case 6: if (curChar == 34) @@ -21131,30 +21166,30 @@ else if (curChar == 36) jjCheckNAddStates(62, 64); break; case 10: - if (curChar == 34 && kind > 763) - kind = 763; + if (curChar == 34 && kind > 764) + kind = 764; break; case 11: if (curChar != 45) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(71, 73); break; case 12: if ((0xffffffffffffdbffL & l) == 0L) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(71, 73); break; case 13: - if ((0x2400L & l) != 0L && kind > 812) - kind = 812; + if ((0x2400L & l) != 0L && kind > 815) + kind = 815; break; case 14: - if (curChar == 10 && kind > 812) - kind = 812; + if (curChar == 10 && kind > 815) + kind = 815; break; case 15: if (curChar == 13) @@ -21171,15 +21206,15 @@ else if (curChar == 36) case 22: if (curChar != 36) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); break; case 23: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); break; case 24: @@ -21197,8 +21232,8 @@ else if (curChar == 36) case 27: if (curChar != 36) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAddTwoStates(27, 28); break; case 28: @@ -21208,8 +21243,8 @@ else if (curChar == 36) case 29: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAdd(29); break; case 32: @@ -21229,25 +21264,25 @@ else if (curChar == 36) jjstateSet[jjnewStateCnt++] = 34; break; case 36: - if (curChar == 34 && kind > 823) - kind = 823; + if (curChar == 34 && kind > 826) + kind = 826; break; case 37: - if (curChar == 7 && kind > 826) - kind = 826; + if (curChar == 7 && kind > 829) + kind = 829; break; case 38: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(80, 86); break; case 39: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAdd(39); break; case 40: @@ -21261,8 +21296,8 @@ else if (curChar == 36) case 43: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 752) - kind = 752; + if (kind > 753) + kind = 753; jjCheckNAdd(43); break; case 44: @@ -21276,22 +21311,22 @@ else if (curChar == 36) case 46: if (curChar != 46) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(47); break; case 47: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(47); break; case 48: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAddStates(93, 95); break; case 49: @@ -21309,8 +21344,8 @@ else if (curChar == 36) case 52: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); break; case 53: @@ -21325,13 +21360,13 @@ else if (curChar == 36) jjCheckNAddStates(65, 67); break; case 57: - if (curChar == 39 && kind > 764) - kind = 764; - break; - case 59: if (curChar == 39 && kind > 765) kind = 765; break; + case 59: + if (curChar == 39 && kind > 766) + kind = 766; + break; case 61: if (curChar == 32) jjCheckNAddTwoStates(61, 62); @@ -21357,14 +21392,14 @@ else if (curChar == 36) jjstateSet[jjnewStateCnt++] = 73; break; case 73: - if ((0xffff7fffffffffffL & l) != 0L && kind > 810) - kind = 810; + if ((0xffff7fffffffffffL & l) != 0L && kind > 813) + kind = 813; break; case 75: if (curChar != 47) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(71, 73); break; default : break; @@ -21399,48 +21434,48 @@ else if (curChar == 92) jjCheckNAddStates(68, 70); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } break; - case 31: + case 78: if ((0x7fffffe87fffffeL & l) != 0L) jjCheckNAddTwoStates(25, 26); if ((0x7fffffe87fffffeL & l) != 0L) jjCheckNAddStates(68, 70); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } break; - case 78: + case 77: if ((0x4000000040L & l) != 0L) jjstateSet[jjnewStateCnt++] = 70; else if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 67; else if ((0x1000000010L & l) != 0L) { - if (kind > 768) - kind = 768; + if (kind > 769) + kind = 769; } if ((0x10000000100000L & l) != 0L) { - if (kind > 769) - kind = 769; + if (kind > 770) + kind = 770; } break; - case 77: + case 31: if ((0x7fffffe87fffffeL & l) != 0L) jjCheckNAddTwoStates(25, 26); if ((0x7fffffe87fffffeL & l) != 0L) jjCheckNAddStates(68, 70); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } break; @@ -21458,8 +21493,8 @@ else if (curChar == 96) jjCheckNAddStates(87, 89); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } if ((0x20000000200000L & l) != 0L) @@ -21482,8 +21517,8 @@ else if ((0x100000001000000L & l) != 0L) jjCheckNAddStates(62, 64); break; case 12: - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(71, 73); break; case 17: @@ -21502,21 +21537,21 @@ else if ((0x100000001000000L & l) != 0L) jjCheckNAddStates(87, 89); break; case 21: - if (curChar == 96 && kind > 819) - kind = 819; + if (curChar == 96 && kind > 822) + kind = 822; break; case 22: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); break; case 23: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); break; case 24: @@ -21526,15 +21561,15 @@ else if ((0x100000001000000L & l) != 0L) case 27: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(108, 109); break; case 29: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 29; break; case 30: @@ -21564,32 +21599,32 @@ else if ((0x100000001000000L & l) != 0L) jjAddStates(100, 107); break; case 62: - if ((0x1000000010L & l) != 0L && kind > 768) - kind = 768; + if ((0x1000000010L & l) != 0L && kind > 769) + kind = 769; break; case 64: - if ((0x10000000100000L & l) != 0L && kind > 769) - kind = 769; + if ((0x10000000100000L & l) != 0L && kind > 770) + kind = 770; break; case 66: if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 67; break; case 67: - if ((0x8000000080000L & l) != 0L && kind > 770) - kind = 770; + if ((0x8000000080000L & l) != 0L && kind > 771) + kind = 771; break; case 69: if ((0x4000000040L & l) != 0L) jjstateSet[jjnewStateCnt++] = 70; break; case 70: - if ((0x400000004000L & l) != 0L && kind > 771) - kind = 771; + if ((0x400000004000L & l) != 0L && kind > 772) + kind = 772; break; case 73: - if (kind > 810) - kind = 810; + if (kind > 813) + kind = 813; break; default : break; } @@ -21621,8 +21656,8 @@ else if ((0x100000001000000L & l) != 0L) case 1: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -21630,11 +21665,11 @@ else if ((0x100000001000000L & l) != 0L) if (jjCanMove_1(hiByte, i1, i2, l1, l2)) jjCheckNAddTwoStates(25, 26); break; - case 31: + case 78: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -21642,11 +21677,11 @@ else if ((0x100000001000000L & l) != 0L) if (jjCanMove_1(hiByte, i1, i2, l1, l2)) jjCheckNAddTwoStates(25, 26); break; - case 77: + case 31: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -21662,8 +21697,8 @@ else if ((0x100000001000000L & l) != 0L) case 0: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -21676,8 +21711,8 @@ else if ((0x100000001000000L & l) != 0L) case 12: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(71, 73); break; case 18: @@ -21688,15 +21723,15 @@ else if ((0x100000001000000L & l) != 0L) case 22: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); break; case 23: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 821) - kind = 821; + if (kind > 824) + kind = 824; jjCheckNAdd(23); break; case 24: @@ -21706,15 +21741,15 @@ else if ((0x100000001000000L & l) != 0L) case 27: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(108, 109); break; case 29: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 29; break; case 33: @@ -21727,8 +21762,8 @@ else if ((0x100000001000000L & l) != 0L) jjCheckNAddStates(65, 67); break; case 73: - if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 810) - kind = 810; + if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 813) + kind = 813; break; default : break; } @@ -21772,7 +21807,7 @@ private final int jjMoveNfa_5(int startState, int curPos) { case 0: if (curChar == 47) - kind = 813; + kind = 816; break; case 1: if (curChar == 42) @@ -21826,136 +21861,136 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, switch (pos) { case 0: - if ((active10 & 0x3fffffe000000L) != 0L) - { - jjmatchedKind = 820; - return 31; - } - if ((active12 & 0x10000200L) != 0L) + if ((active12 & 0x20000400L) != 0L) return 76; - if ((active11 & 0x1000L) != 0L) + if ((active12 & 0x40000000L) != 0L) + return 58; + if ((active12 & 0x20L) != 0L) + return 77; + if ((active11 & 0x2000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; return 1; } - if ((active12 & 0x20000000L) != 0L) - return 58; - if ((active12 & 0x10L) != 0L) - return 77; - if ((active12 & 0x90001000000L) != 0L) - return 74; - if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0xffffffffffffffc0L) != 0L || (active3 & 0xff8001ffffffffffL) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xfffffff000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffc000001ffffffL) != 0L || (active11 & 0x4e57ff27efffL) != 0L) + if ((active10 & 0x7fffffe000000L) != 0L) { - jjmatchedKind = 820; - return 78; + jjmatchedKind = 823; + return 31; } - if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x31a800d80000L) != 0L || (active12 & 0x200000000L) != 0L) + if ((active12 & 0x480002000000L) != 0L) + return 74; + if ((active0 & 0xfff0003ffffffff8L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fL) != 0L || (active3 & 0x7ffe0000000000L) != 0L || (active4 & 0xf0000000000L) != 0L || (active5 & 0xffffffffcL) != 0L || (active8 & 0x100000L) != 0L || (active11 & 0x635001b00000L) != 0L || (active12 & 0x1000000000L) != 0L) return 78; - if ((active12 & 0x600000L) != 0L) + if ((active12 & 0xc00000L) != 0L) return 11; - if ((active12 & 0x40000000L) != 0L) + if ((active12 & 0x80000000L) != 0L) return 79; + if ((active0 & 0xfffc000000000L) != 0L || (active2 & 0xffffffffffffffc0L) != 0L || (active3 & 0xff8001ffffffffffL) != 0L || (active4 & 0xfffff0ffffffffffL) != 0L || (active5 & 0xfffffff000000003L) != 0L || (active6 & 0xffffffffffffffffL) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffefffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfff8000001ffffffL) != 0L || (active11 & 0x9caffe4fdfffL) != 0L) + { + jjmatchedKind = 823; + return 78; + } return -1; case 1: - if ((active12 & 0x90000000000L) != 0L) - return 72; - if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x4102a0110000L) != 0L) - return 78; - if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x3efd5feeffffL) != 0L) + if ((active0 & 0xffe7fff001fffff0L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0xffffffffffffffffL) != 0L || (active3 & 0xfffe7dffffffffffL) != 0L || (active4 & 0xeffffeffe000000fL) != 0L || (active5 & 0x7ff83ffffffffffbL) != 0L || (active6 & 0xffffffffffffc1c6L) != 0L || (active7 & 0xffffffffffffffffL) != 0L || (active8 & 0xffffffffffffffffL) != 0L || (active9 & 0xffffffffffffffffL) != 0L || (active10 & 0xfffffffffffffffcL) != 0L || (active11 & 0x7dfabfddffffL) != 0L) { if (jjmatchedPos != 1) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 1; } return 78; } + if ((active12 & 0x480000000000L) != 0L) + return 72; + if ((active0 & 0x8000ffe000000L) != 0L || (active3 & 0x1800000000000L) != 0L || (active4 & 0x100000001ffffff0L) != 0L || (active5 & 0x8007c00000000000L) != 0L || (active6 & 0x3e39L) != 0L || (active10 & 0x3L) != 0L || (active11 & 0x820540220000L) != 0L) + return 78; return -1; case 2: - if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0x57fffffeefffL) != 0L) + if ((active0 & 0xffe7bfdef5e98c80L) != 0L || (active1 & 0xffffffffffffffffL) != 0L || (active2 & 0x3fe5fffffe10ffffL) != 0L || (active3 & 0xfbff5dff0fff3ffcL) != 0L || (active4 & 0xefffd0fffd03ffefL) != 0L || (active5 & 0x7ffbafffc07ff3f3L) != 0L || (active6 & 0xfffee03fffbc7de5L) != 0L || (active7 & 0xfff87ffffffff1ffL) != 0L || (active8 & 0x1ffe3ffffL) != 0L || (active9 & 0xfffffeffffc00000L) != 0L || (active10 & 0xfffffffffffffffeL) != 0L || (active11 & 0xaffffffddfffL) != 0L) { if (jjmatchedPos != 2) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 2; } return 78; } - if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x280000001000L) != 0L) + if ((active0 & 0x402008167370L) != 0L || (active2 & 0xc01a000001ef0000L) != 0L || (active3 & 0x4002000f000c003L) != 0L || (active4 & 0x2e0000fc0000L) != 0L || (active5 & 0x410003f800c08L) != 0L || (active6 & 0x11fc000438012L) != 0L || (active7 & 0x7800000000e00L) != 0L || (active8 & 0xfffffffe001c0000L) != 0L || (active9 & 0x100003fffffL) != 0L || (active11 & 0x500000002000L) != 0L) return 78; return -1; case 3: - if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0x5ffda0fffef1fffeL) != 0L || (active11 & 0x7fe7fefe0c38L) != 0L) + if ((active2 & 0x8000000000000000L) != 0L) { if (jjmatchedPos != 3) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 3; } - return 78; + return 80; } - if ((active2 & 0x8000000000000000L) != 0L) + if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0x4004be00010e0000L) != 0L || (active11 & 0x300201c78fL) != 0L) + return 78; + if ((active0 & 0x33853fdef1e9ece0L) != 0L || (active1 & 0xffdf3fffffffb803L) != 0L || (active2 & 0x35c5fc3fffd6003fL) != 0L || (active3 & 0xe1fe5d97efffa7ffL) != 0L || (active4 & 0xe9c4dc001d7bffefL) != 0L || (active5 & 0x7e1b0fcdf77ffbf3L) != 0L || (active6 & 0xfbfe7fa7ff837d81L) != 0L || (active7 & 0xfffb7efffffffd0fL) != 0L || (active8 & 0xfffffffdf4d3fd7fL) != 0L || (active9 & 0x800bfeffffbfffffL) != 0L || (active10 & 0xbffb41fffef1fffeL) != 0L || (active11 & 0xffcffdfc1870L) != 0L) { if (jjmatchedPos != 3) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 3; } - return 80; - } - if ((active0 & 0xcc62800004000000L) != 0L || (active1 & 0x20c000000047fcL) != 0L || (active2 & 0xa2003c00008ffc0L) != 0L || (active3 & 0x1a01006800001800L) != 0L || (active4 & 0x63b00ffe0800000L) != 0L || (active5 & 0x1e0a03200000000L) != 0L || (active6 & 0x4008018003c0064L) != 0L || (active7 & 0x40100000000f0L) != 0L || (active8 & 0xb280280L) != 0L || (active9 & 0x7ff4000000400000L) != 0L || (active10 & 0xa0025f00010e0000L) != 0L || (active11 & 0x180100e3c7L) != 0L) return 78; + } return -1; case 4: if ((active2 & 0x8000000000000000L) != 0L) { if (jjmatchedPos != 4) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 4; } return 80; } - if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x1da0a060001000L) != 0L || (active11 & 0x430022204809L) != 0L) - return 78; - if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0x5fe01e5f9ef5effeL) != 0L || (active11 & 0x3ce7ddde05b4L) != 0L) + if ((active0 & 0xb3c53c5ef00120e0L) != 0L || (active1 & 0xffcebffffffd37f9L) != 0L || (active2 & 0x25c5ffa7ffd6fe9fL) != 0L || (active3 & 0x61805d96e827b7abL) != 0L || (active4 & 0x5564cff1d7bc7efL) != 0L || (active5 & 0x7ecb09c4777f7801L) != 0L || (active6 & 0xebee5fa7ffba7181L) != 0L || (active7 & 0x1bfb7e3ffdfffd07L) != 0L || (active8 & 0xfffffffdd4c3fd7eL) != 0L || (active9 & 0xffca3efefc3fffffL) != 0L || (active10 & 0xbfc03cbf9ef5effeL) != 0L || (active11 & 0x79cfbbbc0b68L) != 0L) { if (jjmatchedPos != 4) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 4; } return 78; } + if ((active0 & 0x38001e8cc00L) != 0L || (active1 & 0x11000000028802L) != 0L || (active2 & 0x1000001800000020L) != 0L || (active3 & 0x907e000107d80054L) != 0L || (active4 & 0xe880900000003800L) != 0L || (active5 & 0x1100629800083f2L) != 0L || (active6 & 0x1010200000010c00L) != 0L || (active7 & 0xe40000c002000048L) != 0L || (active8 & 0x20100001L) != 0L || (active9 & 0x1c00103800000L) != 0L || (active10 & 0x3b414060001000L) != 0L || (active11 & 0x860044409012L) != 0L) + return 78; return -1; case 5: if ((active2 & 0x8000000000000000L) != 0L) { if (jjmatchedPos != 5) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 5; } return 80; } - if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x8005880800000L) != 0L || (active11 & 0x1000a0L) != 0L) - return 78; - if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0x5ff01e071e75effeL) != 0L || (active11 & 0x3ce7dfee0514L) != 0L) + if ((active0 & 0xb3850f1cf1c02040L) != 0L || (active1 & 0xffc6bfffccfd37f9L) != 0L || (active2 & 0x25c0ffa41f96fe87L) != 0L || (active3 & 0x21341c86c9069603L) != 0L || (active4 & 0xc5164cff197b47e7L) != 0L || (active5 & 0x344b09c414773be1L) != 0L || (active6 & 0x6bee57a6ffb83800L) != 0L || (active7 & 0xc1fb7a001dfffd07L) != 0L || (active8 & 0xfffffffdc4433c61L) != 0L || (active9 & 0xffcb84f6da3fffffL) != 0L || (active10 & 0xbfe03c171e75effeL) != 0L || (active11 & 0x79cfbfdc0a28L) != 0L) { if (jjmatchedPos != 5) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 5; } return 78; } + if ((active0 & 0x403042000100a0L) != 0L || (active1 & 0x8000033000000L) != 0L || (active2 & 0x50003e0400018L) != 0L || (active3 & 0x40c04110202121a8L) != 0L || (active4 & 0x40000004008008L) != 0L || (active5 & 0x4a80000163084000L) != 0L || (active6 & 0x8000080100024181L) != 0L || (active7 & 0x1a00043fe0000000L) != 0L || (active8 & 0x1080c11eL) != 0L || (active9 & 0x3a0824000000L) != 0L || (active10 & 0x1000a880800000L) != 0L || (active11 & 0x200140L) != 0L) + return 78; return -1; case 6: - if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x40d01e001c340ffeL) != 0L || (active11 & 0x2426dffa0014L) != 0L) + if ((active0 & 0x80071cf1c02040L) != 0L || (active1 & 0x469ff1ee7937f8L) != 0L || (active2 & 0x2000ff841816fe90L) != 0L || (active3 & 0x2130188609020503L) != 0L || (active4 & 0xc4024cff107341c7L) != 0L || (active5 & 0x304b00c414770b80L) != 0L || (active6 & 0x62ec0004bfa80800L) != 0L || (active7 & 0xd1f3020f90befd00L) != 0L || (active8 & 0xffffff7dc400bc41L) != 0L || (active9 & 0x7fcbb4f6da3fffffL) != 0L || (active10 & 0x81a03c101c340ffeL) != 0L || (active11 & 0x484dbff40028L) != 0L) { if (jjmatchedPos != 6) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 6; } return 78; @@ -21964,85 +21999,85 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, { if (jjmatchedPos != 6) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 6; } return 80; } - if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x1f2000070241e000L) != 0L || (active11 & 0x18c100040500L) != 0L) + if ((active0 & 0xb305080000000000L) != 0L || (active1 & 0xff80200e00840001L) != 0L || (active2 & 0x5c00020c7800007L) != 0L || (active3 & 0x40400c0049200L) != 0L || (active4 & 0x114000009080620L) != 0L || (active5 & 0x400090002003061L) != 0L || (active6 & 0x90257a240103100L) != 0L || (active7 & 0x878100d410007L) != 0L || (active8 & 0x8000430030L) != 0L || (active9 & 0x8000000000000000L) != 0L || (active10 & 0x3e4000070241e000L) != 0L || (active11 & 0x318200080a00L) != 0L) return 78; return -1; case 7: - if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0x50801e001c05cffaL) != 0L || (active11 & 0x24229bf80010L) != 0L) + if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0xa0001000300004L) != 0L || (active11 & 0x888040008L) != 0L) + return 78; + if ((active2 & 0x8000000000000000L) != 0L) + return 80; + if ((active0 & 0x2080071cf1c00000L) != 0L || (active1 & 0xff4683fdee7837f8L) != 0L || (active2 & 0x1802f0408160617L) != 0L || (active3 & 0x110080609000503L) != 0L || (active4 & 0xc40204ff103245c7L) != 0L || (active5 & 0x300b004000770380L) != 0L || (active6 & 0x60c00704bfa02000L) != 0L || (active7 & 0xd173700f8082fd00L) != 0L || (active8 & 0xffffe2740002ac01L) != 0L || (active9 & 0x7fc3b476da3ffe5fL) != 0L || (active10 & 0xa1003c001c05cffaL) != 0L || (active11 & 0x484537f00020L) != 0L) { if (jjmatchedPos != 7) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 7; } return 78; } - if ((active0 & 0x200000000002040L) != 0L || (active1 & 0x1c0000010000L) != 0L || (active2 & 0x2000d0801400f880L) != 0L || (active3 & 0x2020108000020000L) != 0L || (active4 & 0x480000410000L) != 0L || (active5 & 0x40008414002800L) != 0L || (active6 & 0x22c000000080800L) != 0L || (active7 & 0x800200103c0004L) != 0L || (active8 & 0x1d09c4001040L) != 0L || (active9 & 0x80080000001a0L) != 0L || (active10 & 0x50000000300004L) != 0L || (active11 & 0x444020004L) != 0L) - return 78; - if ((active2 & 0x8000000000000000L) != 0L) - return 80; return -1; case 8: - if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x10001e001805c87aL) != 0L || (active11 & 0x24208be80010L) != 0L) + if ((active0 & 0x20800310d1800000L) != 0L || (active1 & 0xff048bfc0e003008L) != 0L || (active2 & 0x1802f040810f417L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x40204ff00024004L) != 0L || (active5 & 0x3000004000770380L) != 0L || (active6 & 0x2008070400202000L) != 0L || (active7 & 0xd06270078082cc00L) != 0L || (active8 & 0xffff62758002a001L) != 0L || (active9 & 0x6081b016583fff59L) != 0L || (active10 & 0x20003c001805c87aL) != 0L || (active11 & 0x484117d00020L) != 0L) { if (jjmatchedPos != 8) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 8; } return 78; } - if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x4080000004000780L) != 0L || (active11 & 0x210100000L) != 0L) + if ((active0 & 0x40c20400000L) != 0L || (active1 & 0x420001e07807f0L) != 0L || (active2 & 0x60200L) != 0L || (active3 & 0x100080408000501L) != 0L || (active4 & 0xc0000000103005c3L) != 0L || (active5 & 0xb000000000000L) != 0L || (active6 & 0x40c00000bf800000L) != 0L || (active7 & 0x111000800003100L) != 0L || (active8 & 0x800000000c00L) != 0L || (active9 & 0x1f42046082000006L) != 0L || (active10 & 0x8100000004000780L) != 0L || (active11 & 0x420200000L) != 0L) return 78; return -1; case 9: - if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x1000000000040100L) != 0L || (active11 & 0x4200a800000L) != 0L) - return 78; - if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x1e001801cc7aL) != 0L || (active11 & 0x200081680010L) != 0L) + if ((active0 & 0x2080031001800000L) != 0L || (active1 & 0xff008a018e7023e8L) != 0L || (active2 & 0x1800d000000f017L) != 0L || (active3 & 0x10000201000002L) != 0L || (active4 & 0x8000001c00224006L) != 0L || (active5 & 0x3000000000370380L) != 0L || (active6 & 0x807043f000000L) != 0L || (active7 & 0x5060700780008800L) != 0L || (active8 & 0xffff22058002a001L) != 0L || (active9 & 0x7e013046103fff59L) != 0L || (active10 & 0x3c001801cc7aL) != 0L || (active11 & 0x400102d00020L) != 0L) { if (jjmatchedPos != 9) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 9; } return 78; } + if ((active0 & 0x8d0000000L) != 0L || (active1 & 0x401fc00001400L) != 0L || (active2 & 0x220408100400L) != 0L || (active4 & 0x40204e300000000L) != 0L || (active5 & 0x2004000400000L) != 0L || (active6 & 0x2000000000202000L) != 0L || (active7 & 0x8002000000824400L) != 0L || (active8 & 0x407000000000L) != 0L || (active9 & 0x80801048000000L) != 0L || (active10 & 0x2000000000040100L) != 0L || (active11 & 0x84015000000L) != 0L) + return 78; return -1; case 10: - if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x81400000L) != 0L) + if ((active0 & 0x80010000000000L) != 0L || (active1 & 0x2000030082000008L) != 0L || (active2 & 0x90000000010L) != 0L || (active3 & 0x201000000L) != 0L || (active4 & 0x1c00004002L) != 0L || (active5 & 0x300000L) != 0L || (active6 & 0x400000000L) != 0L || (active7 & 0x1020000000000800L) != 0L || (active8 & 0x1220000008000L) != 0L || (active9 & 0x1300410200608L) != 0L || (active10 & 0x8000878L) != 0L || (active11 & 0x102800000L) != 0L) return 78; - if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x1e001001c402L) != 0L || (active11 & 0x200000280010L) != 0L) + if ((active0 & 0x2000021001800000L) != 0L || (active1 & 0xdf0088e90c7023e0L) != 0L || (active2 & 0x18004000000f007L) != 0L || (active3 & 0x10000000000002L) != 0L || (active4 & 0x8000000200220004L) != 0L || (active5 & 0x3000000000070380L) != 0L || (active6 & 0x807003f000000L) != 0L || (active7 & 0x4040700780008000L) != 0L || (active8 & 0xfffe000580022001L) != 0L || (active9 & 0x7e000042001ff951L) != 0L || (active10 & 0x3c001001c402L) != 0L || (active11 & 0x400000500020L) != 0L) { if (jjmatchedPos != 10) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 10; } return 78; } return -1; case 11: - if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x1e0010014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x21001800000L) != 0L || (active1 & 0x450088e90c7003e0L) != 0L || (active2 & 0x18004000000f002L) != 0L || (active3 & 0x2L) != 0L || (active4 & 0x8000001200000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000080000000L) != 0L || (active9 & 0x7c0000420013e901L) != 0L || (active10 & 0x3c0010014472L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 11) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 11; } return 78; } - if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x80010L) != 0L) + if ((active0 & 0x2000000000000000L) != 0L || (active1 & 0x9a00000000002000L) != 0L || (active2 & 0x5L) != 0L || (active3 & 0x10000000000000L) != 0L || (active4 & 0x220000L) != 0L || (active5 & 0x2000000000040100L) != 0L || (active6 & 0x40000000000L) != 0L || (active7 & 0x40200000000000L) != 0L || (active8 & 0x500022001L) != 0L || (active9 & 0x2000000000c1050L) != 0L || (active10 & 0x8000L) != 0L || (active11 & 0x100020L) != 0L) return 78; return -1; case 12: - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x1e0000014472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x450008e90c7003e0L) != 0L || (active2 & 0x18000000000e003L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x1000000000030280L) != 0L || (active6 & 0x803003f000000L) != 0L || (active7 & 0x4000500780008000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5800004200036801L) != 0L || (active10 & 0x3c0000014472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 12; return 78; } @@ -22050,31 +22085,31 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, return 78; return -1; case 13: - if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x1e0000004472L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x4000000000200000L) != 0L || (active2 & 0x8000L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x10000L) != 0L || (active6 & 0x8000003000000L) != 0L || (active7 & 0x4000400000008000L) != 0L || (active9 & 0x800000000024000L) != 0L || (active10 & 0x10000L) != 0L) + return 78; + if ((active0 & 0x20001800000L) != 0L || (active1 & 0x50008e90c5003e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020280L) != 0L || (active6 & 0x3003c000000L) != 0L || (active7 & 0x100780000000L) != 0L || (active8 & 0xfffe000000000000L) != 0L || (active9 & 0x5000004200012801L) != 0L || (active10 & 0x3c0000004472L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 13; return 78; } - if ((active1 & 0x4000000000200000L) != 0L || (active2 & 0x8000L) != 0L || (active4 & 0x8000001000000004L) != 0L || (active5 & 0x10000L) != 0L || (active6 & 0x8000003000000L) != 0L || (active7 & 0x4000400000008000L) != 0L || (active9 & 0x800000000024000L) != 0L || (active10 & 0x10000L) != 0L) - return 78; return -1; case 14: if ((active0 & 0x20000000000L) != 0L || (active1 & 0x100084800000200L) != 0L || (active5 & 0x280L) != 0L || (active6 & 0x30000000000L) != 0L || (active7 & 0x100100000000L) != 0L || (active8 & 0x8000000000000000L) != 0L || (active9 & 0x5000004200010000L) != 0L || (active10 & 0x4402L) != 0L) return 78; - if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1800000L) != 0L || (active1 & 0x40000a10c5001e0L) != 0L || (active2 & 0x180000000006003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7ffe000000000000L) != 0L || (active9 & 0x2801L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 14; return 78; } return -1; case 15: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x40000a0001001c0L) != 0L || (active2 & 0x6003L) != 0L || (active5 & 0x1000000000020000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x680000000L) != 0L || (active8 & 0x7fe0000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 15) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 15; } return 78; @@ -22083,11 +22118,11 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, return 78; return -1; case 16: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x4000020080001c0L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0xf1c000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 16) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 16; } return 78; @@ -22098,9 +22133,9 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, case 17: if ((active1 & 0x2000000080L) != 0L || (active8 & 0x400000000000000L) != 0L) return 78; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x1e0000000070L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x2bdc000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x3c0000000070L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 17; return 78; } @@ -22108,20 +22143,20 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, case 18: if ((active8 & 0xb00000000000000L) != 0L || (active9 & 0x2800L) != 0L || (active10 & 0x10L) != 0L) return 78; - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000140L) != 0L || (active2 & 0x100000000006002L) != 0L || (active5 & 0x20000L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x280000000L) != 0L || (active8 & 0x20dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { if (jjmatchedPos != 18) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 18; } return 78; } return -1; case 19: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active0 & 0x1000000L) != 0L || (active1 & 0x400000008000040L) != 0L || (active2 & 0x100000000006002L) != 0L || (active6 & 0x3c000000L) != 0L || (active7 & 0x200000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 19; return 78; } @@ -22129,29 +22164,29 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, return 78; return -1; case 20: - if ((active0 & 0x1000000L) != 0L || (active1 & 0x8000040L) != 0L || (active2 & 0x100000000000000L) != 0L || (active7 & 0x200000000L) != 0L) - return 78; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x1e0000000060L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x6002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x3c0000000060L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 20; return 78; } + if ((active0 & 0x1000000L) != 0L || (active1 & 0x8000040L) != 0L || (active2 & 0x100000000000000L) != 0L || (active7 & 0x200000000L) != 0L) + return 78; return -1; case 21: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x3c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 21; return 78; } - if ((active2 & 0x2000L) != 0L || (active10 & 0xc0000000020L) != 0L) + if ((active2 & 0x2000L) != 0L || (active10 & 0x180000000020L) != 0L) return 78; return -1; case 22: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x120000000040L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22dc000000000000L) != 0L || (active10 & 0x240000000040L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 22; return 78; } @@ -22159,39 +22194,39 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, return 78; return -1; case 23: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x20000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x200000000040L) != 0L) + return 78; + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0x2c000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active10 & 0x40000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 23; return 78; } - if ((active8 & 0x4000000000000L) != 0L || (active10 & 0x100000000040L) != 0L) - return 78; return -1; case 24: - if ((active6 & 0x20000000L) != 0L || (active10 & 0x20000000000L) != 0L) - return 78; - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x200000200000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active6 & 0xc000000L) != 0L || (active8 & 0x22d8000000000000L) != 0L || (active11 & 0x400000400000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 24; return 78; } + if ((active6 & 0x20000000L) != 0L || (active10 & 0x40000000000L) != 0L) + return 78; return -1; case 25: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x4002L) != 0L || (active8 & 0x2c0000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 25; return 78; } - if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x200000L) != 0L) + if ((active6 & 0xc000000L) != 0L || (active8 & 0x2018000000000000L) != 0L || (active11 & 0x400000L) != 0L) return 78; return -1; case 26: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 26; return 78; } @@ -22199,45 +22234,45 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, return 78; return -1; case 27: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active8 & 0x200000000000000L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 27; return 78; } return -1; case 28: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active8 & 0x200000000000000L) != 0L) + return 78; + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 28; return 78; } - if ((active8 & 0x200000000000000L) != 0L) - return 78; return -1; case 29: - if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active1 & 0x400000000000000L) != 0L || (active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 29; return 78; } return -1; case 30: - if ((active1 & 0x400000000000000L) != 0L) - return 78; - if ((active2 & 0x2L) != 0L || (active11 & 0x200000000000L) != 0L) + if ((active2 & 0x2L) != 0L || (active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 30; return 78; } + if ((active1 & 0x400000000000000L) != 0L) + return 78; return -1; case 31: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 31; return 78; } @@ -22245,9 +22280,9 @@ private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1, return 78; return -1; case 32: - if ((active11 & 0x200000000000L) != 0L) + if ((active11 & 0x400000000000L) != 0L) { - jjmatchedKind = 820; + jjmatchedKind = 823; jjmatchedPos = 32; return 78; } @@ -22273,74 +22308,76 @@ private final int jjMoveStringLiteralDfa0_4() switch(curChar) { case 33: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000L); case 34: - return jjStartNfaWithStates_4(0, 798, 79); + return jjStartNfaWithStates_4(0, 799, 79); case 36: - return jjStartNfaWithStates_4(0, 801, 78); + return jjStartNfaWithStates_4(0, 804, 78); case 37: - return jjStopAtPos(0, 793); + return jjStopAtPos(0, 794); + case 38: + return jjStopAtPos(0, 802); case 39: - return jjStartNfaWithStates_4(0, 797, 58); + return jjStartNfaWithStates_4(0, 798, 58); case 40: - return jjStopAtPos(0, 766); - case 41: return jjStopAtPos(0, 767); + case 41: + return jjStopAtPos(0, 768); case 42: - jjmatchedKind = 791; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000000L); + jjmatchedKind = 792; + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000000L); case 43: - return jjStopAtPos(0, 788); + return jjStopAtPos(0, 789); case 44: - return jjStopAtPos(0, 778); + return jjStopAtPos(0, 779); case 45: - jjmatchedKind = 789; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000L); + jjmatchedKind = 790; + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000L); case 46: - jjmatchedKind = 777; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + jjmatchedKind = 778; + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L); case 47: - jjmatchedKind = 792; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x90000000000L); + jjmatchedKind = 793; + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x480000000000L); case 58: - jjmatchedKind = 783; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L); + jjmatchedKind = 784; + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000000L); case 59: - return jjStopAtPos(0, 776); + return jjStopAtPos(0, 777); case 60: - jjmatchedKind = 781; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x50000L); + jjmatchedKind = 782; + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000a0000L); case 61: - jjmatchedKind = 779; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); - case 62: jjmatchedKind = 780; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L); + case 62: + jjmatchedKind = 781; + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L); case 63: - return jjStopAtPos(0, 782); + return jjStopAtPos(0, 783); case 91: - return jjStopAtPos(0, 774); - case 93: return jjStopAtPos(0, 775); + case 93: + return jjStopAtPos(0, 776); case 94: - return jjStopAtPos(0, 800); + return jjStopAtPos(0, 801); case 65: case 97: jjmatchedKind = 3; - return jjMoveStringLiteralDfa1_4(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x110000180000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x3ffffffff0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x220000300000L, 0x0L); case 66: case 98: - return jjMoveStringLiteralDfa1_4(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x40000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0xfffc000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x80000L, 0x0L); case 67: case 99: jjmatchedKind = 52; - return jjMoveStringLiteralDfa1_4(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa000c00000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0xffe0000000000000L, 0xffffffffffffffffL, 0x3fL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x14001800000L, 0x0L); case 68: case 100: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x1ffffffffffffc0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000000L, 0x0L); case 69: case 101: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0xfe00000000000000L, 0x7ffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x20000000L, 0x0L); case 70: case 102: return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x1fffff80000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); @@ -22353,67 +22390,67 @@ private final int jjMoveStringLiteralDfa0_4() return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x1f80000000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 73: case 105: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xa0010000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0xe000000000000000L, 0x1fffffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x140020000L, 0x0L); case 74: case 106: return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0xffe0000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 75: case 107: jjmatchedKind = 296; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x800000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0xe0000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000000000L, 0x0L); case 76: case 108: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x100000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0xfffff00000000000L, 0x3L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); case 77: case 109: jjmatchedKind = 322; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x200000000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffff8L, 0x0L, 0x0L, 0x100000L, 0x0L, 0x0L, 0x400000000000L, 0x0L); case 78: case 110: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x200000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffff000000000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x400000000L, 0x0L); case 79: case 111: return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xf800000000000000L, 0x3fffffL, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L); case 80: case 112: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x440000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffc00000L, 0x0L, 0x0L, 0x0L, 0x0L, 0x880000000L, 0x0L); case 81: case 113: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x20000000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7L, 0x0L, 0x0L, 0x0L, 0x40000000000L, 0x0L); case 82: case 114: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x80000000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffffffffff8L, 0x0L, 0x0L, 0x0L, 0x100000000000L, 0x0L); case 83: case 115: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x45000000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xfff0000000000000L, 0xffffffffffefffffL, 0x3fffffffffffL, 0x0L, 0x8a000000000L, 0x0L); case 84: case 116: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x400000020000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xffffc00000000000L, 0x1ffffffL, 0x800000040000L, 0x0L); case 85: case 117: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3fffffe000000L, 0x0L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7fffffe000000L, 0x0L, 0x0L); case 86: case 118: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x3ffc000000000000L, 0x2000000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x7ff8000000000000L, 0x4000000L, 0x0L); case 87: case 119: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000000000000000L, 0xc200fffL, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000000000000L, 0x18401fffL, 0x0L); case 88: case 120: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x1000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x2000L, 0x0L); case 89: case 121: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x6000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0xc000L, 0x0L); case 90: case 122: - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000L, 0x0L); + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x10000L, 0x0L); case 123: - return jjStartNfaWithStates_4(0, 772, 77); + return jjStartNfaWithStates_4(0, 773, 77); case 124: - jjmatchedKind = 799; - return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x4000000L); + jjmatchedKind = 800; + return jjMoveStringLiteralDfa1_4(0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x8000000L); case 125: - return jjStopAtPos(0, 773); + return jjStopAtPos(0, 774); default : return jjMoveNfa_4(0, 0); } @@ -22428,55 +22465,59 @@ private final int jjMoveStringLiteralDfa1_4(long active0, long active1, long act switch(curChar) { case 42: - if ((active12 & 0x80000000000L) != 0L) + if ((active12 & 0x400000000000L) != 0L) { - jjmatchedKind = 811; + jjmatchedKind = 814; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x10000000000L); + return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0x80000000000L); case 46: - if ((active12 & 0x10000000L) != 0L) - return jjStopAtPos(1, 796); + if ((active12 & 0x20000000L) != 0L) + return jjStopAtPos(1, 797); break; case 47: - if ((active12 & 0x20000000000L) != 0L) - return jjStopAtPos(1, 809); + if ((active12 & 0x100000000000L) != 0L) + return jjStopAtPos(1, 812); break; case 58: - if ((active12 & 0x400000000L) != 0L) - return jjStopAtPos(1, 802); + if ((active12 & 0x2000000000L) != 0L) + return jjStopAtPos(1, 805); + break; + case 60: + if ((active12 & 0x800000000L) != 0L) + return jjStopAtPos(1, 803); break; case 61: - if ((active12 & 0x10000L) != 0L) - return jjStopAtPos(1, 784); - else if ((active12 & 0x20000L) != 0L) + if ((active12 & 0x20000L) != 0L) return jjStopAtPos(1, 785); - else if ((active12 & 0x80000L) != 0L) - return jjStopAtPos(1, 787); + else if ((active12 & 0x40000L) != 0L) + return jjStopAtPos(1, 786); + else if ((active12 & 0x100000L) != 0L) + return jjStopAtPos(1, 788); break; case 62: - if ((active12 & 0x40000L) != 0L) - return jjStopAtPos(1, 786); - else if ((active12 & 0x400000L) != 0L) - return jjStopAtPos(1, 790); - else if ((active12 & 0x8000000L) != 0L) - return jjStopAtPos(1, 795); + if ((active12 & 0x80000L) != 0L) + return jjStopAtPos(1, 787); + else if ((active12 & 0x800000L) != 0L) + return jjStopAtPos(1, 791); + else if ((active12 & 0x10000000L) != 0L) + return jjStopAtPos(1, 796); break; case 65: case 97: - return jjMoveStringLiteralDfa2_4(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0x7fc000000000000L, active11, 0x200443c40000L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0x3fe0000000000000L, active1, 0L, active2, 0x2000000000fffc0L, active3, 0x80000000080000L, active4, 0x7f00020000000L, active5, 0x1f000000ff8L, active6, 0x3fffc00000L, active7, 0x1f0000000000018L, active8, 0L, active9, 0x1c00000000000L, active10, 0xff8000000000000L, active11, 0x400887880000L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa2_4(active0, 0x70L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 67: case 99: - return jjMoveStringLiteralDfa2_4(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x1000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0x80L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x7000060000000000L, active6, 0L, active7, 0xfe00000000000000L, active8, 0x3L, active9, 0L, active10, 0L, active11, 0x2000000000L, active12, 0L); case 68: case 100: return jjMoveStringLiteralDfa2_4(active0, 0x700L, active1, 0L, active2, 0L, active3, 0x2000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 69: case 101: - return jjMoveStringLiteralDfa2_4(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xd800000002000000L, active11, 0x84000026001L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0xc0000fc000000000L, active1, 0x1L, active2, 0x7fffff00000L, active3, 0x3c0000100000L, active4, 0xf80e0000000000L, active5, 0x3800000ff000L, active6, 0x1fc000000000L, active7, 0x3fffffffe0L, active8, 0xffffcL, active9, 0x2000000000000L, active10, 0xb000000002000000L, active11, 0x10800004c003L, active12, 0L); case 70: case 102: if ((active5 & 0x8000000000000000L) != 0L) @@ -22484,18 +22525,18 @@ else if ((active12 & 0x8000000L) != 0L) jjmatchedKind = 383; jjmatchedPos = 1; } - else if ((active11 & 0x10000L) != 0L) - return jjStartNfaWithStates_4(1, 720, 78); - return jjMoveStringLiteralDfa2_4(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000L, active12, 0L); + else if ((active11 & 0x20000L) != 0L) + return jjStartNfaWithStates_4(1, 721, 78); + return jjMoveStringLiteralDfa2_4(active0, 0x800L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x1L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); case 71: case 103: return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x4000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 72: case 104: - return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0xeL, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0xffeL, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x200000L, active9, 0xc000000000000L, active10, 0L, active11, 0x1cL, active12, 0L); case 73: case 105: - return jjMoveStringLiteralDfa2_4(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x2000000000000000L, active11, 0x8000001f0L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0x700000000000L, active1, 0L, active2, 0xf80000000000L, active3, 0x100000001e00000L, active4, 0xf00000000000000L, active5, 0x7f00000L, active6, 0x200000000000L, active7, 0x4000000000L, active8, 0x1d00000L, active9, 0xfff0000000000000L, active10, 0x4000000000000000L, active11, 0x10000003e0L, active12, 0L); case 75: case 107: return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -22504,7 +22545,7 @@ else if ((active11 & 0x10000L) != 0L) return jjMoveStringLiteralDfa2_4(active0, 0x80000001f000L, active1, 0xf000L, active2, 0xc00000000000000L, active3, 0x8000400006000000L, active4, 0L, active5, 0L, active6, 0x1c00000000002L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); case 77: case 109: - return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x1000L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0L, active2, 0x1000000000000000L, active3, 0L, active4, 0xfL, active5, 0L, active6, 0x4L, active7, 0L, active8, 0x4000000L, active9, 0L, active10, 0L, active11, 0x2000L, active12, 0L); case 78: case 110: if ((active4 & 0x10L) != 0L) @@ -22519,7 +22560,7 @@ else if ((active6 & 0x8L) != 0L) jjmatchedKind = 387; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_4(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0xffc000000L, active11, 0x1000b0000000L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0x60000L, active1, 0L, active2, 0xe000000000000000L, active3, 0x3L, active4, 0x1ffffe0L, active5, 0L, active6, 0x30L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1ffc000000L, active11, 0x200160000000L, active12, 0L); case 79: case 111: if ((active3 & 0x800000000000L) != 0L) @@ -22537,10 +22578,10 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 640; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_4(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x40a300008200L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0x3000000000000L, active1, 0x7ffffffff0000L, active2, 0x1f000000000000L, active3, 0x1e010001f8000000L, active4, 0xe000000040000000L, active5, 0x78003f8000003L, active6, 0x1e000000000000L, active7, 0x7ff0000000000L, active8, 0x18000000L, active9, 0L, active10, 0x2L, active11, 0x814600010400L, active12, 0L); case 80: case 112: - return jjMoveStringLiteralDfa2_4(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0x7000000000L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0x80000L, active1, 0L, active2, 0L, active3, 0x4L, active4, 0L, active5, 0L, active6, 0x1c0L, active7, 0L, active8, 0x1e0000000L, active9, 0L, active10, 0xe000000000L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x8L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xfffffffe00000000L, active9, 0x7fffffL, active10, 0L, active11, 0L, active12, 0L); @@ -22551,7 +22592,7 @@ else if ((active10 & 0x1L) != 0L) jjmatchedKind = 393; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_4(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0xc200c00L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0x4000001f00000L, active1, 0x18000000000000L, active2, 0x20000000000000L, active3, 0x7e003e00000010L, active4, 0L, active5, 0L, active6, 0x7fe0000000003c00L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3ffffcL, active11, 0x18401800L, active12, 0L); case 83: case 115: if ((active0 & 0x2000000L) != 0L) @@ -22564,7 +22605,7 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 281; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_4(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3f8000000000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0xfc000000L, active1, 0L, active2, 0L, active3, 0x20L, active4, 0xff9c000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x7f0000000000L, active11, 0x20000000000L, active12, 0L); case 84: case 116: if ((active0 & 0x100000000L) != 0L) @@ -22572,10 +22613,10 @@ else if ((active4 & 0x2000000L) != 0L) jjmatchedKind = 32; jjmatchedPos = 1; } - return jjMoveStringLiteralDfa2_4(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x1c00000000000L, active11, 0x40000100000L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0xe00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x18000000000000L, active6, 0x4000L, active7, 0L, active8, 0L, active9, 0x1ff800000L, active10, 0x3800000000000L, active11, 0x80000200000L, active12, 0L); case 85: case 117: - return jjMoveStringLiteralDfa2_4(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x2000000c00000L, active11, 0x20000000000L, active12, 0L); + return jjMoveStringLiteralDfa2_4(active0, 0x1000000000L, active1, 0xffe0000000000000L, active2, 0x1fL, active3, 0x1c000000000L, active4, 0L, active5, 0x7e0000c00000000L, active6, 0x8000000000038000L, active7, 0x8000000000007L, active8, 0L, active9, 0x3fe00000000L, active10, 0x4000000c00000L, active11, 0x40000000000L, active12, 0L); case 86: case 118: return jjMoveStringLiteralDfa2_4(active0, 0x2000000000L, active1, 0L, active2, 0L, active3, 0x40L, active4, 0L, active5, 0L, active6, 0x3c0000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -22588,8 +22629,8 @@ else if ((active4 & 0x2000000L) != 0L) return jjStartNfaWithStates_4(1, 51, 78); return jjMoveStringLiteralDfa2_4(active0, 0L, active1, 0L, active2, 0x1c0000000000020L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x3c0000000000L, active10, 0x1000000L, active11, 0L, active12, 0L); case 124: - if ((active12 & 0x4000000L) != 0L) - return jjStopAtPos(1, 794); + if ((active12 & 0x8000000L) != 0L) + return jjStopAtPos(1, 795); break; default : break; @@ -22608,14 +22649,14 @@ private final int jjMoveStringLiteralDfa2_4(long old0, long active0, long old1, switch(curChar) { case 43: - if ((active12 & 0x10000000000L) != 0L) - return jjStopAtPos(2, 808); + if ((active12 & 0x80000000000L) != 0L) + return jjStopAtPos(2, 811); break; case 65: case 97: if ((active0 & 0x100L) != 0L) return jjStartNfaWithStates_4(2, 8, 78); - return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x8000000ffcL, active11, 0x14100c006400L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0x137feL, active2, 0x80000100000L, active3, 0x6000600000000L, active4, 0x18000000000000L, active5, 0x3000L, active6, 0xc00000000000L, active7, 0x6000000000000e7L, active8, 0x24000004L, active9, 0x7800000L, active10, 0x10000000ffcL, active11, 0x28201800c800L, active12, 0L); case 66: case 98: return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0x20000000020000L, active2, 0L, active3, 0L, active4, 0x100100000000000L, active5, 0L, active6, 0x8000000000000000L, active7, 0L, active8, 0L, active9, 0x1c07e00000000L, active10, 0x4000000L, active11, 0L, active12, 0L); @@ -22628,7 +22669,7 @@ else if ((active2 & 0x200000L) != 0L) jjmatchedKind = 149; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x10c40000L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0x2200000001c00020L, active3, 0x7a0L, active4, 0xe0000000000000e0L, active5, 0x1000000000100001L, active6, 0L, active7, 0x100L, active8, 0x78L, active9, 0x8000000000L, active10, 0x18000000L, active11, 0x21880000L, active12, 0L); case 68: case 100: if ((active0 & 0x200L) != 0L) @@ -22649,14 +22690,14 @@ else if ((active6 & 0x2L) != 0L) return jjStartNfaWithStates_4(2, 385, 78); else if ((active6 & 0x400000L) != 0L) return jjStartNfaWithStates_4(2, 406, 78); - return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x4000001020000000L, active11, 0x20000010L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0x3L, active4, 0x100L, active5, 0x30000000L, active6, 0x3c00L, active7, 0L, active8, 0L, active9, 0x18000000L, active10, 0x8000002020000000L, active11, 0x40000020L, active12, 0L); case 69: case 101: if ((active0 & 0x100000L) != 0L) return jjStartNfaWithStates_4(2, 20, 78); else if ((active6 & 0x10L) != 0L) return jjStartNfaWithStates_4(2, 388, 78); - return jjMoveStringLiteralDfa3_4(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0xa0001f0000401000L, active11, 0x2000000000fL, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x4000010000000L, active1, 0x8000000000800L, active2, 0x400000000000000L, active3, 0x2100000800001840L, active4, 0L, active5, 0L, active6, 0x7e00000003c0040L, active7, 0L, active8, 0x1c0000080L, active9, 0x14000000000000L, active10, 0x40003e0000401000L, active11, 0x4000000001fL, active12, 0L); case 70: case 102: if ((active7 & 0x200L) != 0L) @@ -22664,14 +22705,14 @@ else if ((active6 & 0x10L) != 0L) jjmatchedKind = 457; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_4(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x1c00000000000L, active11, 0x80000080000L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x4000000000L, active1, 0L, active2, 0xfe000000L, active3, 0L, active4, 0x20000000000000L, active5, 0L, active6, 0x1L, active7, 0x70000000000c00L, active8, 0L, active9, 0L, active10, 0x3800000000000L, active11, 0x100000100000L, active12, 0L); case 71: case 103: if ((active0 & 0x2000000000L) != 0L) return jjStartNfaWithStates_4(2, 37, 78); else if ((active4 & 0x200000000000L) != 0L) return jjStartNfaWithStates_4(2, 301, 78); - return jjMoveStringLiteralDfa3_4(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x138000000000L, active1, 0L, active2, 0x100000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40001ff000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000L, active12, 0L); case 72: case 104: return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x8020000000000L, active6, 0x4000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -22679,7 +22720,7 @@ else if ((active4 & 0x200000000000L) != 0L) case 105: if ((active6 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_4(2, 432, 78); - return jjMoveStringLiteralDfa3_4(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x22000c007e000L, active11, 0x200800L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0xc000000000000000L, active1, 0L, active2, 0L, active3, 0x8000001000002000L, active4, 0x40000600L, active5, 0x10000000000000L, active6, 0x3800000000000004L, active7, 0x8000000000L, active8, 0x2000000L, active9, 0L, active10, 0x44000c007e000L, active11, 0x401000L, active12, 0L); case 74: case 106: return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x800000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -22698,14 +22739,14 @@ else if ((active8 & 0x200000000L) != 0L) jjmatchedKind = 545; jjmatchedPos = 2; } - else if ((active11 & 0x1000L) != 0L) - return jjStartNfaWithStates_4(2, 716, 78); - return jjMoveStringLiteralDfa3_4(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x1c000000000000L, active11, 0xa82000000L, active12, 0L); + else if ((active11 & 0x2000L) != 0L) + return jjStartNfaWithStates_4(2, 717, 78); + return jjMoveStringLiteralDfa3_4(active0, 0x60000000006000L, active1, 0x3fc0000L, active2, 0x200000000L, active3, 0x200004008280000L, active4, 0L, active5, 0x1e0040400600000L, active6, 0x20L, active7, 0x70000600000L, active8, 0xfffffffc00000300L, active9, 0x3fffffL, active10, 0x38000000000000L, active11, 0x1504000000L, active12, 0L); case 77: case 109: if ((active9 & 0x10000000000L) != 0L) return jjStartNfaWithStates_4(2, 616, 78); - return jjMoveStringLiteralDfa3_4(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x8000020000L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x400L, active1, 0x4000003c000000L, active2, 0x1000000000000L, active3, 0L, active4, 0x800000000000003L, active5, 0x600003800004000L, active6, 0L, active7, 0L, active8, 0x8c00000L, active9, 0x7fe2040000000000L, active10, 0x800000L, active11, 0x10000040000L, active12, 0L); case 78: case 110: if ((active5 & 0x800000L) != 0L) @@ -22713,10 +22754,10 @@ else if ((active11 & 0x1000L) != 0L) jjmatchedKind = 343; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_4(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x2000008020L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x200000000000L, active1, 0x3fffc0000001L, active2, 0x1c0000400000000L, active3, 0x40000c8000400000L, active4, 0x40400000000800L, active5, 0x8041c7000000L, active6, 0L, active7, 0x8000000000018L, active8, 0x100400L, active9, 0x8000020000000000L, active10, 0xc00000000L, active11, 0x4000010040L, active12, 0L); case 79: case 111: - return jjMoveStringLiteralDfa3_4(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x100000L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x1800204000000L, active1, 0x1000000000c000L, active2, 0x20000000000000L, active3, 0x78502006000004L, active4, 0xff9c001000L, active5, 0L, active6, 0x4000000000000000L, active7, 0xe000000000000000L, active8, 0x200001L, active9, 0L, active10, 0L, active11, 0x200000L, active12, 0L); case 80: case 112: if ((active3 & 0x4000L) != 0L) @@ -22728,7 +22769,7 @@ else if ((active3 & 0x400000000000000L) != 0L) return jjStartNfaWithStates_4(2, 250, 78); else if ((active5 & 0x8L) != 0L) return jjStartNfaWithStates_4(2, 323, 78); - return jjMoveStringLiteralDfa3_4(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x2201000002L, active11, 0L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x80000L, active1, 0L, active2, 0x1000000800000000L, active3, 0x8000L, active4, 0x200cL, active5, 0L, active6, 0L, active7, 0x1800000L, active8, 0x800L, active9, 0L, active10, 0x4201000002L, active11, 0L, active12, 0L); case 81: case 113: return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -22744,7 +22785,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 422; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_4(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x1fe0000000000000L, active11, 0x4040000200L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x80040001e00000L, active1, 0xff80c00000000000L, active2, 0x300000001fL, active3, 0xe1800010L, active4, 0x800000000000L, active5, 0x3000200008000L, active6, 0x21f80ff800000L, active7, 0L, active8, 0xe002L, active9, 0xe0400000L, active10, 0x3fc0000000000000L, active11, 0x8080000400L, active12, 0L); case 83: case 115: if ((active0 & 0x10L) != 0L) @@ -22752,7 +22793,7 @@ else if ((active6 & 0x4000000000L) != 0L) jjmatchedKind = 4; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_4(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x4002000000L, active11, 0x400000000L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0xf00000060000060L, active1, 0L, active2, 0x800f3c000000000L, active3, 0x10000000000L, active4, 0x300000003c000L, active5, 0x80000070000L, active6, 0xc000f00000000L, active7, 0x3e000000L, active8, 0x30000L, active9, 0x380000000000L, active10, 0x9002000000L, active11, 0x800000000L, active12, 0L); case 84: case 116: if ((active0 & 0x400000000000L) != 0L) @@ -22778,7 +22819,7 @@ else if ((active8 & 0x40000L) != 0L) jjmatchedKind = 530; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_4(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x4000010001c0L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x3002081c00008880L, active1, 0L, active2, 0x4000000ffc0L, active3, 0x1000000170000L, active4, 0x4000000f80000L, active5, 0x60000180000803f0L, active6, 0x3000030180L, active7, 0x80001fc0000000L, active8, 0x80000L, active9, 0L, active10, 0L, active11, 0x800002000380L, active12, 0L); case 85: case 117: return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0x1000000000000L, active2, 0x4000000000000L, active3, 0x1800000100000008L, active4, 0L, active5, 0L, active6, 0L, active7, 0x780000000000L, active8, 0x10000000L, active9, 0x8000000000000L, active10, 0x180000L, active11, 0L, active12, 0L); @@ -22804,7 +22845,7 @@ else if ((active7 & 0x800000000000L) != 0L) jjmatchedKind = 330; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x200000000800L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L, active12, 0L); case 89: case 121: if ((active0 & 0x40000L) != 0L) @@ -22821,7 +22862,7 @@ else if ((active4 & 0x20000000000L) != 0L) jjmatchedKind = 297; jjmatchedPos = 2; } - return jjMoveStringLiteralDfa3_4(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x10000000000L, active12, 0L); + return jjMoveStringLiteralDfa3_4(active0, 0x80000000L, active1, 0L, active2, 0xe0000L, active3, 0L, active4, 0xc0000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100000000L, active10, 0x200000L, active11, 0x20000000000L, active12, 0L); case 90: case 122: return jjMoveStringLiteralDfa3_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000L, active9, 0L, active10, 0L, active11, 0L, active12, 0L); @@ -22844,15 +22885,15 @@ private final int jjMoveStringLiteralDfa3_4(long old0, long active0, long old1, case 45: return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0x8000000000000000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 49: - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x800000000000L, active11, 0L); - case 51: return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1000000000000L, active11, 0L); + case 51: + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000000000L, active11, 0L); case 56: - if ((active10 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_4(3, 686, 78); + if ((active10 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_4(3, 687, 78); break; case 95: - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0x60000000200002L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x3L, active4, 0xc0000000000L, active5, 0x8000000000000L, active6, 0L, active7, 0x3000000000000L, active8, 0xffffffe000000000L, active9, 0x3fffffL, active10, 0xc0000000200002L, active11, 0x400000000000L); case 65: case 97: if ((active2 & 0x40L) != 0L) @@ -22862,14 +22903,14 @@ private final int jjMoveStringLiteralDfa3_4(long old0, long active0, long old1, } else if ((active4 & 0x20000000L) != 0L) return jjStartNfaWithStates_4(3, 285, 78); - return jjMoveStringLiteralDfa4_4(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x1400001000L, active11, 0x400041000000L); + return jjMoveStringLiteralDfa4_4(active0, 0x3004200001e10000L, active1, 0xe000000000000L, active2, 0x1c1100006400080L, active3, 0x2400028L, active4, 0xe000000000000000L, active5, 0x20000000001L, active6, 0x3f800000L, active7, 0x200000L, active8, 0x800L, active9, 0L, active10, 0x2400001000L, active11, 0x800082000000L); case 66: case 98: if ((active0 & 0x800000000000L) != 0L) return jjStartNfaWithStates_4(3, 47, 78); else if ((active1 & 0x4000L) != 0L) return jjStartNfaWithStates_4(3, 78, 78); - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000800000L, active11, 0L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0x4000000000000L, active3, 0x400000000000L, active4, 0L, active5, 0x200000000004000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000800000L, active11, 0L); case 67: case 99: if ((active2 & 0x4000000000L) != 0L) @@ -22882,7 +22923,7 @@ else if ((active3 & 0x800L) != 0L) jjmatchedKind = 203; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_4(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x100000002000000L, active11, 0L); + return jjMoveStringLiteralDfa4_4(active0, 0x300000000000000L, active1, 0x800L, active2, 0x238000000000L, active3, 0x8200101004L, active4, 0L, active5, 0x3f0L, active6, 0x40e0478100000000L, active7, 0L, active8, 0x1e0000000L, active9, 0x8200000000L, active10, 0x200000002000000L, active11, 0L); case 68: case 100: if ((active3 & 0x200000000000000L) != 0L) @@ -22897,9 +22938,9 @@ else if ((active7 & 0x20L) != 0L) jjmatchedKind = 453; jjmatchedPos = 3; } - else if ((active10 & 0x2000000000000L) != 0L) - return jjStartNfaWithStates_4(3, 689, 78); - return jjMoveStringLiteralDfa4_4(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x20L); + else if ((active10 & 0x4000000000000L) != 0L) + return jjStartNfaWithStates_4(3, 690, 78); + return jjMoveStringLiteralDfa4_4(active0, 0x80000000000000L, active1, 0x1c0000000L, active2, 0L, active3, 0x1000000000L, active4, 0x10000004000000L, active5, 0x40000000L, active6, 0L, active7, 0x40L, active8, 0L, active9, 0x20018000000L, active10, 0L, active11, 0x40L); case 69: case 101: if ((active0 & 0x400000000000000L) != 0L) @@ -22944,9 +22985,9 @@ else if ((active10 & 0x80000L) != 0L) return jjStartNfaWithStates_4(3, 659, 78); else if ((active10 & 0x1000000L) != 0L) return jjStartNfaWithStates_4(3, 664, 78); - else if ((active11 & 0x8000L) != 0L) - return jjStartNfaWithStates_4(3, 719, 78); - return jjMoveStringLiteralDfa4_4(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0x6820000000L, active11, 0x20000000L); + else if ((active11 & 0x10000L) != 0L) + return jjStartNfaWithStates_4(3, 720, 78); + return jjMoveStringLiteralDfa4_4(active0, 0x20008820L, active1, 0x40000000000000L, active2, 0x4121800fe00L, active3, 0xc0040030180L, active4, 0x48410000078c803L, active5, 0x6c00002000000002L, active6, 0x10000000014c00L, active7, 0x1970000002c00c00L, active8, 0x400000100L, active9, 0x7fc0000020000000L, active10, 0xc820000000L, active11, 0x40000000L); case 70: case 102: if ((active0 & 0x4000000L) != 0L) @@ -22956,7 +22997,7 @@ else if ((active8 & 0x200L) != 0L) break; case 71: case 103: - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x800001e000L, active11, 0x100000000L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0x80000000000L, active3, 0L, active4, 0x40c00000000000L, active5, 0x8000L, active6, 0L, active7, 0x8L, active8, 0L, active9, 0L, active10, 0x1000001e000L, active11, 0x200000000L); case 72: case 104: if ((active0 & 0x2000000000000L) != 0L) @@ -22965,29 +23006,29 @@ else if ((active2 & 0x200000000000000L) != 0L) return jjStartNfaWithStates_4(3, 185, 78); else if ((active6 & 0x1000000000L) != 0L) return jjStartNfaWithStates_4(3, 420, 78); - else if ((active11 & 0x40L) != 0L) + else if ((active11 & 0x80L) != 0L) { - jjmatchedKind = 710; + jjmatchedKind = 711; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_4(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0xc00180L); + return jjMoveStringLiteralDfa4_4(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x80000L, active6, 0L, active7, 0x4000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x1800300L); case 73: case 105: - return jjMoveStringLiteralDfa4_4(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x200000200000004L, active11, 0x80080000L); + return jjMoveStringLiteralDfa4_4(active0, 0x138040000480L, active1, 0x2L, active2, 0x20e0800000L, active3, 0x80010000000000L, active4, 0x800000000000100L, active5, 0x8010000000L, active6, 0xc080000003180L, active7, 0L, active8, 0x402000L, active9, 0x40000000L, active10, 0x400001200000004L, active11, 0x100100000L); case 75: case 107: if ((active7 & 0x10L) != 0L) return jjStartNfaWithStates_4(3, 452, 78); else if ((active8 & 0x80L) != 0L) return jjStartNfaWithStates_4(3, 519, 78); - else if ((active10 & 0x8000000000000000L) != 0L) + else if ((active11 & 0x1L) != 0L) { - jjmatchedKind = 703; + jjmatchedKind = 704; jjmatchedPos = 3; } - else if ((active11 & 0x200L) != 0L) - return jjStartNfaWithStates_4(3, 713, 78); - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x40001L); + else if ((active11 & 0x400L) != 0L) + return jjStartNfaWithStates_4(3, 714, 78); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x8000000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80002L); case 76: case 108: if ((active0 & 0x20000000000000L) != 0L) @@ -23009,9 +23050,9 @@ else if ((active5 & 0x20000000000000L) != 0L) } else if ((active7 & 0x80L) != 0L) return jjStartNfaWithStates_4(3, 455, 78); - else if ((active11 & 0x800000000L) != 0L) - return jjStartNfaWithStates_4(3, 739, 78); - return jjMoveStringLiteralDfa4_4(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x100000000000L); + else if ((active11 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_4(3, 740, 78); + return jjMoveStringLiteralDfa4_4(active0, 0x8041000000080000L, active1, 0xfd0000L, active2, 0x1100020L, active3, 0x8008600L, active4, 0x10000064L, active5, 0x1d0000000600000L, active6, 0x8000000000000000L, active7, 0x600060001000001L, active8, 0x4000000L, active9, 0x1c00100000000L, active10, 0L, active11, 0x200000000000L); case 77: case 109: if ((active3 & 0x2000000000L) != 0L) @@ -23021,7 +23062,7 @@ else if ((active10 & 0x20000L) != 0L) jjmatchedKind = 657; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_4(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x100000L); + return jjMoveStringLiteralDfa4_4(active0, 0x280000000L, active1, 0x3c000000L, active2, 0x400000000000000L, active3, 0x100420000000L, active4, 0L, active5, 0x3000000000000L, active6, 0x800100000000000L, active7, 0L, active8, 0L, active9, 0x40400000000L, active10, 0x40000L, active11, 0x200000L); case 78: case 110: if ((active4 & 0x40000000L) != 0L) @@ -23037,28 +23078,28 @@ else if ((active6 & 0x800000000000L) != 0L) return jjStartNfaWithStates_4(3, 431, 78); else if ((active9 & 0x4000000000000L) != 0L) return jjStartNfaWithStates_4(3, 626, 78); - else if ((active11 & 0x2L) != 0L) + else if ((active11 & 0x4L) != 0L) { - jjmatchedKind = 705; + jjmatchedKind = 706; jjmatchedPos = 3; } - else if ((active11 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_4(3, 740, 78); - return jjMoveStringLiteralDfa4_4(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x4000200100100ff8L, active11, 0x10000000004L); + else if ((active11 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_4(3, 741, 78); + return jjMoveStringLiteralDfa4_4(active0, 0x40010000000L, active1, 0x1000e00000000L, active2, 0L, active3, 0x2006000100000000L, active4, 0xff00000000L, active5, 0L, active6, 0L, active7, 0x8000000000000L, active8, 0L, active9, 0L, active10, 0x8000400100100ff8L, active11, 0x20000000008L); case 79: case 111: if ((active3 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_4(3, 240, 78); else if ((active4 & 0x800000L) != 0L) return jjStartNfaWithStates_4(3, 279, 78); - return jjMoveStringLiteralDfa4_4(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x200000000L); + return jjMoveStringLiteralDfa4_4(active0, 0x4000006040L, active1, 0x20000L, active2, 0x2000000000060000L, active3, 0x4000000004000010L, active4, 0x1000008L, active5, 0x44000000000L, active6, 0x1000200000000000L, active7, 0x2000000000L, active8, 0x1aL, active9, 0L, active10, 0x5c000000L, active11, 0x400000000L); case 80: case 112: if ((active2 & 0x20000000000000L) != 0L) return jjStartNfaWithStates_4(3, 181, 78); else if ((active8 & 0x2000000L) != 0L) return jjStartNfaWithStates_4(3, 537, 78); - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x800c020400L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0x400000000000L, active3, 0L, active4, 0L, active5, 0x800000000L, active6, 0x100000000020000L, active7, 0xe000000004000000L, active8, 0x800001L, active9, 0x2000000000000L, active10, 0L, active11, 0x10018040800L); case 81: case 113: return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000L, active11, 0L); @@ -23084,17 +23125,17 @@ else if ((active6 & 0x40000L) != 0L) jjmatchedKind = 402; jjmatchedPos = 3; } - else if ((active10 & 0x10000000000L) != 0L) + else if ((active10 & 0x20000000000L) != 0L) { - jjmatchedKind = 680; + jjmatchedKind = 681; jjmatchedPos = 3; } - else if ((active11 & 0x2000L) != 0L) + else if ((active11 & 0x4000L) != 0L) { - jjmatchedKind = 717; + jjmatchedKind = 718; jjmatchedPos = 3; } - return jjMoveStringLiteralDfa4_4(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x1e0000000000L, active11, 0xa0010004008L); + return jjMoveStringLiteralDfa4_4(active0, 0xc00000000L, active1, 0xff808000000007f8L, active2, 0x100000007L, active3, 0x1100000000040040L, active4, 0x100000000000080L, active5, 0x100000L, active6, 0x380000L, active7, 0x1ff006L, active8, 0x10000004L, active9, 0x8000000800000L, active10, 0x3c0000000000L, active11, 0x140020008010L); case 83: case 115: if ((active2 & 0x80000L) != 0L) @@ -23105,7 +23146,7 @@ else if ((active8 & 0x80000L) != 0L) return jjStartNfaWithStates_4(3, 531, 78); else if ((active9 & 0x10000000000000L) != 0L) return jjStartNfaWithStates_4(3, 628, 78); - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x1800000000400000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0x1003f00000b000L, active2, 0x400000018L, active3, 0x1882000L, active4, 0L, active5, 0x73000L, active6, 0x200000600000001L, active7, 0L, active8, 0x800030400L, active9, 0x7800000000L, active10, 0x3000000000400000L, active11, 0x800000000L); case 84: case 116: if ((active0 & 0x800000000000000L) != 0L) @@ -23125,27 +23166,27 @@ else if ((active6 & 0x800000000L) != 0L) return jjStartNfaWithStates_4(3, 419, 78); else if ((active9 & 0x400000L) != 0L) return jjStartNfaWithStates_4(3, 598, 78); - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x42000200810L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0x1c0000000001L, active2, 0x1000800800000000L, active3, 0x80200000L, active4, 0x2000000030600L, active5, 0x80580000000L, active6, 0x20020c0000000L, active7, 0x780018000000L, active8, 0x20L, active9, 0x380007000000L, active10, 0L, active11, 0x84000401020L); case 85: case 117: - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x1c000000000000L, active11, 0x2000000L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0x3000000L, active2, 0L, active3, 0x78000000000000L, active4, 0x3000L, active5, 0x1000010023000000L, active6, 0L, active7, 0x80001fe0000100L, active8, 0x101040L, active9, 0x80000000L, active10, 0x38000000000000L, active11, 0x4000000L); case 86: case 118: if ((active6 & 0x400000000000000L) != 0L) return jjStartNfaWithStates_4(3, 442, 78); - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x4000000000L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0x200000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0xc000L, active9, 0L, active10, 0L, active11, 0x8000000000L); case 87: case 119: if ((active8 & 0x200000L) != 0L) return jjStartNfaWithStates_4(3, 533, 78); - else if ((active10 & 0x2000000000000000L) != 0L) - return jjStartNfaWithStates_4(3, 701, 78); + else if ((active10 & 0x4000000000000000L) != 0L) + return jjStartNfaWithStates_4(3, 702, 78); return jjMoveStringLiteralDfa4_4(active0, 0x80000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: if ((active6 & 0x20L) != 0L) return jjStartNfaWithStates_4(3, 389, 78); - return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x400000000000000L, active11, 0L); + return jjMoveStringLiteralDfa4_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x8000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000000000000L, active10, 0x800000000000000L, active11, 0L); default : break; } @@ -23163,18 +23204,18 @@ private final int jjMoveStringLiteralDfa4_4(long old0, long active0, long old1, switch(curChar) { case 50: - if ((active10 & 0x1000000000000L) != 0L) - return jjStartNfaWithStates_4(4, 688, 78); + if ((active10 & 0x2000000000000L) != 0L) + return jjStartNfaWithStates_4(4, 689, 78); break; case 54: - if ((active10 & 0x800000000000L) != 0L) - return jjStartNfaWithStates_4(4, 687, 78); + if ((active10 & 0x1000000000000L) != 0L) + return jjStartNfaWithStates_4(4, 688, 78); break; case 95: - return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x1e0000040000L, active11, 0xd000000L); + return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0x40000000000008L, active2, 0x600L, active3, 0x200000000L, active4, 0x40200ff00000000L, active5, 0L, active6, 0L, active7, 0x700000001ff000L, active8, 0L, active9, 0xc0000000000000L, active10, 0x3c0000040000L, active11, 0x1a000000L); case 65: case 97: - return jjMoveStringLiteralDfa5_4(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x200000002000000L, active11, 0L); + return jjMoveStringLiteralDfa5_4(active0, 0x300000000000000L, active1, 0xc000c7c07f0L, active2, 0x400001000000L, active3, 0x100401020048000L, active4, 0x100000010030000L, active5, 0x43000044070800L, active6, 0x900000100000000L, active7, 0x200000009c00000L, active8, 0x1000002000L, active9, 0x20020000000L, active10, 0x400000002000000L, active11, 0L); case 66: case 98: if ((active5 & 0x40000000000L) != 0L) @@ -23182,9 +23223,9 @@ private final int jjMoveStringLiteralDfa4_4(long old0, long active0, long old1, return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0x80L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000L, active8, 0x3e000000000L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - if ((active11 & 0x10000000000L) != 0L) - return jjStartNfaWithStates_4(4, 744, 78); - return jjMoveStringLiteralDfa5_4(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x200000000000L); + if ((active11 & 0x20000000000L) != 0L) + return jjStartNfaWithStates_4(4, 745, 78); + return jjMoveStringLiteralDfa5_4(active0, 0x2000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x100L, active5, 0x800000000000000L, active6, 0L, active7, 0x1000000000000L, active8, 0xc0010000104L, active9, 0x80000000L, active10, 0x300000L, active11, 0x400000000000L); case 68: case 100: if ((active3 & 0x100000000L) != 0L) @@ -23231,21 +23272,21 @@ else if ((active9 & 0x400000000000L) != 0L) jjmatchedKind = 622; jjmatchedPos = 4; } - else if ((active10 & 0x8000000000L) != 0L) - return jjStartNfaWithStates_4(4, 679, 78); - else if ((active10 & 0x4000000000000L) != 0L) + else if ((active10 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_4(4, 680, 78); + else if ((active10 & 0x8000000000000L) != 0L) { - jjmatchedKind = 690; + jjmatchedKind = 691; jjmatchedPos = 4; } - else if ((active11 & 0x8L) != 0L) - return jjStartNfaWithStates_4(4, 707, 78); - else if ((active11 & 0x800L) != 0L) + else if ((active11 & 0x10L) != 0L) + return jjStartNfaWithStates_4(4, 708, 78); + else if ((active11 & 0x1000L) != 0L) { - jjmatchedKind = 715; + jjmatchedKind = 716; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_4(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x4018000000000000L, active11, 0x80002e00004L); + return jjMoveStringLiteralDfa5_4(active0, 0x41080000000000L, active1, 0xff80a00e00810000L, active2, 0x8400000500000007L, active3, 0x100400200000L, active4, 0x8000084L, active5, 0x200000000404000L, active6, 0x426007a000000001L, active7, 0xc000000004000000L, active8, 0xd001L, active9, 0x1bc881a000000L, active10, 0x8030000000000000L, active11, 0x100005c00008L); case 70: case 102: if ((active2 & 0x1000000000L) != 0L) @@ -23253,9 +23294,9 @@ else if ((active11 & 0x800L) != 0L) return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0x60000L, active3, 0x1L, active4, 0L, active5, 0x10000000L, active6, 0L, active7, 0L, active8, 0x800000000000L, active9, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_4(4, 685, 78); - return jjMoveStringLiteralDfa5_4(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e000L, active11, 0x200000000L); + if ((active10 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_4(4, 686, 78); + return jjMoveStringLiteralDfa5_4(active0, 0x40000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x80000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100001e000L, active11, 0x400000000L); case 72: case 104: if ((active2 & 0x800000000L) != 0L) @@ -23274,10 +23315,10 @@ else if ((active5 & 0x80000000L) != 0L) jjmatchedKind = 351; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000000L, active11, 0x10L); + return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000003e0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000000L, active11, 0x20L); case 73: case 105: - return jjMoveStringLiteralDfa5_4(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x1c80000000000000L, active11, 0x46100100080L); + return jjMoveStringLiteralDfa5_4(active0, 0x8080000e00000000L, active1, 0x1001f0000000L, active2, 0x1800000000000L, active3, 0x40000000L, active4, 0x10000000000600L, active5, 0x80080400200000L, active6, 0xa0824002c0000000L, active7, 0x8780000000001L, active8, 0x3fff0001c0030420L, active9, 0x8000000004000000L, active10, 0x3900000000000000L, active11, 0x8c200200100L); case 75: case 107: if ((active1 & 0x800L) != 0L) @@ -23298,9 +23339,9 @@ else if ((active4 & 0x2000000000000000L) != 0L) jjmatchedKind = 317; jjmatchedPos = 4; } - else if ((active11 & 0x400000000000L) != 0L) - return jjStartNfaWithStates_4(4, 750, 78); - return jjMoveStringLiteralDfa5_4(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x40020000L); + else if ((active11 & 0x800000000000L) != 0L) + return jjStartNfaWithStates_4(4, 751, 78); + return jjMoveStringLiteralDfa5_4(active0, 0x3000000000000040L, active1, 0L, active2, 0x4100000100000L, active3, 0x8L, active4, 0xc000000000000000L, active5, 0x20000000L, active6, 0x180000L, active7, 0x20000000L, active8, 0xc000000004c00002L, active9, 0x200000001L, active10, 0x800006L, active11, 0x80040000L); case 77: case 109: return jjMoveStringLiteralDfa5_4(active0, 0x80000000L, active1, 0x3000000L, active2, 0x1c0000000800000L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0x3f800000L, active7, 0x1800000000000000L, active8, 0L, active9, 0L, active10, 0x408000000L, active11, 0L); @@ -23317,10 +23358,10 @@ else if ((active1 & 0x2L) != 0L) return jjStartNfaWithStates_4(4, 65, 78); else if ((active10 & 0x40000000L) != 0L) return jjStartNfaWithStates_4(4, 670, 78); - return jjMoveStringLiteralDfa5_4(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x80080000L); + return jjMoveStringLiteralDfa5_4(active0, 0x130000000020L, active1, 0L, active2, 0x800e0000000L, active3, 0x80000000010000L, active4, 0x4000L, active5, 0L, active6, 0x3000L, active7, 0x2000000000000L, active8, 0x18L, active9, 0x4000001eL, active10, 0x10000000L, active11, 0x100100000L); case 79: case 111: - return jjMoveStringLiteralDfa5_4(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x120L); + return jjMoveStringLiteralDfa5_4(active0, 0x41000000080L, active1, 0L, active2, 0x200000000018L, active3, 0x10008000000L, active4, 0x4000000L, active5, 0x8000180000L, active6, 0x80000000180L, active7, 0L, active8, 0L, active9, 0x2000000000000L, active10, 0x100000000L, active11, 0x240L); case 80: case 112: if ((active3 & 0x8000000000000L) != 0L) @@ -23328,7 +23369,7 @@ else if ((active10 & 0x40000000L) != 0L) jjmatchedKind = 243; jjmatchedPos = 4; } - return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x20000000000000L, active11, 0x400L); + return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x700000000001a2L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100000000000000L, active8, 0L, active9, 0L, active10, 0x40000000000000L, active11, 0x800L); case 82: case 114: if ((active0 & 0x800L) != 0L) @@ -23358,9 +23399,9 @@ else if ((active6 & 0x1000000000000000L) != 0L) return jjStartNfaWithStates_4(4, 444, 78); else if ((active10 & 0x20000000L) != 0L) return jjStartNfaWithStates_4(4, 669, 78); - else if ((active10 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_4(4, 677, 78); - return jjMoveStringLiteralDfa5_4(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x4000000000L, active11, 0L); + else if ((active10 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_4(4, 678, 78); + return jjMoveStringLiteralDfa5_4(active0, 0x204020000000L, active1, 0x6000000000000L, active2, 0x78018000000L, active3, 0x40000c0080020000L, active4, 0x4000000708008L, active5, 0x1400010000000000L, active6, 0x204800L, active7, 0x80001fd0000d00L, active8, 0x840L, active9, 0x20L, active10, 0x8000000000L, active11, 0L); case 83: case 115: if ((active1 & 0x10000000000000L) != 0L) @@ -23377,11 +23418,11 @@ else if ((active7 & 0x40L) != 0L) return jjStartNfaWithStates_4(4, 454, 78); else if ((active8 & 0x100000L) != 0L) return jjStartNfaWithStates_4(4, 532, 78); - else if ((active11 & 0x1L) != 0L) - return jjStartNfaWithStates_4(4, 704, 78); - else if ((active11 & 0x4000L) != 0L) - return jjStartNfaWithStates_4(4, 718, 78); - return jjMoveStringLiteralDfa5_4(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x40000800000ff8L, active11, 0L); + else if ((active11 & 0x2L) != 0L) + return jjStartNfaWithStates_4(4, 705, 78); + else if ((active11 & 0x8000L) != 0L) + return jjStartNfaWithStates_4(4, 719, 78); + return jjMoveStringLiteralDfa5_4(active0, 0x10000000L, active1, 0x3000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x4000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f08000000000040L, active10, 0x80000800000ff8L, active11, 0L); case 84: case 116: if ((active1 & 0x1000000000000L) != 0L) @@ -23414,10 +23455,10 @@ else if ((active9 & 0x800000L) != 0L) return jjStartNfaWithStates_4(4, 599, 78); else if ((active10 & 0x1000L) != 0L) return jjStartNfaWithStates_4(4, 652, 78); - return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x1000000000L, active11, 0L); + return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0x803f000000000L, active2, 0x20000f800L, active3, 0x2004008001002000L, active4, 0x40080000000000L, active5, 0x6000000003000001L, active6, 0xc000400000000L, active7, 0x200006L, active8, 0x800000000L, active9, 0x70000fff80L, active10, 0x2000000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x8000040000L); + return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0x1L, active2, 0x6000000L, active3, 0x1600L, active4, 0x400000000060L, active5, 0x3000L, active6, 0x100000020000L, active7, 0x40000000000L, active8, 0L, active9, 0x400000000L, active10, 0x84000000L, active11, 0x10000080000L); case 86: case 118: return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0x2000000000L, active3, 0L, active4, 0L, active5, 0x8000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x300000L, active10, 0x200000000L, active11, 0L); @@ -23425,11 +23466,11 @@ else if ((active10 & 0x1000L) != 0L) case 119: if ((active0 & 0x4000L) != 0L) return jjStartNfaWithStates_4(4, 14, 78); - return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000L); + return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x800000000L); case 88: case 120: - if ((active11 & 0x20000000L) != 0L) - return jjStartNfaWithStates_4(4, 733, 78); + if ((active11 & 0x40000000L) != 0L) + return jjStartNfaWithStates_4(4, 734, 78); return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0L, active10, 0L, active11, 0L); case 89: case 121: @@ -23444,9 +23485,9 @@ else if ((active2 & 0x1000000000000000L) != 0L) return jjStartNfaWithStates_4(4, 188, 78); else if ((active3 & 0x40L) != 0L) return jjStartNfaWithStates_4(4, 198, 78); - else if ((active11 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_4(4, 745, 78); - return jjMoveStringLiteralDfa5_4(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100010000000L); + else if ((active11 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_4(4, 746, 78); + return jjMoveStringLiteralDfa5_4(active0, 0x1c10000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200020000000L); case 90: case 122: return jjMoveStringLiteralDfa5_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x6000000000000000L, active10, 0L, active11, 0L); @@ -23467,7 +23508,7 @@ private final int jjMoveStringLiteralDfa5_4(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa6_4(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x10000000000000L, active11, 0x2e00010L); + return jjMoveStringLiteralDfa6_4(active0, 0x30001c00000L, active1, 0x6000000002000L, active2, 0x400000000L, active3, 0x10000401000000L, active4, 0L, active5, 0x2000000000000380L, active6, 0L, active7, 0xc000000000000000L, active8, 0x1L, active9, 0x800000000000L, active10, 0x20000000000000L, active11, 0x5c00020L); case 65: case 97: if ((active7 & 0x800000000000000L) != 0L) @@ -23475,7 +23516,7 @@ private final int jjMoveStringLiteralDfa5_4(long old0, long active0, long old1, jjmatchedKind = 507; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_4(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x140000000740078L, active11, 0x20000L); + return jjMoveStringLiteralDfa6_4(active0, 0x1000000002000L, active1, 0L, active2, 0x800080L, active3, 0xc0080000002L, active4, 0x4400308000700L, active5, 0x8010000000000L, active6, 0x40183000L, active7, 0x1000020000003000L, active8, 0x100800400800L, active9, 0x200300000L, active10, 0x280000000740078L, active11, 0x40000L); case 66: case 98: return jjMoveStringLiteralDfa6_4(active0, 0xc00000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x40000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -23490,7 +23531,7 @@ else if ((active6 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_4(5, 447, 78); else if ((active9 & 0x4000000L) != 0L) return jjStartNfaWithStates_4(5, 602, 78); - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x4000100000L); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0xe008007f0L, active2, 0L, active3, 0x40000L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000005004000L, active8, 0x400000000L, active9, 0x6L, active10, 0L, active11, 0x8000200000L); case 68: case 100: if ((active0 & 0x40000000000000L) != 0L) @@ -23506,7 +23547,7 @@ else if ((active8 & 0x8L) != 0L) jjmatchedKind = 515; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_4(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x1e0010000000L, active11, 0L); + return jjMoveStringLiteralDfa6_4(active0, 0x300000000000000L, active1, 0x40000000000000L, active2, 0x200L, active3, 0x600L, active4, 0x60L, active5, 0L, active6, 0x4060000000000000L, active7, 0x80000000000000L, active8, 0x10L, active9, 0x48000000000000L, active10, 0x3c0010000000L, active11, 0L); case 69: case 101: if ((active0 & 0x4000000000L) != 0L) @@ -23547,9 +23588,9 @@ else if ((active10 & 0x800000L) != 0L) return jjStartNfaWithStates_4(5, 663, 78); else if ((active10 & 0x80000000L) != 0L) return jjStartNfaWithStates_4(5, 671, 78); - else if ((active10 & 0x1000000000L) != 0L) - return jjStartNfaWithStates_4(5, 676, 78); - return jjMoveStringLiteralDfa6_4(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x80000400L); + else if ((active10 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_4(5, 677, 78); + return jjMoveStringLiteralDfa6_4(active0, 0x80080000000L, active1, 0L, active2, 0x20c0000000L, active3, 0x4000000000000L, active4, 0x40401080000L, active5, 0x4002000060L, active6, 0x3f800000L, active7, 0xc06L, active8, 0x200000000000L, active9, 0x8000000020L, active10, 0x40001e002L, active11, 0x100000800L); case 70: case 102: if ((active5 & 0x80000000000000L) != 0L) @@ -23559,20 +23600,20 @@ else if ((active10 & 0x1000000000L) != 0L) case 103: if ((active3 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_4(5, 247, 78); - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x200000000L); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x40000000L, active4, 0L, active5, 0x70000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x40000000L, active10, 0L, active11, 0x400000000L); case 72: case 104: if ((active4 & 0x40000000000000L) != 0L) return jjStartNfaWithStates_4(5, 310, 78); else if ((active8 & 0x4L) != 0L) return jjStartNfaWithStates_4(5, 514, 78); - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x400000000L, active7, 0L, active8, 0x40000000000L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 73: case 105: - return jjMoveStringLiteralDfa6_4(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x80000L); + return jjMoveStringLiteralDfa6_4(active0, 0x10000000L, active1, 0xc0000001000L, active2, 0x21c003800000f800L, active3, 0x2020008000008000L, active4, 0x3L, active5, 0x400000010000000L, active6, 0xc000000200800L, active7, 0x10208000L, active8, 0xe004000040L, active9, 0x1000000380L, active10, 0x4L, active11, 0x100000L); case 75: case 107: - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x4000000L); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x8000000L); case 76: case 108: if ((active3 & 0x400000000000L) != 0L) @@ -23581,7 +23622,7 @@ else if ((active6 & 0x100000000L) != 0L) return jjStartNfaWithStates_4(5, 416, 78); else if ((active8 & 0x2L) != 0L) return jjStartNfaWithStates_4(5, 513, 78); - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x40000000L); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0x8L, active2, 0x100006000000L, active3, 0L, active4, 0L, active5, 0x3000004000800L, active6, 0x2000000000000000L, active7, 0L, active8, 0x890000002000L, active9, 0x400000000L, active10, 0xe00L, active11, 0x80000000L); case 77: case 109: if ((active9 & 0x20000000L) != 0L) @@ -23615,17 +23656,17 @@ else if ((active7 & 0x40000000L) != 0L) jjmatchedKind = 478; jjmatchedPos = 5; } - else if ((active11 & 0x80L) != 0L) - return jjStartNfaWithStates_4(5, 711, 78); - return jjMoveStringLiteralDfa6_4(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0x680000004000000L, active11, 0x2100000000L); + else if ((active11 & 0x100L) != 0L) + return jjStartNfaWithStates_4(5, 712, 78); + return jjMoveStringLiteralDfa6_4(active0, 0x8080000040000000L, active1, 0xff8010000e000000L, active2, 0x400a00000000007L, active3, 0x20000L, active4, 0x10000000030000L, active5, 0x88000400000L, active6, 0x478200000100L, active7, 0x8781f80000000L, active8, 0x3fff000000001000L, active9, 0x8000000000000000L, active10, 0xd00001004000000L, active11, 0x4200000000L); case 79: case 111: - return jjMoveStringLiteralDfa6_4(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x1820000200000000L, active11, 0x400000000L); + return jjMoveStringLiteralDfa6_4(active0, 0x3000000000000000L, active1, 0L, active2, 0x80000100000L, active3, 0L, active4, 0x1800000000L, active5, 0x1L, active6, 0x2000000000000L, active7, 0x161000000000000L, active8, 0xc000420000030020L, active9, 0x6000000000000001L, active10, 0x3040000200000000L, active11, 0x800000000L); case 80: case 112: if ((active7 & 0x40000000000L) != 0L) return jjStartNfaWithStates_4(5, 490, 78); - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x10040000L); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x2000000L, active11, 0x20080000L); case 81: case 113: return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -23649,7 +23690,7 @@ else if ((active8 & 0x4000L) != 0L) jjmatchedKind = 526; jjmatchedPos = 5; } - return jjMoveStringLiteralDfa6_4(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa6_4(active0, 0x1000000000L, active1, 0x23f000000001L, active2, 0x19000010L, active3, 0x100000000000001L, active4, 0x500000000000000L, active5, 0x1000000000003000L, active6, 0xb00002000000000L, active7, 0x8010000L, active8, 0x1000008000L, active9, 0x2006000000000L, active10, 0L, active11, 0x2000000L); case 83: case 115: if ((active0 & 0x10000L) != 0L) @@ -23666,9 +23707,9 @@ else if ((active5 & 0x4000000000000000L) != 0L) return jjStartNfaWithStates_4(5, 382, 78); else if ((active6 & 0x4000L) != 0L) return jjStartNfaWithStates_4(5, 398, 78); - else if ((active10 & 0x8000000000000L) != 0L) - return jjStartNfaWithStates_4(5, 691, 78); - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x4000000000000000L, active11, 0xc0000000000L); + else if ((active10 & 0x10000000000000L) != 0L) + return jjStartNfaWithStates_4(5, 692, 78); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0x800000010000L, active2, 0L, active3, 0x200000000L, active4, 0x4000304000L, active5, 0x400300000L, active6, 0x80000000000000L, active7, 0x5e0100L, active8, 0L, active9, 0x10000000ffc00L, active10, 0x8000000000000000L, active11, 0x180000000000L); case 84: case 116: if ((active0 & 0x20L) != 0L) @@ -23705,21 +23746,21 @@ else if ((active9 & 0x800000000L) != 0L) return jjStartNfaWithStates_4(5, 611, 78); else if ((active10 & 0x800000000L) != 0L) return jjStartNfaWithStates_4(5, 675, 78); - else if ((active10 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_4(5, 678, 78); - return jjMoveStringLiteralDfa6_4(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x8000000000L); + else if ((active10 & 0x8000000000L) != 0L) + return jjStartNfaWithStates_4(5, 679, 78); + return jjMoveStringLiteralDfa6_4(active0, 0x4000020000000L, active1, 0x1e07c0000L, active2, 0x400000000400L, active3, 0x100000001100L, active4, 0xc000000010000000L, active5, 0L, active6, 0x100080000000L, active7, 0x800000L, active8, 0x400L, active9, 0x1f80040080000000L, active10, 0L, active11, 0x10000000000L); case 85: case 117: - return jjMoveStringLiteralDfa6_4(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x100L); + return jjMoveStringLiteralDfa6_4(active0, 0x40000000040L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x8L, active10, 0L, active11, 0x200L); case 86: case 118: - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x8000004L); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000400000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x18000010L, active10, 0L, active11, 0x10000008L); case 87: case 119: if ((active4 & 0x4000000L) != 0L) return jjStartNfaWithStates_4(5, 282, 78); - else if ((active11 & 0x20L) != 0L) - return jjStartNfaWithStates_4(5, 709, 78); + else if ((active11 & 0x40L) != 0L) + return jjStartNfaWithStates_4(5, 710, 78); return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0x20000L, active3, 0x8000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000L, active11, 0L); case 88: case 120: @@ -23737,7 +23778,7 @@ else if ((active9 & 0x20000000000L) != 0L) return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0x40000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000000L); + return jjMoveStringLiteralDfa6_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); default : break; } @@ -23759,13 +23800,13 @@ private final int jjMoveStringLiteralDfa6_4(long old0, long active0, long old1, return jjStartNfaWithStates_4(6, 464, 78); break; case 95: - return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0x8000L, active9, 0x300058000000L, active10, 0L, active11, 0x100000000L); case 65: case 97: - return jjMoveStringLiteralDfa7_4(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x80000000000e00L, active11, 0x200008000000L); + return jjMoveStringLiteralDfa7_4(active0, 0x80000000400000L, active1, 0x1f000000000L, active2, 0x8000000L, active3, 0x20001L, active4, 0x2008000400003L, active5, 0x8000000000L, active6, 0L, active7, 0x90000000800000L, active8, 0x40000000000L, active9, 0x1f0b000000000070L, active10, 0x100000000000e00L, active11, 0x400010000000L); case 66: case 98: - return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0L, active2, 0x8000000000L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x20L); case 67: case 99: if ((active2 & 0x40000000000000L) != 0L) @@ -23788,7 +23829,7 @@ else if ((active5 & 0x20L) != 0L) return jjStartNfaWithStates_4(6, 325, 78); else if ((active10 & 0x400000000L) != 0L) return jjStartNfaWithStates_4(6, 674, 78); - return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x4000000004000000L, active11, 0L); + return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0xc000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x200000L, active7, 0L, active8, 0L, active9, 0x8000000000L, active10, 0x8000000004000000L, active11, 0L); case 69: case 101: if ((active0 & 0x100000000000000L) != 0L) @@ -23826,13 +23867,13 @@ else if ((active7 & 0x80000000000L) != 0L) } else if ((active10 & 0x2000000L) != 0L) return jjStartNfaWithStates_4(6, 665, 78); - else if ((active11 & 0x4000000000L) != 0L) - return jjStartNfaWithStates_4(6, 742, 78); else if ((active11 & 0x8000000000L) != 0L) return jjStartNfaWithStates_4(6, 743, 78); - else if ((active11 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_4(6, 748, 78); - return jjMoveStringLiteralDfa7_4(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x1e0000000000L, active11, 0x45000004L); + else if ((active11 & 0x10000000000L) != 0L) + return jjStartNfaWithStates_4(6, 744, 78); + else if ((active11 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_4(6, 749, 78); + return jjMoveStringLiteralDfa7_4(active0, 0x200000000000000L, active1, 0x8L, active2, 0x8000000010060000L, active3, 0x200000000L, active4, 0x400000000300084L, active5, 0x1000000410372000L, active6, 0x2020000000000000L, active7, 0x700780000000L, active8, 0x400000000L, active9, 0x2000000L, active10, 0x3c1000000000L, active11, 0x8a000008L); case 70: case 102: return jjMoveStringLiteralDfa7_4(active0, 0x10000000000L, active1, 0x1000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -23855,21 +23896,21 @@ else if ((active6 & 0x400000000000L) != 0L) return jjStartNfaWithStates_4(6, 430, 78); else if ((active7 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_4(6, 499, 78); - else if ((active10 & 0x400000000000000L) != 0L) - return jjStartNfaWithStates_4(6, 698, 78); - else if ((active11 & 0x100000000L) != 0L) - return jjStartNfaWithStates_4(6, 736, 78); - return jjMoveStringLiteralDfa7_4(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x400000L); + else if ((active10 & 0x800000000000000L) != 0L) + return jjStartNfaWithStates_4(6, 699, 78); + else if ((active11 & 0x200000000L) != 0L) + return jjStartNfaWithStates_4(6, 737, 78); + return jjMoveStringLiteralDfa7_4(active0, 0x2000000000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x2000000000L, active9, 0L, active10, 0L, active11, 0x800000L); case 72: case 104: if ((active0 & 0x4000000000000L) != 0L) return jjStartNfaWithStates_4(6, 50, 78); - else if ((active11 & 0x80000000000L) != 0L) - return jjStartNfaWithStates_4(6, 747, 78); + else if ((active11 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_4(6, 748, 78); return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa7_4(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x200100000L); + return jjMoveStringLiteralDfa7_4(active0, 0x1020000000L, active1, 0x400001c0780000L, active2, 0x40000000200L, active3, 0x8000500L, active4, 0xc000000010004040L, active5, 0x3000000000000L, active6, 0xc0000080000000L, active7, 0x100000800000100L, active8, 0x1c0002400L, active9, 0x400060000ffc00L, active10, 0x18000000L, active11, 0x400200000L); case 76: case 108: if ((active2 & 0x800000L) != 0L) @@ -23895,7 +23936,7 @@ else if ((active6 & 0x40000000L) != 0L) return jjMoveStringLiteralDfa7_4(active0, 0x40000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400L, active5, 0x2048000000000000L, active6, 0x2000L, active7, 0x20000L, active8, 0L, active9, 0x4L, active10, 0L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa7_4(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x40000000000000L, active11, 0L); + return jjMoveStringLiteralDfa7_4(active0, 0x41000000L, active1, 0L, active2, 0xf800L, active3, 0L, active4, 0x40000000000L, active5, 0L, active6, 0L, active7, 0x2000000000000L, active8, 0L, active9, 0x188L, active10, 0x80000000000000L, active11, 0L); case 78: case 110: if ((active0 & 0x80000000000L) != 0L) @@ -23921,19 +23962,19 @@ else if ((active8 & 0x10000L) != 0L) } else if ((active10 & 0x100000000L) != 0L) return jjStartNfaWithStates_4(6, 672, 78); - else if ((active10 & 0x800000000000000L) != 0L) + else if ((active10 & 0x1000000000000000L) != 0L) { - jjmatchedKind = 699; + jjmatchedKind = 700; jjmatchedPos = 6; } - return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x1000000000000004L, active11, 0x800000L); + return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0xc0000000000L, active2, 0x2000200000000000L, active3, 0x20000000000000L, active4, 0L, active5, 0x400100L, active6, 0x800L, active7, 0x8000000000008c00L, active8, 0xc000005004020000L, active9, 0x6000800000000201L, active10, 0x2000000000000004L, active11, 0x1000000L); case 79: case 111: - return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x10000000000180L, active11, 0L); + return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0x2000L, active2, 0x100000000000L, active3, 0x8000000000L, active4, 0L, active5, 0L, active6, 0xc000000000000L, active7, 0x4000L, active8, 0x8b0000000000L, active9, 0L, active10, 0x20000000000180L, active11, 0L); case 80: case 112: - if ((active10 & 0x20000000000000L) != 0L) - return jjStartNfaWithStates_4(6, 693, 78); + if ((active10 & 0x40000000000000L) != 0L) + return jjStartNfaWithStates_4(6, 694, 78); return jjMoveStringLiteralDfa7_4(active0, 0x20000000000L, active1, 0x2800000000000L, active2, 0x30000000000L, active3, 0L, active4, 0x80000000000L, active5, 0L, active6, 0x80000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 82: case 114: @@ -23959,11 +24000,11 @@ else if ((active10 & 0x2000L) != 0L) jjmatchedKind = 653; jjmatchedPos = 6; } - else if ((active10 & 0x100000000000000L) != 0L) - return jjStartNfaWithStates_4(6, 696, 78); - else if ((active11 & 0x400L) != 0L) - return jjStartNfaWithStates_4(6, 714, 78); - return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x400000000L); + else if ((active10 & 0x200000000000000L) != 0L) + return jjStartNfaWithStates_4(6, 697, 78); + else if ((active11 & 0x800L) != 0L) + return jjStartNfaWithStates_4(6, 715, 78); + return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0L, active2, 0x400000400L, active3, 0x100400000002L, active4, 0x300000000L, active5, 0x200L, active6, 0x400000000L, active7, 0x40000000000004L, active8, 0L, active9, 0x80040000300000L, active10, 0x5c000L, active11, 0x800000000L); case 83: case 115: if ((active5 & 0x40L) != 0L) @@ -23976,9 +24017,9 @@ else if ((active7 & 0x1000000000L) != 0L) return jjStartNfaWithStates_4(6, 484, 78); else if ((active8 & 0x10L) != 0L) return jjStartNfaWithStates_4(6, 516, 78); - else if ((active11 & 0x40000L) != 0L) - return jjStartNfaWithStates_4(6, 722, 78); - return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x200000L); + else if ((active11 & 0x80000L) != 0L) + return jjStartNfaWithStates_4(6, 723, 78); + return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0x4000000000000L, active2, 0x80000000080L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x200000000L, active10, 0x200000L, active11, 0x400000L); case 84: case 116: if ((active1 & 0x800000L) != 0L) @@ -24019,14 +24060,14 @@ else if ((active9 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_4(6, 639, 78); else if ((active10 & 0x200000000L) != 0L) return jjStartNfaWithStates_4(6, 673, 78); - else if ((active10 & 0x200000000000000L) != 0L) - return jjStartNfaWithStates_4(6, 697, 78); - else if ((active11 & 0x100L) != 0L) - return jjStartNfaWithStates_4(6, 712, 78); - return jjMoveStringLiteralDfa7_4(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x400120a0000L); + else if ((active10 & 0x400000000000000L) != 0L) + return jjStartNfaWithStates_4(6, 698, 78); + else if ((active11 & 0x200L) != 0L) + return jjStartNfaWithStates_4(6, 713, 78); + return jjMoveStringLiteralDfa7_4(active0, 0x90002040L, active1, 0xff00000c200007f0L, active2, 0x4000007L, active3, 0x2000080000000000L, active4, 0x20100L, active5, 0L, active6, 0x7003f800000L, active7, 0L, active8, 0x3fff100800000840L, active9, 0x1400000000L, active10, 0x100000L, active11, 0x80024140000L); case 85: case 117: - return jjMoveStringLiteralDfa7_4(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa7_4(active0, 0xc00000000L, active1, 0x120000000000L, active2, 0L, active3, 0L, active4, 0x2000000000L, active5, 0x4000800L, active6, 0x4000000000000000L, active7, 0x1000000000000L, active8, 0x400000000000L, active9, 0x80000000L, active10, 0L, active11, 0x4000000000L); case 86: case 118: return jjMoveStringLiteralDfa7_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0x200000000000000L, active7, 0x203000L, active8, 0L, active9, 0L, active10, 0x2L, active11, 0L); @@ -24068,7 +24109,7 @@ private final int jjMoveStringLiteralDfa7_4(long old0, long active0, long old1, return jjMoveStringLiteralDfa8_4(active0, 0x2000000000000000L, active1, 0xff0000000c000000L, active2, 0x180000000000007L, active3, 0L, active4, 0L, active5, 0x70000L, active6, 0x40000000000L, active7, 0x700000000000L, active8, 0x20000L, active9, 0xffc00L, active10, 0x1c000L, active11, 0L); case 65: case 97: - return jjMoveStringLiteralDfa8_4(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x4000000000000000L, active11, 0x800000L); + return jjMoveStringLiteralDfa8_4(active0, 0x20001000000L, active1, 0x4000000000000L, active2, 0x400140000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0xc000000000000000L, active8, 0x804000000000L, active9, 0x800040000002L, active10, 0x8000000000000000L, active11, 0x1000000L); case 66: case 98: if ((active8 & 0x10000000000L) != 0L) @@ -24092,8 +24133,10 @@ else if ((active8 & 0x40000000L) != 0L) return jjStartNfaWithStates_4(7, 57, 78); else if ((active2 & 0x10000000L) != 0L) return jjStartNfaWithStates_4(7, 156, 78); - else if ((active11 & 0x400000000L) != 0L) - return jjStartNfaWithStates_4(7, 738, 78); + else if ((active10 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_4(7, 676, 78); + else if ((active11 & 0x800000000L) != 0L) + return jjStartNfaWithStates_4(7, 739, 78); return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x40000780000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 69: case 101: @@ -24143,14 +24186,14 @@ else if ((active9 & 0x80L) != 0L) } else if ((active10 & 0x100000L) != 0L) return jjStartNfaWithStates_4(7, 660, 78); - else if ((active11 & 0x20000L) != 0L) - return jjStartNfaWithStates_4(7, 721, 78); - return jjMoveStringLiteralDfa8_4(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x10000000L); + else if ((active11 & 0x40000L) != 0L) + return jjStartNfaWithStates_4(7, 722, 78); + return jjMoveStringLiteralDfa8_4(active0, 0x40000000L, active1, 0x200007f0L, active2, 0x20000002f000L, active3, 0x80000000000L, active4, 0x2000000000L, active5, 0x2000000000000200L, active6, 0x3f800000L, active7, 0L, active8, 0x3fff000000000000L, active9, 0x6000000000000108L, active10, 0x4000002L, active11, 0x20000000L); case 70: case 102: - if ((active10 & 0x10000000000000L) != 0L) - return jjStartNfaWithStates_4(7, 692, 78); - return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x1e0000000000L, active11, 0L); + if ((active10 & 0x20000000000000L) != 0L) + return jjStartNfaWithStates_4(7, 693, 78); + return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0x200L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x20000000000000L, active8, 0L, active9, 0x40000000000000L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active2 & 0x2000000000000000L) != 0L) @@ -24161,7 +24204,7 @@ else if ((active6 & 0x800L) != 0L) return jjStartNfaWithStates_4(7, 395, 78); else if ((active10 & 0x4L) != 0L) return jjStartNfaWithStates_4(7, 642, 78); - return jjMoveStringLiteralDfa8_4(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x1000000L); + return jjMoveStringLiteralDfa8_4(active0, 0x400000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x400000000000000L, active5, 0L, active6, 0x2000000000000000L, active7, 0x3000L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0x2000000L); case 72: case 104: if ((active2 & 0x400000000000L) != 0L) @@ -24169,7 +24212,7 @@ else if ((active10 & 0x4L) != 0L) return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x100000000000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa8_4(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x1000000000000000L, active11, 0x40000000000L); + return jjMoveStringLiteralDfa8_4(active0, 0x10000000L, active1, 0x1fc00001000L, active2, 0L, active3, 0L, active4, 0x400020000L, active5, 0x400000L, active6, 0x30000202000L, active7, 0L, active8, 0x203000000000L, active9, 0x40400000000L, active10, 0x2000000000000000L, active11, 0x80000000000L); case 74: case 106: return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x1800000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -24188,9 +24231,9 @@ else if ((active5 & 0x8000000000L) != 0L) return jjStartNfaWithStates_4(7, 359, 78); else if ((active9 & 0x20L) != 0L) return jjStartNfaWithStates_4(7, 581, 78); - else if ((active11 & 0x40000000L) != 0L) - return jjStartNfaWithStates_4(7, 734, 78); - return jjMoveStringLiteralDfa8_4(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x8000000L); + else if ((active11 & 0x80000000L) != 0L) + return jjStartNfaWithStates_4(7, 735, 78); + return jjMoveStringLiteralDfa8_4(active0, 0x80040000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2008000000400L, active5, 0L, active6, 0L, active7, 0L, active8, 0x20000000000L, active9, 0x40L, active10, 0L, active11, 0x10000000L); case 77: case 109: return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0L, active3, 0x1L, active4, 0xc000000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x1f01000000000000L, active10, 0L, active11, 0L); @@ -24203,22 +24246,22 @@ else if ((active6 & 0x4000000000000L) != 0L) jjmatchedKind = 434; jjmatchedPos = 7; } - return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x200200000000L); + return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0x2000008L, active2, 0x40000000010L, active3, 0x8000400L, active4, 0xc4L, active5, 0x1000000000000000L, active6, 0x48000000000000L, active7, 0x1101000800000000L, active8, 0x8000L, active9, 0x6002000000L, active10, 0L, active11, 0x400400000000L); case 79: case 111: - return jjMoveStringLiteralDfa8_4(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x2000000000L); + return jjMoveStringLiteralDfa8_4(active0, 0x20800000L, active1, 0x28001c0780000L, active2, 0L, active3, 0x10000400000100L, active4, 0x4010000100L, active5, 0x4000000080L, active6, 0x80000480000000L, active7, 0x20000L, active8, 0x800L, active9, 0x4L, active10, 0L, active11, 0x4000000000L); case 80: case 112: - if ((active10 & 0x40000000000000L) != 0L) - return jjStartNfaWithStates_4(7, 694, 78); + if ((active10 & 0x80000000000000L) != 0L) + return jjStartNfaWithStates_4(7, 695, 78); return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x400000000L, active9, 0x8000000L, active10, 0L, active11, 0L); case 82: case 114: if ((active8 & 0x40000000000L) != 0L) return jjStartNfaWithStates_4(7, 554, 78); - else if ((active11 & 0x4L) != 0L) - return jjStartNfaWithStates_4(7, 706, 78); - return jjMoveStringLiteralDfa8_4(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x80000000040180L, active11, 0x400000L); + else if ((active11 & 0x8L) != 0L) + return jjStartNfaWithStates_4(7, 707, 78); + return jjMoveStringLiteralDfa8_4(active0, 0x10080000000L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0x300000000L, active5, 0L, active6, 0x4000000000000000L, active7, 0L, active8, 0L, active9, 0x2000080000010L, active10, 0x100000000040180L, active11, 0x800000L); case 83: case 115: if ((active1 & 0x40000000000L) != 0L) @@ -24240,7 +24283,7 @@ else if ((active7 & 0x4L) != 0L) return jjStartNfaWithStates_4(7, 450, 78); else if ((active9 & 0x8000000000L) != 0L) return jjStartNfaWithStates_4(7, 615, 78); - return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0x40080000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x10000000000000L, active8, 0L, active9, 0x210000000L, active10, 0L, active11, 0x100000000L); case 84: case 116: if ((active2 & 0x800000000000L) != 0L) @@ -24253,10 +24296,10 @@ else if ((active8 & 0x4000000L) != 0L) return jjStartNfaWithStates_4(7, 538, 78); else if ((active10 & 0x200000L) != 0L) return jjStartNfaWithStates_4(7, 661, 78); - return jjMoveStringLiteralDfa8_4(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x100000L); + return jjMoveStringLiteralDfa8_4(active0, 0xc00000000L, active1, 0L, active2, 0xb0000000000L, active3, 0x2L, active4, 0x4003L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0x100000000000L, active10, 0x18000e78L, active11, 0x200000L); case 85: case 117: - return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x10L); + return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0x400L, active3, 0L, active4, 0L, active5, 0x8000000000100L, active6, 0L, active7, 0x4000L, active8, 0L, active9, 0x80201000000000L, active10, 0L, active11, 0x20L); case 86: case 118: return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x100L, active8, 0x400L, active9, 0L, active10, 0L, active11, 0L); @@ -24286,9 +24329,9 @@ else if ((active8 & 0x40L) != 0L) return jjStartNfaWithStates_4(7, 518, 78); else if ((active9 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_4(7, 627, 78); - else if ((active11 & 0x4000000L) != 0L) - return jjStartNfaWithStates_4(7, 730, 78); - return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x2280000L); + else if ((active11 & 0x8000000L) != 0L) + return jjStartNfaWithStates_4(7, 731, 78); + return jjMoveStringLiteralDfa8_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x200L, active10, 0L, active11, 0x4500000L); case 90: case 122: return jjMoveStringLiteralDfa8_4(active0, 0x1000000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x3000000000000L, active6, 0L, active7, 0L, active8, 0x2000L, active9, 0L, active10, 0L, active11, 0L); @@ -24309,7 +24352,7 @@ private final int jjMoveStringLiteralDfa8_4(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x80000L); + return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x80000000000L, active2, 0xf000L, active3, 0L, active4, 0L, active5, 0L, active6, 0x8000000000000L, active7, 0x780000000L, active8, 0x80000000L, active9, 0x6000000200000000L, active10, 0L, active11, 0x100000L); case 65: case 97: return jjMoveStringLiteralDfa9_4(active0, 0x11000000000L, active1, 0x2000000L, active2, 0x10L, active3, 0L, active4, 0x300020000L, active5, 0L, active6, 0L, active7, 0x1000000000000000L, active8, 0xa000L, active9, 0x10000000L, active10, 0x40000L, active11, 0L); @@ -24322,7 +24365,7 @@ private final int jjMoveStringLiteralDfa8_4(long old0, long active0, long old1, case 99: if ((active9 & 0x40000000000L) != 0L) return jjStartNfaWithStates_4(8, 618, 78); - return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x40000000010L); + return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x100000000000000L, active2, 0x200000000000L, active3, 0L, active4, 0L, active5, 0x1000000000000200L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0x10L, active10, 0x4000L, active11, 0x80000000020L); case 68: case 100: if ((active1 & 0x20000000L) != 0L) @@ -24331,8 +24374,8 @@ else if ((active3 & 0x80000000000L) != 0L) return jjStartNfaWithStates_4(8, 235, 78); else if ((active10 & 0x4000000L) != 0L) return jjStartNfaWithStates_4(8, 666, 78); - else if ((active11 & 0x10000000L) != 0L) - return jjStartNfaWithStates_4(8, 732, 78); + else if ((active11 & 0x20000000L) != 0L) + return jjStartNfaWithStates_4(8, 733, 78); return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x600000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x400L, active10, 0L, active11, 0L); case 69: case 101: @@ -24400,9 +24443,9 @@ else if ((active9 & 0x2000000000L) != 0L) jjmatchedKind = 613; jjmatchedPos = 8; } - else if ((active11 & 0x200000000L) != 0L) - return jjStartNfaWithStates_4(8, 737, 78); - return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x200000000000L); + else if ((active11 & 0x400000000L) != 0L) + return jjStartNfaWithStates_4(8, 738, 78); + return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x8L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1000000000000L, active9, 0x4040000000L, active10, 0L, active11, 0x400000000000L); case 72: case 104: return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1L, active9, 0x201000L, active10, 0L, active11, 0L); @@ -24410,7 +24453,7 @@ else if ((active11 & 0x200000000L) != 0L) case 105: if ((active0 & 0x40000000000L) != 0L) return jjStartNfaWithStates_4(8, 42, 78); - return jjMoveStringLiteralDfa9_4(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x1e0010000878L, active11, 0x81000000L); + return jjMoveStringLiteralDfa9_4(active0, 0x80000080000000L, active1, 0x2000L, active2, 0xd0000000000L, active3, 0x2L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0x40000000000800L, active8, 0L, active9, 0x100000100200L, active10, 0x3c0010000878L, active11, 0x102000000L); case 75: case 107: if ((active2 & 0x20000L) != 0L) @@ -24426,7 +24469,7 @@ else if ((active11 & 0x200000000L) != 0L) jjmatchedKind = 647; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x800000L); + return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x4000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0L, active7, 0x8000000000000000L, active8, 0x200000000000L, active9, 0x80000000e000L, active10, 0x100L, active11, 0x1000000L); case 78: case 110: if ((active0 & 0x20000000L) != 0L) @@ -24449,10 +24492,10 @@ else if ((active6 & 0x80000000L) != 0L) return jjStartNfaWithStates_4(8, 415, 78); else if ((active6 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_4(8, 439, 78); - return jjMoveStringLiteralDfa9_4(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x1000000000008000L, active11, 0x200000L); + return jjMoveStringLiteralDfa9_4(active0, 0x2000000040800000L, active1, 0x81f180700000L, active2, 0x400000400L, active3, 0x10000000000000L, active4, 0L, active5, 0x2000004000000080L, active6, 0x200000L, active7, 0x200000004000L, active8, 0x3000000000L, active9, 0x80000000000000L, active10, 0x2000000000008000L, active11, 0x400000L); case 79: case 111: - return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0xc00000000L, active2, 0x20000000000L, active3, 0x200000000L, active4, 0L, active5, 0x320000L, active6, 0L, active7, 0L, active8, 0L, active9, 0x8000000L, active10, 0L, active11, 0x800000L); case 80: case 112: if ((active1 & 0x2000000000000L) != 0L) @@ -24462,7 +24505,7 @@ else if ((active9 & 0x100000000000000L) != 0L) jjmatchedKind = 632; jjmatchedPos = 8; } - return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x2000000L); + return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x800000000000000L, active2, 0L, active3, 0L, active4, 0x4000000000L, active5, 0L, active6, 0L, active7, 0x20000L, active8, 0L, active9, 0x1e01000000000000L, active10, 0L, active11, 0x4000000L); case 81: case 113: return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0L); @@ -24514,7 +24557,7 @@ else if ((active9 & 0x2000000L) != 0L) return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0x8000020000000000L, active2, 0x100003L, active3, 0L, active4, 0x200004L, active5, 0x40000L, active6, 0x2000L, active7, 0x4000000000000000L, active8, 0x500000000L, active9, 0x1000000000L, active10, 0x8000000L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x2008000000L); + return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0x2008000000000L, active5, 0x400000L, active6, 0x400000000L, active7, 0L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0x4010000000L); case 86: case 118: return jjMoveStringLiteralDfa9_4(active0, 0x10000000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xc000000000000000L, active9, 0x1L, active10, 0L, active11, 0L); @@ -24538,12 +24581,12 @@ else if ((active7 & 0x2000L) != 0L) return jjStartNfaWithStates_4(8, 461, 78); else if ((active9 & 0x2000000000000L) != 0L) return jjStartNfaWithStates_4(8, 625, 78); - else if ((active10 & 0x80000000000000L) != 0L) - return jjStartNfaWithStates_4(8, 695, 78); - else if ((active10 & 0x4000000000000000L) != 0L) - return jjStartNfaWithStates_4(8, 702, 78); - else if ((active11 & 0x100000L) != 0L) - return jjStartNfaWithStates_4(8, 724, 78); + else if ((active10 & 0x100000000000000L) != 0L) + return jjStartNfaWithStates_4(8, 696, 78); + else if ((active10 & 0x8000000000000000L) != 0L) + return jjStartNfaWithStates_4(8, 703, 78); + else if ((active11 & 0x200000L) != 0L) + return jjStartNfaWithStates_4(8, 725, 78); return jjMoveStringLiteralDfa9_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x80000L, active10, 0L, active11, 0L); default : break; @@ -24577,7 +24620,7 @@ else if ((active2 & 0x400L) != 0L) return jjStartNfaWithStates_4(9, 138, 78); else if ((active9 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_4(9, 631, 78); - return jjMoveStringLiteralDfa10_4(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjMoveStringLiteralDfa10_4(active0, 0x800000L, active1, 0x4000000000000000L, active2, 0x80000000000L, active3, 0x10000000000000L, active4, 0x1800000000L, active5, 0x20000L, active6, 0L, active7, 0x400080000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 68: case 100: if ((active5 & 0x4000000000L) != 0L) @@ -24611,13 +24654,13 @@ else if ((active9 & 0x1000000000L) != 0L) return jjStartNfaWithStates_4(9, 612, 78); else if ((active9 & 0x800000000000L) != 0L) return jjStartNfaWithStates_4(9, 623, 78); - else if ((active11 & 0x800000L) != 0L) - return jjStartNfaWithStates_4(9, 727, 78); - else if ((active11 & 0x2000000L) != 0L) - return jjStartNfaWithStates_4(9, 729, 78); - else if ((active11 & 0x8000000L) != 0L) - return jjStartNfaWithStates_4(9, 731, 78); - return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x200000000000L); + else if ((active11 & 0x1000000L) != 0L) + return jjStartNfaWithStates_4(9, 728, 78); + else if ((active11 & 0x4000000L) != 0L) + return jjStartNfaWithStates_4(9, 730, 78); + else if ((active11 & 0x10000000L) != 0L) + return jjStartNfaWithStates_4(9, 732, 78); + return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000050000L, active6, 0x30000000000L, active7, 0x20000000000000L, active8, 0x1000000000001L, active9, 0x2004000e0000L, active10, 0x8000000L, active11, 0x400000000000L); case 71: case 103: if ((active6 & 0x200000L) != 0L) @@ -24626,8 +24669,8 @@ else if ((active8 & 0x1000000000L) != 0L) return jjStartNfaWithStates_4(9, 548, 78); else if ((active9 & 0x40000000L) != 0L) return jjStartNfaWithStates_4(9, 606, 78); - else if ((active10 & 0x1000000000000000L) != 0L) - return jjStartNfaWithStates_4(9, 700, 78); + else if ((active10 & 0x2000000000000000L) != 0L) + return jjStartNfaWithStates_4(9, 701, 78); return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0x2000L, active2, 0L, active3, 0L, active4, 0L, active5, 0x2000000000000000L, active6, 0x400000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 72: case 104: @@ -24639,7 +24682,7 @@ else if ((active10 & 0x1000000000000000L) != 0L) case 107: if ((active2 & 0x400000000L) != 0L) return jjStartNfaWithStates_4(9, 162, 78); - return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80010L); + return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100020L); case 76: case 108: return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x2L, active5, 0L, active6, 0L, active7, 0x100000000L, active8, 0L, active9, 0x1000000000000L, active10, 0L, active11, 0L); @@ -24655,10 +24698,10 @@ else if ((active10 & 0x1000000000000000L) != 0L) jjmatchedKind = 98; jjmatchedPos = 9; } - return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0x800000000L, active2, 0L, active3, 0x200000000L, active4, 0L, active5, 0x300000L, active6, 0L, active7, 0x40000000000800L, active8, 0x80000000L, active9, 0x100200L, active10, 0x3c0000000000L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x1000000L); + return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0x3000020000000000L, active2, 0x10000000000L, active3, 0L, active4, 0L, active5, 0x200L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x200009000L, active10, 0x10000878L, active11, 0x2000000L); case 80: case 112: if ((active1 & 0x4000000000000L) != 0L) @@ -24689,10 +24732,10 @@ else if ((active7 & 0x400L) != 0L) return jjStartNfaWithStates_4(9, 458, 78); else if ((active10 & 0x100L) != 0L) return jjStartNfaWithStates_4(9, 648, 78); - else if ((active11 & 0x2000000000L) != 0L) - return jjStartNfaWithStates_4(9, 741, 78); - else if ((active11 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_4(9, 746, 78); + else if ((active11 & 0x4000000000L) != 0L) + return jjStartNfaWithStates_4(9, 742, 78); + else if ((active11 & 0x80000000000L) != 0L) + return jjStartNfaWithStates_4(9, 747, 78); return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0x80000000000L, active2, 0x40000000004L, active3, 0L, active4, 0x8000000000000000L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0x20000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: @@ -24712,7 +24755,7 @@ else if ((active8 & 0x2000000000L) != 0L) return jjMoveStringLiteralDfa10_4(active0, 0x80021000000000L, active1, 0x1e000000008L, active2, 0x8000L, active3, 0x2L, active4, 0x400000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x100L, active10, 0L, active11, 0L); case 85: case 117: - return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x400000L); + return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0xc000000L, active2, 0x180000000000000L, active3, 0x1000000L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x10000L, active10, 0L, active11, 0x800000L); case 86: case 118: return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -24739,7 +24782,7 @@ else if ((active10 & 0x40000L) != 0L) return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x200000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x80000000L); + return jjMoveStringLiteralDfa10_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x100000000L); default : break; } @@ -24776,7 +24819,7 @@ else if ((active5 & 0x200000L) != 0L) return jjStartNfaWithStates_4(10, 341, 78); else if ((active10 & 0x8000000L) != 0L) return jjStartNfaWithStates_4(10, 667, 78); - return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0xa00000000000000L, active10, 0L, active11, 0x400000000000L); case 69: case 101: if ((active0 & 0x10000000000L) != 0L) @@ -24797,9 +24840,9 @@ else if ((active9 & 0x100000000000L) != 0L) return jjStartNfaWithStates_4(10, 620, 78); else if ((active9 & 0x1000000000000L) != 0L) return jjStartNfaWithStates_4(10, 624, 78); - else if ((active11 & 0x80000000L) != 0L) - return jjStartNfaWithStates_4(10, 735, 78); - return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x1e0000000000L, active11, 0x80010L); + else if ((active11 & 0x100000000L) != 0L) + return jjStartNfaWithStates_4(10, 736, 78); + return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0L, active2, 0x4L, active3, 0L, active4, 0L, active5, 0x100L, active6, 0x8000000000000L, active7, 0x100000000L, active8, 0x20000L, active9, 0x40000L, active10, 0x3c0000000000L, active11, 0x100020L); case 70: case 102: return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0x400000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -24814,7 +24857,7 @@ else if ((active11 & 0x80000000L) != 0L) return jjStartNfaWithStates_4(10, 67, 78); else if ((active6 & 0x400000000L) != 0L) return jjStartNfaWithStates_4(10, 418, 78); - return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x200000L); + return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0x4000000000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x400000000000L, active8, 0L, active9, 0L, active10, 0x10000L, active11, 0x400000L); case 73: case 105: return jjMoveStringLiteralDfa11_4(active0, 0x21000000000L, active1, 0x800000002000L, active2, 0x1000L, active3, 0x2L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0L, active8, 0L, active9, 0x4400000000000000L, active10, 0L, active11, 0L); @@ -24841,8 +24884,8 @@ else if ((active10 & 0x8L) != 0L) } else if ((active10 & 0x800L) != 0L) return jjStartNfaWithStates_4(10, 651, 78); - else if ((active11 & 0x1000000L) != 0L) - return jjStartNfaWithStates_4(10, 728, 78); + else if ((active11 & 0x2000000L) != 0L) + return jjStartNfaWithStates_4(10, 729, 78); return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0x10c200000L, active2, 0x180000000006000L, active3, 0L, active4, 0L, active5, 0x10000L, active6, 0x40002000000L, active7, 0L, active8, 0L, active9, 0xc040L, active10, 0x10000070L, active11, 0L); case 79: case 111: @@ -24851,8 +24894,8 @@ else if ((active11 & 0x1000000L) != 0L) case 112: if ((active9 & 0x10000000L) != 0L) return jjStartNfaWithStates_4(10, 604, 78); - else if ((active11 & 0x400000L) != 0L) - return jjStartNfaWithStates_4(10, 726, 78); + else if ((active11 & 0x800000L) != 0L) + return jjStartNfaWithStates_4(10, 727, 78); return jjMoveStringLiteralDfa11_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x100000000L, active9, 0L, active10, 0L, active11, 0L); case 81: case 113: @@ -24928,7 +24971,7 @@ private final int jjMoveStringLiteralDfa11_4(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa12_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa12_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0x1000000000000000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 65: case 97: if ((active8 & 0x1L) != 0L) @@ -24944,7 +24987,7 @@ private final int jjMoveStringLiteralDfa11_4(long old0, long active0, long old1, case 100: if ((active9 & 0x200000000000000L) != 0L) return jjStartNfaWithStates_4(11, 633, 78); - return jjMoveStringLiteralDfa12_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa12_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x20000000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 69: case 101: if ((active0 & 0x2000000000000000L) != 0L) @@ -25029,7 +25072,7 @@ else if ((active9 & 0x1000L) != 0L) return jjStartNfaWithStates_4(11, 588, 78); else if ((active9 & 0x80000L) != 0L) return jjStartNfaWithStates_4(11, 595, 78); - return jjMoveStringLiteralDfa12_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa12_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0x1000000000112000L, active10, 0L, active11, 0x400000L); case 83: case 115: return jjMoveStringLiteralDfa12_4(active0, 0L, active1, 0x8000000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x70L, active11, 0L); @@ -25041,16 +25084,16 @@ else if ((active5 & 0x40000L) != 0L) return jjStartNfaWithStates_4(11, 338, 78); else if ((active9 & 0x40L) != 0L) return jjStartNfaWithStates_4(11, 582, 78); - else if ((active11 & 0x10L) != 0L) - return jjStartNfaWithStates_4(11, 708, 78); + else if ((active11 & 0x20L) != 0L) + return jjStartNfaWithStates_4(11, 709, 78); return jjMoveStringLiteralDfa12_4(active0, 0x20000800000L, active1, 0x200L, active2, 0x6000L, active3, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0x8000L, active10, 0L, active11, 0L); case 85: case 117: return jjMoveStringLiteralDfa12_4(active0, 0L, active1, 0x100000000L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x2000000000004000L, active10, 0L, active11, 0L); case 89: case 121: - if ((active11 & 0x80000L) != 0L) - return jjStartNfaWithStates_4(11, 723, 78); + if ((active11 & 0x100000L) != 0L) + return jjStartNfaWithStates_4(11, 724, 78); break; default : break; @@ -25069,7 +25112,7 @@ private final int jjMoveStringLiteralDfa12_4(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa13_4(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x1e0000000070L, active11, 0L); + return jjMoveStringLiteralDfa13_4(active0, 0x800000L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x3ffe000000000000L, active9, 0x800L, active10, 0x3c0000000070L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa13_4(active0, 0L, active1, 0x6800000000L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -25125,12 +25168,12 @@ else if ((active3 & 0x2L) != 0L) return jjMoveStringLiteralDfa13_4(active0, 0L, active1, 0x20L, active2, 0x8000L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0x20000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa13_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa13_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0x4L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0L, active9, 0x2000L, active10, 0L, active11, 0x400000L); case 80: case 112: if ((active9 & 0x100L) != 0L) return jjStartNfaWithStates_4(12, 584, 78); - return jjMoveStringLiteralDfa13_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa13_4(active0, 0L, active1, 0L, active2, 0L, active3, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0x8000L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 82: case 114: if ((active9 & 0x2000000000000000L) != 0L) @@ -25176,7 +25219,7 @@ else if ((active7 & 0x400000000000L) != 0L) return jjStartNfaWithStates_4(13, 494, 78); else if ((active10 & 0x10000L) != 0L) return jjStartNfaWithStates_4(13, 656, 78); - return jjMoveStringLiteralDfa14_4(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa14_4(active0, 0x800000L, active1, 0x100000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000000L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 66: case 98: return jjMoveStringLiteralDfa14_4(active0, 0L, active1, 0x100000000L, active2, 0L, active4, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -25229,7 +25272,7 @@ else if ((active9 & 0x4000L) != 0L) case 110: if ((active4 & 0x4L) != 0L) return jjStartNfaWithStates_4(13, 258, 78); - return jjMoveStringLiteralDfa14_4(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x200000L); + return jjMoveStringLiteralDfa14_4(active0, 0L, active1, 0L, active2, 0L, active4, 0L, active5, 0L, active6, 0x10000000000L, active7, 0L, active8, 0x4000000000000000L, active9, 0x1000000000000000L, active10, 0x2L, active11, 0x400000L); case 79: case 111: return jjMoveStringLiteralDfa14_4(active0, 0x20000000000L, active1, 0x100000000000000L, active2, 0L, active4, 0L, active5, 0x80L, active6, 0L, active7, 0x100000000000L, active8, 0L, active9, 0L, active10, 0x4000L, active11, 0L); @@ -25250,7 +25293,7 @@ else if ((active9 & 0x4000L) != 0L) case 116: if ((active7 & 0x8000L) != 0L) return jjStartNfaWithStates_4(13, 463, 78); - return jjMoveStringLiteralDfa14_4(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa14_4(active0, 0L, active1, 0x82000000000L, active2, 0x1L, active4, 0L, active5, 0L, active6, 0L, active7, 0x700000000L, active8, 0L, active9, 0x4000000000000000L, active10, 0x3c0000000000L, active11, 0L); case 88: case 120: if ((active6 & 0x8000000000000L) != 0L) @@ -25317,7 +25360,7 @@ else if ((active10 & 0x4000L) != 0L) break; case 73: case 105: - return jjMoveStringLiteralDfa15_4(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa15_4(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0x300000000000000L, active9, 0L, active10, 0L, active11, 0x400000L); case 76: case 108: return jjMoveStringLiteralDfa15_4(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -25344,7 +25387,7 @@ else if ((active8 & 0x8000000000000000L) != 0L) return jjStartNfaWithStates_4(14, 575, 78); else if ((active9 & 0x10000L) != 0L) return jjStartNfaWithStates_4(14, 592, 78); - return jjMoveStringLiteralDfa15_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa15_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000000000L); case 83: case 115: if ((active1 & 0x200L) != 0L) @@ -25369,7 +25412,7 @@ else if ((active10 & 0x400L) != 0L) break; case 89: case 121: - return jjMoveStringLiteralDfa15_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa15_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); default : break; } @@ -25436,7 +25479,7 @@ else if ((active2 & 0x80000000000000L) != 0L) return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0x100000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 82: case 114: if ((active1 & 0x100000000L) != 0L) @@ -25446,7 +25489,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000000L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x400000000L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0xe0000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -25460,7 +25503,7 @@ else if ((active9 & 0x1L) != 0L) return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); case 90: case 122: - return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa16_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); default : break; } @@ -25483,12 +25526,12 @@ private final int jjMoveStringLiteralDfa16_4(long old0, long active0, long old1, case 97: if ((active1 & 0x8000000000L) != 0L) return jjStartNfaWithStates_4(16, 103, 78); - return jjMoveStringLiteralDfa17_4(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa17_4(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: if ((active7 & 0x400000000L) != 0L) return jjStartNfaWithStates_4(16, 482, 78); - return jjMoveStringLiteralDfa17_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa17_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 71: case 103: if ((active1 & 0x100000L) != 0L) @@ -25499,7 +25542,7 @@ private final int jjMoveStringLiteralDfa16_4(long old0, long active0, long old1, return jjMoveStringLiteralDfa17_4(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa17_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa17_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x38000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0x400000000000L); case 76: case 108: return jjMoveStringLiteralDfa17_4(active0, 0L, active1, 0L, active2, 0x6000L, active5, 0L, active6, 0x4000000L, active7, 0x80000000L, active8, 0L, active9, 0L, active10, 0x40L, active11, 0L); @@ -25563,7 +25606,7 @@ private final int jjMoveStringLiteralDfa17_4(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa18_4(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x1e0000000000L, active11, 0L); + return jjMoveStringLiteralDfa18_4(active0, 0L, active1, 0L, active2, 0x6002L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x3c0000000000L, active11, 0L); case 65: case 97: return jjMoveStringLiteralDfa18_4(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -25599,7 +25642,7 @@ private final int jjMoveStringLiteralDfa17_4(long old0, long active0, long old1, return jjMoveStringLiteralDfa18_4(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa18_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa18_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0x31c000000000000L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 86: case 118: return jjMoveStringLiteralDfa18_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x10L, active11, 0L); @@ -25626,7 +25669,7 @@ private final int jjMoveStringLiteralDfa18_4(long old0, long active0, long old1, return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x60000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0x2000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0xc0000000000L, active11, 0L); case 68: case 100: if ((active8 & 0x800000000000000L) != 0L) @@ -25651,7 +25694,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0x2L, active5, 0L, active6, 0L, active7, 0x200000000L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 73: case 105: - return jjMoveStringLiteralDfa19_4(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa19_4(active0, 0x1000000L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0x400000400000L); case 76: case 108: return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0x40L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); @@ -25660,7 +25703,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0x100L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); case 79: case 111: return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0x1c000000000000L, active9, 0L, active10, 0L, active11, 0L); @@ -25669,7 +25712,7 @@ else if ((active10 & 0x10L) != 0L) return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0x4000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0L, active9, 0L, active10, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active9, 0L, active10, 0x200000000000L, active11, 0L); case 84: case 116: return jjMoveStringLiteralDfa19_4(active0, 0L, active1, 0L, active2, 0L, active5, 0x20000L, active6, 0L, active7, 0x80000000L, active8, 0x20c0000000000000L, active9, 0L, active10, 0x20L, active11, 0L); @@ -25695,10 +25738,10 @@ private final int jjMoveStringLiteralDfa19_4(long old0, long active0, long old1, case 97: if ((active1 & 0x100L) != 0L) return jjStartNfaWithStates_4(19, 72, 78); - return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0xa0000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0x140000000000L, active11, 0L); case 67: case 99: - return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0L, active2, 0L, active5, 0L, active6, 0x8000000L, active7, 0L, active8, 0L, active10, 0x200000000000L, active11, 0L); case 68: case 100: return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0x8000000L, active2, 0x100000000000000L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -25712,7 +25755,7 @@ private final int jjMoveStringLiteralDfa19_4(long old0, long active0, long old1, return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0x400000000000000L, active2, 0L, active5, 0L, active6, 0x10000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x40000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0x40L, active2, 0x2000L, active5, 0L, active6, 0x4000000L, active7, 0L, active8, 0x20c0000000000000L, active10, 0x80000000000L, active11, 0x400000400000L); case 82: case 114: return jjMoveStringLiteralDfa20_4(active0, 0L, active1, 0L, active2, 0x4002L, active5, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -25756,7 +25799,7 @@ private final int jjMoveStringLiteralDfa20_4(long old0, long active0, long old1, return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0x20000000L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); case 68: case 100: - return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0x2000L, active6, 0L, active7, 0L, active8, 0L, active10, 0x80000000000L, active11, 0L); case 69: case 101: if ((active1 & 0x8000000L) != 0L) @@ -25773,13 +25816,13 @@ else if ((active2 & 0x100000000000000L) != 0L) case 104: if ((active7 & 0x200000000L) != 0L) return jjStartNfaWithStates_4(20, 481, 78); - return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x100000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x4000000000000L, active10, 0x200000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x80000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x8000000000000L, active10, 0x100000000000L, active11, 0L); case 78: case 110: - return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 79: case 111: return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0x2L, active6, 0L, active7, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -25788,7 +25831,7 @@ else if ((active2 & 0x100000000000000L) != 0L) return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0x400000000000000L, active2, 0L, active6, 0x4000000L, active7, 0L, active8, 0x10000000000000L, active10, 0L, active11, 0L); case 84: case 116: - return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa21_4(active0, 0L, active1, 0L, active2, 0L, active6, 0L, active7, 0L, active8, 0x200000000000000L, active10, 0x40000000000L, active11, 0L); case 89: case 121: if ((active0 & 0x1000000L) != 0L) @@ -25811,10 +25854,10 @@ private final int jjMoveStringLiteralDfa21_4(long old0, long active0, long old1, switch(curChar) { case 95: - return jjMoveStringLiteralDfa22_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa22_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000400000L); case 65: case 97: - return jjMoveStringLiteralDfa22_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000040L, active11, 0L); + return jjMoveStringLiteralDfa22_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000040L, active11, 0L); case 67: case 99: return jjMoveStringLiteralDfa22_4(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -25827,11 +25870,11 @@ private final int jjMoveStringLiteralDfa21_4(long old0, long active0, long old1, case 101: if ((active2 & 0x2000L) != 0L) return jjStartNfaWithStates_4(21, 141, 78); - else if ((active10 & 0x40000000000L) != 0L) - return jjStartNfaWithStates_4(21, 682, 78); else if ((active10 & 0x80000000000L) != 0L) return jjStartNfaWithStates_4(21, 683, 78); - return jjMoveStringLiteralDfa22_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x100000000000L, active11, 0L); + else if ((active10 & 0x100000000000L) != 0L) + return jjStartNfaWithStates_4(21, 684, 78); + return jjMoveStringLiteralDfa22_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x200000000000L, active11, 0L); case 70: case 102: return jjMoveStringLiteralDfa22_4(active1, 0x400000000000000L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); @@ -25890,10 +25933,10 @@ private final int jjMoveStringLiteralDfa22_4(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0x4000L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 76: case 108: - return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x20000000000L, active11, 0L); + return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x40000000000L, active11, 0L); case 77: case 109: - return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x100000000000L, active11, 0x200000L); + return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0x200000000000L, active11, 0x400000L); case 78: case 110: return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x8000000000000L, active10, 0L, active11, 0L); @@ -25905,7 +25948,7 @@ private final int jjMoveStringLiteralDfa22_4(long old1, long active1, long old2, return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 82: case 114: - return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa23_4(active1, 0L, active2, 0L, active6, 0x4000000L, active8, 0L, active10, 0L, active11, 0L); @@ -25932,8 +25975,8 @@ private final int jjMoveStringLiteralDfa23_4(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_4(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 65: case 97: - if ((active10 & 0x100000000000L) != 0L) - return jjStartNfaWithStates_4(23, 684, 78); + if ((active10 & 0x200000000000L) != 0L) + return jjStartNfaWithStates_4(23, 685, 78); break; case 67: case 99: @@ -25957,7 +26000,7 @@ private final int jjMoveStringLiteralDfa23_4(long old1, long active1, long old2, return jjMoveStringLiteralDfa24_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x2040000000000000L, active10, 0L, active11, 0L); case 79: case 111: - return jjMoveStringLiteralDfa24_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x20000000000L, active11, 0x200000200000L); + return jjMoveStringLiteralDfa24_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x10000000000000L, active10, 0x40000000000L, active11, 0x400000400000L); case 82: case 114: if ((active8 & 0x4000000000000L) != 0L) @@ -25992,7 +26035,7 @@ private final int jjMoveStringLiteralDfa24_4(long old1, long active1, long old2, break; case 68: case 100: - return jjMoveStringLiteralDfa25_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000L); + return jjMoveStringLiteralDfa25_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000L); case 69: case 101: return jjMoveStringLiteralDfa25_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x200000000000000L, active10, 0L, active11, 0L); @@ -26001,8 +26044,8 @@ private final int jjMoveStringLiteralDfa24_4(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_4(active1, 0L, active2, 0x2L, active6, 0L, active8, 0L, active10, 0L, active11, 0L); case 71: case 103: - if ((active10 & 0x20000000000L) != 0L) - return jjStartNfaWithStates_4(24, 681, 78); + if ((active10 & 0x40000000000L) != 0L) + return jjStartNfaWithStates_4(24, 682, 78); break; case 73: case 105: @@ -26024,7 +26067,7 @@ private final int jjMoveStringLiteralDfa24_4(long old1, long active1, long old2, return jjMoveStringLiteralDfa25_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active10, 0L, active11, 0L); case 87: case 119: - return jjMoveStringLiteralDfa25_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa25_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active10, 0L, active11, 0x400000000000L); default : break; } @@ -26055,8 +26098,8 @@ private final int jjMoveStringLiteralDfa25_4(long old1, long active1, long old2, case 101: if ((active8 & 0x8000000000000L) != 0L) return jjStartNfaWithStates_4(25, 563, 78); - else if ((active11 & 0x200000L) != 0L) - return jjStartNfaWithStates_4(25, 725, 78); + else if ((active11 & 0x400000L) != 0L) + return jjStartNfaWithStates_4(25, 726, 78); break; case 71: case 103: @@ -26078,7 +26121,7 @@ else if ((active11 & 0x200000L) != 0L) return jjMoveStringLiteralDfa26_4(active1, 0L, active2, 0x4002L, active6, 0L, active8, 0L, active11, 0L); case 83: case 115: - return jjMoveStringLiteralDfa26_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa26_4(active1, 0L, active2, 0L, active6, 0L, active8, 0L, active11, 0x400000000000L); case 84: case 116: return jjMoveStringLiteralDfa26_4(active1, 0L, active2, 0L, active6, 0L, active8, 0x40000000000000L, active11, 0L); @@ -26099,7 +26142,7 @@ private final int jjMoveStringLiteralDfa26_4(long old1, long active1, long old2, switch(curChar) { case 95: - return jjMoveStringLiteralDfa27_4(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa27_4(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 68: case 100: if ((active8 & 0x80000000000000L) != 0L) @@ -26147,7 +26190,7 @@ private final int jjMoveStringLiteralDfa27_4(long old1, long active1, long old2, return jjMoveStringLiteralDfa28_4(active1, 0L, active2, 0L, active8, 0x200000000000000L, active11, 0L); case 80: case 112: - return jjMoveStringLiteralDfa28_4(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa28_4(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 82: case 114: return jjMoveStringLiteralDfa28_4(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -26174,7 +26217,7 @@ private final int jjMoveStringLiteralDfa28_4(long old1, long active1, long old2, break; case 69: case 101: - return jjMoveStringLiteralDfa29_4(active1, 0L, active2, 0L, active8, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa29_4(active1, 0L, active2, 0L, active8, 0L, active11, 0x400000000000L); case 79: case 111: return jjMoveStringLiteralDfa29_4(active1, 0x400000000000000L, active2, 0L, active8, 0L, active11, 0L); @@ -26199,7 +26242,7 @@ private final int jjMoveStringLiteralDfa29_4(long old1, long active1, long old2, { case 82: case 114: - return jjMoveStringLiteralDfa30_4(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa30_4(active1, 0L, active2, 0L, active11, 0x400000000000L); case 85: case 117: return jjMoveStringLiteralDfa30_4(active1, 0x400000000000000L, active2, 0L, active11, 0L); @@ -26224,7 +26267,7 @@ private final int jjMoveStringLiteralDfa30_4(long old1, long active1, long old2, { case 67: case 99: - return jjMoveStringLiteralDfa31_4(active1, 0L, active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa31_4(active1, 0L, active2, 0L, active11, 0x400000000000L); case 80: case 112: if ((active1 & 0x400000000000000L) != 0L) @@ -26250,7 +26293,7 @@ private final int jjMoveStringLiteralDfa31_4(long old1, long active1, long old2, case 101: if ((active2 & 0x2L) != 0L) return jjStartNfaWithStates_4(31, 129, 78); - return jjMoveStringLiteralDfa32_4(active2, 0L, active11, 0x200000000000L); + return jjMoveStringLiteralDfa32_4(active2, 0L, active11, 0x400000000000L); default : break; } @@ -26269,7 +26312,7 @@ private final int jjMoveStringLiteralDfa32_4(long old2, long active2, long old11 { case 78: case 110: - return jjMoveStringLiteralDfa33_4(active11, 0x200000000000L); + return jjMoveStringLiteralDfa33_4(active11, 0x400000000000L); default : break; } @@ -26288,8 +26331,8 @@ private final int jjMoveStringLiteralDfa33_4(long old11, long active11) { case 84: case 116: - if ((active11 & 0x200000000000L) != 0L) - return jjStartNfaWithStates_4(33, 749, 78); + if ((active11 & 0x400000000000L) != 0L) + return jjStartNfaWithStates_4(33, 750, 78); break; default : break; @@ -26320,8 +26363,8 @@ private final int jjMoveNfa_4(int startState, int curPos) jjCheckNAddStates(62, 64); else if (curChar == 34) { - if (kind > 763) - kind = 763; + if (kind > 764) + kind = 764; } break; case 58: @@ -26329,8 +26372,8 @@ else if (curChar == 34) jjCheckNAddStates(65, 67); else if (curChar == 39) { - if (kind > 764) - kind = 764; + if (kind > 765) + kind = 765; } if ((0xfc00f7faffffc9ffL & l) != 0L) jjstateSet[jjnewStateCnt++] = 59; @@ -26342,8 +26385,8 @@ else if (curChar == 39) jjCheckNAddStates(16, 18); if ((0x3ff201000000000L & l) != 0L) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if ((0x3ff001000000000L & l) != 0L) @@ -26354,8 +26397,8 @@ else if (curChar == 39) case 76: if ((0x3ff000000000000L & l) != 0L) { - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); } if ((0x3ff000000000000L & l) != 0L) @@ -26366,8 +26409,8 @@ else if (curChar == 39) jjCheckNAddTwoStates(25, 26); if ((0x3ff201000000000L & l) != 0L) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if ((0x3ff001000000000L & l) != 0L) @@ -26375,16 +26418,6 @@ else if (curChar == 39) if (curChar == 36) jjCheckNAdd(27); break; - case 77: - if (curChar == 32) - jjCheckNAddTwoStates(68, 69); - if (curChar == 32) - jjCheckNAddTwoStates(65, 66); - if (curChar == 32) - jjCheckNAddTwoStates(63, 64); - if (curChar == 32) - jjCheckNAddTwoStates(61, 62); - break; case 31: if ((0x7ff601000000000L & l) != 0L) jjCheckNAddTwoStates(25, 26); @@ -26392,8 +26425,8 @@ else if (curChar == 38) jjstateSet[jjnewStateCnt++] = 32; if ((0x3ff201000000000L & l) != 0L) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if ((0x3ff001000000000L & l) != 0L) @@ -26401,11 +26434,21 @@ else if (curChar == 38) if (curChar == 36) jjCheckNAdd(27); break; + case 77: + if (curChar == 32) + jjCheckNAddTwoStates(68, 69); + if (curChar == 32) + jjCheckNAddTwoStates(65, 66); + if (curChar == 32) + jjCheckNAddTwoStates(63, 64); + if (curChar == 32) + jjCheckNAddTwoStates(61, 62); + break; case 74: if (curChar == 47) { - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(71, 73); } else if (curChar == 42) @@ -26416,8 +26459,8 @@ else if (curChar == 42) jjCheckNAddTwoStates(25, 26); if ((0x3ff201000000000L & l) != 0L) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if (curChar == 36) @@ -26434,8 +26477,8 @@ else if (curChar == 46) jjCheckNAddTwoStates(51, 52); else if (curChar == 7) { - if (kind > 826) - kind = 826; + if (kind > 829) + kind = 829; } else if (curChar == 45) jjstateSet[jjnewStateCnt++] = 11; @@ -26443,14 +26486,14 @@ else if (curChar == 34) jjCheckNAddStates(62, 64); if ((0x3ff000000000000L & l) != 0L) { - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(80, 86); } else if (curChar == 36) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } break; @@ -26467,8 +26510,8 @@ else if (curChar == 36) jjstateSet[jjnewStateCnt++] = 3; break; case 5: - if (curChar == 39 && kind > 757) - kind = 757; + if (curChar == 39 && kind > 758) + kind = 758; break; case 6: if (curChar == 34) @@ -26482,30 +26525,30 @@ else if (curChar == 36) jjCheckNAddStates(62, 64); break; case 10: - if (curChar == 34 && kind > 763) - kind = 763; + if (curChar == 34 && kind > 764) + kind = 764; break; case 11: if (curChar != 45) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(71, 73); break; case 12: if ((0xffffffffffffdbffL & l) == 0L) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(71, 73); break; case 13: - if ((0x2400L & l) != 0L && kind > 812) - kind = 812; + if ((0x2400L & l) != 0L && kind > 815) + kind = 815; break; case 14: - if (curChar == 10 && kind > 812) - kind = 812; + if (curChar == 10 && kind > 815) + kind = 815; break; case 15: if (curChar == 13) @@ -26522,15 +26565,15 @@ else if (curChar == 36) case 22: if (curChar != 36) break; - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); break; case 23: if ((0x3ff201000000000L & l) == 0L) break; - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); break; case 24: @@ -26548,8 +26591,8 @@ else if (curChar == 36) case 27: if (curChar != 36) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAddTwoStates(27, 28); break; case 28: @@ -26559,8 +26602,8 @@ else if (curChar == 36) case 29: if ((0x3ff001000000000L & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjCheckNAdd(29); break; case 32: @@ -26580,25 +26623,25 @@ else if (curChar == 36) jjstateSet[jjnewStateCnt++] = 34; break; case 36: - if (curChar == 34 && kind > 823) - kind = 823; + if (curChar == 34 && kind > 826) + kind = 826; break; case 37: - if (curChar == 7 && kind > 826) - kind = 826; + if (curChar == 7 && kind > 829) + kind = 829; break; case 38: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAddStates(80, 86); break; case 39: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 751) - kind = 751; + if (kind > 752) + kind = 752; jjCheckNAdd(39); break; case 40: @@ -26612,8 +26655,8 @@ else if (curChar == 36) case 43: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 752) - kind = 752; + if (kind > 753) + kind = 753; jjCheckNAdd(43); break; case 44: @@ -26627,22 +26670,22 @@ else if (curChar == 36) case 46: if (curChar != 46) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(47); break; case 47: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(47); break; case 48: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAddStates(93, 95); break; case 49: @@ -26660,8 +26703,8 @@ else if (curChar == 36) case 52: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 753) - kind = 753; + if (kind > 754) + kind = 754; jjCheckNAdd(52); break; case 53: @@ -26676,13 +26719,13 @@ else if (curChar == 36) jjCheckNAddStates(65, 67); break; case 57: - if (curChar == 39 && kind > 764) - kind = 764; - break; - case 59: if (curChar == 39 && kind > 765) kind = 765; break; + case 59: + if (curChar == 39 && kind > 766) + kind = 766; + break; case 61: if (curChar == 32) jjCheckNAddTwoStates(61, 62); @@ -26708,14 +26751,14 @@ else if (curChar == 36) jjstateSet[jjnewStateCnt++] = 73; break; case 73: - if ((0xffff7fffffffffffL & l) != 0L && kind > 810) - kind = 810; + if ((0xffff7fffffffffffL & l) != 0L && kind > 813) + kind = 813; break; case 75: if (curChar != 47) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjCheckNAddStates(71, 73); break; default : break; @@ -26750,8 +26793,8 @@ else if (curChar == 92) jjCheckNAddStates(68, 70); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } break; @@ -26762,8 +26805,20 @@ else if (curChar == 92) jjCheckNAddStates(68, 70); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; + jjCheckNAdd(23); + } + break; + case 31: + if ((0x7fffffe87fffffeL & l) != 0L) + jjCheckNAddTwoStates(25, 26); + if ((0x7fffffe87fffffeL & l) != 0L) + jjCheckNAddStates(68, 70); + if ((0x7fffffe87fffffeL & l) != 0L) + { + if (kind > 823) + kind = 823; jjCheckNAdd(23); } break; @@ -26773,26 +26828,14 @@ else if (curChar == 92) else if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 67; else if ((0x1000000010L & l) != 0L) - { - if (kind > 768) - kind = 768; - } - if ((0x10000000100000L & l) != 0L) { if (kind > 769) kind = 769; } - break; - case 31: - if ((0x7fffffe87fffffeL & l) != 0L) - jjCheckNAddTwoStates(25, 26); - if ((0x7fffffe87fffffeL & l) != 0L) - jjCheckNAddStates(68, 70); - if ((0x7fffffe87fffffeL & l) != 0L) + if ((0x10000000100000L & l) != 0L) { - if (kind > 820) - kind = 820; - jjCheckNAdd(23); + if (kind > 770) + kind = 770; } break; case 80: @@ -26800,8 +26843,8 @@ else if ((0x1000000010L & l) != 0L) jjCheckNAddTwoStates(25, 26); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } break; @@ -26814,8 +26857,8 @@ else if (curChar == 96) jjCheckNAddStates(87, 89); if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if ((0x20000000200000L & l) != 0L) @@ -26838,8 +26881,8 @@ else if ((0x100000001000000L & l) != 0L) jjCheckNAddStates(62, 64); break; case 12: - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(71, 73); break; case 17: @@ -26858,21 +26901,21 @@ else if ((0x100000001000000L & l) != 0L) jjCheckNAddStates(87, 89); break; case 21: - if (curChar == 96 && kind > 819) - kind = 819; + if (curChar == 96 && kind > 822) + kind = 822; break; case 22: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); break; case 23: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); break; case 24: @@ -26886,15 +26929,15 @@ else if ((0x100000001000000L & l) != 0L) case 27: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(108, 109); break; case 29: if ((0x7fffffe87fffffeL & l) == 0L) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 29; break; case 30: @@ -26924,32 +26967,32 @@ else if ((0x100000001000000L & l) != 0L) jjAddStates(100, 107); break; case 62: - if ((0x1000000010L & l) != 0L && kind > 768) - kind = 768; + if ((0x1000000010L & l) != 0L && kind > 769) + kind = 769; break; case 64: - if ((0x10000000100000L & l) != 0L && kind > 769) - kind = 769; + if ((0x10000000100000L & l) != 0L && kind > 770) + kind = 770; break; case 66: if ((0x10000000100000L & l) != 0L) jjstateSet[jjnewStateCnt++] = 67; break; case 67: - if ((0x8000000080000L & l) != 0L && kind > 770) - kind = 770; + if ((0x8000000080000L & l) != 0L && kind > 771) + kind = 771; break; case 69: if ((0x4000000040L & l) != 0L) jjstateSet[jjnewStateCnt++] = 70; break; case 70: - if ((0x400000004000L & l) != 0L && kind > 771) - kind = 771; + if ((0x400000004000L & l) != 0L && kind > 772) + kind = 772; break; case 73: - if (kind > 810) - kind = 810; + if (kind > 813) + kind = 813; break; default : break; } @@ -26981,8 +27024,8 @@ else if ((0x100000001000000L & l) != 0L) case 1: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -26993,8 +27036,8 @@ else if ((0x100000001000000L & l) != 0L) case 78: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -27005,8 +27048,8 @@ else if ((0x100000001000000L & l) != 0L) case 31: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -27017,8 +27060,8 @@ else if ((0x100000001000000L & l) != 0L) case 80: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -27027,8 +27070,8 @@ else if ((0x100000001000000L & l) != 0L) case 0: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) @@ -27041,8 +27084,8 @@ else if ((0x100000001000000L & l) != 0L) case 12: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) break; - if (kind > 812) - kind = 812; + if (kind > 815) + kind = 815; jjAddStates(71, 73); break; case 18: @@ -27053,15 +27096,15 @@ else if ((0x100000001000000L & l) != 0L) case 22: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); break; case 23: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 820) - kind = 820; + if (kind > 823) + kind = 823; jjCheckNAdd(23); break; case 24: @@ -27075,15 +27118,15 @@ else if ((0x100000001000000L & l) != 0L) case 27: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjAddStates(108, 109); break; case 29: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 822) - kind = 822; + if (kind > 825) + kind = 825; jjstateSet[jjnewStateCnt++] = 29; break; case 33: @@ -27096,8 +27139,8 @@ else if ((0x100000001000000L & l) != 0L) jjCheckNAddStates(65, 67); break; case 73: - if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 810) - kind = 810; + if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 813) + kind = 813; break; default : break; } @@ -27214,13 +27257,13 @@ private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, lo 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, "\50", "\51", null, -null, null, null, "\173", "\175", "\133", "\135", "\73", "\56", "\54", "\75", "\76", -"\74", "\77", "\72", "\74\75", "\76\75", "\74\76", "\41\75", "\53", "\55", "\55\76", -"\52", "\57", "\45", "\174\174", "\75\76", "\56\56", "\47", "\42", "\174", "\136", -"\44", "\72\72", null, null, null, null, null, "\57\52\53", "\52\57", 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, "\50", +"\51", null, null, null, null, "\173", "\175", "\133", "\135", "\73", "\56", "\54", +"\75", "\76", "\74", "\77", "\72", "\74\75", "\76\75", "\74\76", "\41\75", "\53", +"\55", "\55\76", "\52", "\57", "\45", "\174\174", "\75\76", "\56\56", "\47", "\42", +"\174", "\136", "\46", "\74\74", "\44", "\72\72", null, null, null, null, null, +"\57\52\53", "\52\57", null, null, null, null, null, null, null, null, null, null, null, +null, null, null, null, null, null, }; public static final String[] lexStateNames = { "DEFAULT", "DQID", @@ -27263,32 +27306,32 @@ private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, lo -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, }; static final long[] jjtoToken = { 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, - 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xfbe3ffffffffffffL, - 0x4ff0307ffffffffL, + 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xf7c7ffffffffffffL, + 0x27f8183fffffffffL, }; static final long[] jjtoSkip = { 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, - 0x70f800000000L, + 0x387c000000000L, }; static final long[] jjtoSpecial = { 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, - 0x600000000000L, + 0x3000000000000L, }; static final long[] jjtoMore = { 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, - 0x8c0000000000L, + 0x4600000000000L, }; protected SimpleCharStream input_stream; private final int[] jjrounds = new int[94]; @@ -27435,18 +27478,18 @@ public Token getNextToken() jjmatchedKind = 0x7fffffff; jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_5(); - if (jjmatchedPos == 0 && jjmatchedKind > 815) + if (jjmatchedPos == 0 && jjmatchedKind > 818) { - jjmatchedKind = 815; + jjmatchedKind = 818; } break; case 6: jjmatchedKind = 0x7fffffff; jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_6(); - if (jjmatchedPos == 0 && jjmatchedKind > 815) + if (jjmatchedPos == 0 && jjmatchedKind > 818) { - jjmatchedKind = 815; + jjmatchedKind = 818; } break; } @@ -27522,13 +27565,13 @@ void SkipLexicalActions(Token matchedToken) { switch(jjmatchedKind) { - case 813 : + case 816 : if (image == null) image = new StringBuffer(); image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); popState(); break; - case 814 : + case 817 : if (image == null) image = new StringBuffer(); image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); @@ -27543,14 +27586,14 @@ void MoreLexicalActions() jjimageLen += (lengthOfMatch = jjmatchedPos + 1); switch(jjmatchedKind) { - case 810 : + case 813 : if (image == null) image = new StringBuffer(); image.append(input_stream.GetSuffix(jjimageLen)); jjimageLen = 0; pushState(); break; - case 811 : + case 814 : if (image == null) image = new StringBuffer(); image.append(input_stream.GetSuffix(jjimageLen)); @@ -27619,19 +27662,19 @@ void TokenLexicalActions(Token matchedToken) image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); beforeTableName(); break; - case 676 : + case 677 : if (image == null) image = new StringBuffer(); image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); beforeTableName(); break; - case 691 : + case 692 : if (image == null) image = new StringBuffer(); image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); afterTableName(); break; - case 820 : + case 823 : if (image == null) image = new StringBuffer(); image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/ParseException.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/ParseException.java index f681bffe45265..3945667463adf 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/ParseException.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/ParseException.java @@ -1,4 +1,5 @@ -/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ +/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */ +/* JavaCCOptions:KEEP_LINE_COL=null */ package org.apache.ignite.internal.processors.query.calcite.sql.generated; /** @@ -12,25 +13,25 @@ */ public class ParseException extends Exception { + /** + * The version identifier for this Serializable class. + * Increment only if the serialized form of the + * class changes. + */ + private static final long serialVersionUID = 1L; + /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", - * "expectedTokenSequences", and "tokenImage" set. The boolean - * flag "specialConstructor" is also set to true to indicate that - * this constructor was used to create this object. - * This constructor calls its super class with the empty string - * to force the "toString" method of parent class "Throwable" to - * print the error message in the form: - * ParseException: + * "expectedTokenSequences", and "tokenImage" set. */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { - super(""); - specialConstructor = true; + super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal)); currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; @@ -48,20 +49,13 @@ public ParseException(Token currentTokenVal, public ParseException() { super(); - specialConstructor = false; } + /** Constructor with message. */ public ParseException(String message) { super(message); - specialConstructor = false; } - /** - * This variable determines which constructor was used to create - * this object and thereby affects the semantics of the - * "getMessage" method (see below). - */ - protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If @@ -85,19 +79,16 @@ public ParseException(String message) { public String[] tokenImage; /** - * This method has the standard behavior when this object has been - * created using the standard constructors. Otherwise, it uses - * "currentToken" and "expectedTokenSequences" to generate a parse + * It uses "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown - * from the parser), then this method is called during the printing - * of the final stack trace, and hence the correct error message + * from the parser) the correct error message * gets displayed. */ - public String getMessage() { - if (!specialConstructor) { - return super.getMessage(); - } + private static String initialise(Token currentToken, + int[][] expectedTokenSequences, + String[] tokenImage) { + String eol = System.getProperty("line.separator", "\n"); StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { @@ -105,7 +96,7 @@ public String getMessage() { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { - expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); + expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' '); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); @@ -120,8 +111,11 @@ public String getMessage() { retval += tokenImage[0]; break; } + retval += " " + tokenImage[tok.kind]; + retval += " \""; retval += add_escapes(tok.image); - tok = tok.next; + retval += " \""; + tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; @@ -138,13 +132,13 @@ public String getMessage() { * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); - + /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ - protected String add_escapes(String str) { + static String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { @@ -190,3 +184,4 @@ protected String add_escapes(String str) { } } +/* JavaCC - OriginalChecksum=93a5494f66aec9ac468759454ec1d80c (do not edit this line) */ diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/SimpleCharStream.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/SimpleCharStream.java index 91ec3d3c6427f..99af9cca6b7dc 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/SimpleCharStream.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/SimpleCharStream.java @@ -1,4 +1,5 @@ -/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */ +/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 5.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ package org.apache.ignite.internal.processors.query.calcite.sql.generated; /** @@ -8,10 +9,12 @@ public class SimpleCharStream { +/** Whether parser is static. */ public static final boolean staticFlag = false; int bufsize; int available; int tokenBegin; +/** Position in buffer. */ public int bufpos = -1; protected int bufline[]; protected int bufcolumn[]; @@ -35,210 +38,218 @@ public class SimpleCharStream protected void ExpandBuff(boolean wrapAround) { - char[] newbuffer = new char[bufsize + 2048]; - int newbufline[] = new int[bufsize + 2048]; - int newbufcolumn[] = new int[bufsize + 2048]; + char[] newbuffer = new char[bufsize + 2048]; + int newbufline[] = new int[bufsize + 2048]; + int newbufcolumn[] = new int[bufsize + 2048]; - try - { - if (wrapAround) - { - System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); - System.arraycopy(buffer, 0, newbuffer, - bufsize - tokenBegin, bufpos); - buffer = newbuffer; - - System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); - System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); - bufline = newbufline; - - System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); - System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); - bufcolumn = newbufcolumn; - - maxNextCharInd = (bufpos += (bufsize - tokenBegin)); - } - else - { - System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); - buffer = newbuffer; - - System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); - bufline = newbufline; - - System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); - bufcolumn = newbufcolumn; - - maxNextCharInd = (bufpos -= tokenBegin); - } - } - catch (Throwable t) - { - throw new Error(t.getMessage()); - } + try + { + if (wrapAround) + { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); + bufcolumn = newbufcolumn; + + maxNextCharInd = (bufpos += (bufsize - tokenBegin)); + } + else + { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + bufcolumn = newbufcolumn; + + maxNextCharInd = (bufpos -= tokenBegin); + } + } + catch (Throwable t) + { + throw new Error(t.getMessage()); + } - bufsize += 2048; - available = bufsize; - tokenBegin = 0; + bufsize += 2048; + available = bufsize; + tokenBegin = 0; } protected void FillBuff() throws java.io.IOException { - if (maxNextCharInd == available) - { - if (available == bufsize) + if (maxNextCharInd == available) + { + if (available == bufsize) + { + if (tokenBegin > 2048) { - if (tokenBegin > 2048) - { - bufpos = maxNextCharInd = 0; - available = tokenBegin; - } - else if (tokenBegin < 0) - bufpos = maxNextCharInd = 0; - else - ExpandBuff(false); + bufpos = maxNextCharInd = 0; + available = tokenBegin; } - else if (available > tokenBegin) - available = bufsize; - else if ((tokenBegin - available) < 2048) - ExpandBuff(true); + else if (tokenBegin < 0) + bufpos = maxNextCharInd = 0; else - available = tokenBegin; - } + ExpandBuff(false); + } + else if (available > tokenBegin) + available = bufsize; + else if ((tokenBegin - available) < 2048) + ExpandBuff(true); + else + available = tokenBegin; + } - int i; - try { - if ((i = inputStream.read(buffer, maxNextCharInd, - available - maxNextCharInd)) == -1) - { - inputStream.close(); - throw new java.io.IOException(); - } - else - maxNextCharInd += i; - return; - } - catch(java.io.IOException e) { - --bufpos; - backup(0); - if (tokenBegin == -1) - tokenBegin = bufpos; - throw e; - } + int i; + try { + if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1) + { + inputStream.close(); + throw new java.io.IOException(); + } + else + maxNextCharInd += i; + return; + } + catch(java.io.IOException e) { + --bufpos; + backup(0); + if (tokenBegin == -1) + tokenBegin = bufpos; + throw e; + } } +/** Start. */ public char BeginToken() throws java.io.IOException { - tokenBegin = -1; - char c = readChar(); - tokenBegin = bufpos; + tokenBegin = -1; + char c = readChar(); + tokenBegin = bufpos; - return c; + return c; } protected void UpdateLineColumn(char c) { - column++; + column++; - if (prevCharIsLF) - { - prevCharIsLF = false; + if (prevCharIsLF) + { + prevCharIsLF = false; + line += (column = 1); + } + else if (prevCharIsCR) + { + prevCharIsCR = false; + if (c == '\n') + { + prevCharIsLF = true; + } + else line += (column = 1); - } - else if (prevCharIsCR) - { - prevCharIsCR = false; - if (c == '\n') - { - prevCharIsLF = true; - } - else - line += (column = 1); - } - - switch (c) - { - case '\r' : - prevCharIsCR = true; - break; - case '\n' : - prevCharIsLF = true; - break; - case '\t' : - column--; - column += (tabSize - (column % tabSize)); - break; - default : - break; - } - - bufline[bufpos] = line; - bufcolumn[bufpos] = column; + } + + switch (c) + { + case '\r' : + prevCharIsCR = true; + break; + case '\n' : + prevCharIsLF = true; + break; + case '\t' : + column--; + column += (tabSize - (column % tabSize)); + break; + default : + break; + } + + bufline[bufpos] = line; + bufcolumn[bufpos] = column; } +/** Read a character. */ public char readChar() throws java.io.IOException { - if (inBuf > 0) - { - --inBuf; + if (inBuf > 0) + { + --inBuf; - if (++bufpos == bufsize) - bufpos = 0; + if (++bufpos == bufsize) + bufpos = 0; - return buffer[bufpos]; - } + return buffer[bufpos]; + } - if (++bufpos >= maxNextCharInd) - FillBuff(); + if (++bufpos >= maxNextCharInd) + FillBuff(); - char c = buffer[bufpos]; + char c = buffer[bufpos]; - UpdateLineColumn(c); - return (c); + UpdateLineColumn(c); + return c; } + @Deprecated /** - * @deprecated + * @deprecated * @see #getEndColumn */ public int getColumn() { - return bufcolumn[bufpos]; + return bufcolumn[bufpos]; } + @Deprecated /** - * @deprecated + * @deprecated * @see #getEndLine */ public int getLine() { - return bufline[bufpos]; + return bufline[bufpos]; } + /** Get token end column number. */ public int getEndColumn() { - return bufcolumn[bufpos]; + return bufcolumn[bufpos]; } + /** Get token end line number. */ public int getEndLine() { return bufline[bufpos]; } + /** Get token beginning column number. */ public int getBeginColumn() { - return bufcolumn[tokenBegin]; + return bufcolumn[tokenBegin]; } + /** Get token beginning line number. */ public int getBeginLine() { - return bufline[tokenBegin]; + return bufline[tokenBegin]; } +/** Backup a number of characters. */ public void backup(int amount) { inBuf += amount; if ((bufpos -= amount) < 0) - bufpos += bufsize; + bufpos += bufsize; } + /** Constructor. */ public SimpleCharStream(java.io.Reader dstream, int startline, int startcolumn, int buffersize) { @@ -252,16 +263,20 @@ public SimpleCharStream(java.io.Reader dstream, int startline, bufcolumn = new int[buffersize]; } + /** Constructor. */ public SimpleCharStream(java.io.Reader dstream, int startline, int startcolumn) { - this(dstream, startline, startcolumn, 4096); + this(dstream, startline, startcolumn, 4096); } + /** Constructor. */ public SimpleCharStream(java.io.Reader dstream) { - this(dstream, 1, 1, 4096); + this(dstream, 1, 1, 4096); } + + /** Reinitialise. */ public void ReInit(java.io.Reader dstream, int startline, int startcolumn, int buffersize) { @@ -281,111 +296,128 @@ public void ReInit(java.io.Reader dstream, int startline, bufpos = -1; } + /** Reinitialise. */ public void ReInit(java.io.Reader dstream, int startline, int startcolumn) { - ReInit(dstream, startline, startcolumn, 4096); + ReInit(dstream, startline, startcolumn, 4096); } + /** Reinitialise. */ public void ReInit(java.io.Reader dstream) { - ReInit(dstream, 1, 1, 4096); + ReInit(dstream, 1, 1, 4096); } + /** Constructor. */ public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException { - this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); + this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); } + /** Constructor. */ public SimpleCharStream(java.io.InputStream dstream, int startline, int startcolumn, int buffersize) { - this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); + this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); } + /** Constructor. */ public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, int startcolumn) throws java.io.UnsupportedEncodingException { - this(dstream, encoding, startline, startcolumn, 4096); + this(dstream, encoding, startline, startcolumn, 4096); } + /** Constructor. */ public SimpleCharStream(java.io.InputStream dstream, int startline, int startcolumn) { - this(dstream, startline, startcolumn, 4096); + this(dstream, startline, startcolumn, 4096); } + /** Constructor. */ public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException { - this(dstream, encoding, 1, 1, 4096); + this(dstream, encoding, 1, 1, 4096); } + /** Constructor. */ public SimpleCharStream(java.io.InputStream dstream) { - this(dstream, 1, 1, 4096); + this(dstream, 1, 1, 4096); } + /** Reinitialise. */ public void ReInit(java.io.InputStream dstream, String encoding, int startline, int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException { - ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); + ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); } + /** Reinitialise. */ public void ReInit(java.io.InputStream dstream, int startline, int startcolumn, int buffersize) { - ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); + ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); } + /** Reinitialise. */ public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException { - ReInit(dstream, encoding, 1, 1, 4096); + ReInit(dstream, encoding, 1, 1, 4096); } + /** Reinitialise. */ public void ReInit(java.io.InputStream dstream) { - ReInit(dstream, 1, 1, 4096); + ReInit(dstream, 1, 1, 4096); } + /** Reinitialise. */ public void ReInit(java.io.InputStream dstream, String encoding, int startline, int startcolumn) throws java.io.UnsupportedEncodingException { - ReInit(dstream, encoding, startline, startcolumn, 4096); + ReInit(dstream, encoding, startline, startcolumn, 4096); } + /** Reinitialise. */ public void ReInit(java.io.InputStream dstream, int startline, int startcolumn) { - ReInit(dstream, startline, startcolumn, 4096); + ReInit(dstream, startline, startcolumn, 4096); } + /** Get token literal value. */ public String GetImage() { - if (bufpos >= tokenBegin) - return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); - else - return new String(buffer, tokenBegin, bufsize - tokenBegin) + - new String(buffer, 0, bufpos + 1); + if (bufpos >= tokenBegin) + return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); + else + return new String(buffer, tokenBegin, bufsize - tokenBegin) + + new String(buffer, 0, bufpos + 1); } + /** Get the suffix. */ public char[] GetSuffix(int len) { - char[] ret = new char[len]; + char[] ret = new char[len]; - if ((bufpos + 1) >= len) - System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); - else - { - System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, - len - bufpos - 1); - System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); - } + if ((bufpos + 1) >= len) + System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); + else + { + System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, + len - bufpos - 1); + System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); + } - return ret; + return ret; } + /** Reset buffer when finished. */ public void Done() { - buffer = null; - bufline = null; - bufcolumn = null; + buffer = null; + bufline = null; + bufcolumn = null; } /** @@ -393,47 +425,47 @@ public void Done() */ public void adjustBeginLineColumn(int newLine, int newCol) { - int start = tokenBegin; - int len; - - if (bufpos >= tokenBegin) - { - len = bufpos - tokenBegin + inBuf + 1; - } - else - { - len = bufsize - tokenBegin + bufpos + 1 + inBuf; - } - - int i = 0, j = 0, k = 0; - int nextColDiff = 0, columnDiff = 0; - - while (i < len && - bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) - { - bufline[j] = newLine; - nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; - bufcolumn[j] = newCol + columnDiff; - columnDiff = nextColDiff; - i++; - } - - if (i < len) - { - bufline[j] = newLine++; - bufcolumn[j] = newCol + columnDiff; - - while (i++ < len) - { - if (bufline[j = start % bufsize] != bufline[++start % bufsize]) - bufline[j] = newLine++; - else - bufline[j] = newLine; - } - } + int start = tokenBegin; + int len; + + if (bufpos >= tokenBegin) + { + len = bufpos - tokenBegin + inBuf + 1; + } + else + { + len = bufsize - tokenBegin + bufpos + 1 + inBuf; + } + + int i = 0, j = 0, k = 0; + int nextColDiff = 0, columnDiff = 0; + + while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) + { + bufline[j] = newLine; + nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; + bufcolumn[j] = newCol + columnDiff; + columnDiff = nextColDiff; + i++; + } + + if (i < len) + { + bufline[j] = newLine++; + bufcolumn[j] = newCol + columnDiff; + + while (i++ < len) + { + if (bufline[j = start % bufsize] != bufline[++start % bufsize]) + bufline[j] = newLine++; + else + bufline[j] = newLine; + } + } - line = bufline[j]; - column = bufcolumn[j]; + line = bufline[j]; + column = bufcolumn[j]; } } +/* JavaCC - OriginalChecksum=03a78f94841b395dc9164684aab2ea1a (do not edit this line) */ diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/Token.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/Token.java index c541462a0a11e..122c6b3660e12 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/Token.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/Token.java @@ -1,11 +1,19 @@ -/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */ +/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */ +/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ package org.apache.ignite.internal.processors.query.calcite.sql.generated; /** * Describes the input token stream. */ -public class Token { +public class Token implements java.io.Serializable { + + /** + * The version identifier for this Serializable class. + * Increment only if the serialized form of the + * class changes. + */ + private static final long serialVersionUID = 1L; /** * An integer that describes the kind of this token. This numbering @@ -14,12 +22,14 @@ public class Token { */ public int kind; - /** - * beginLine and beginColumn describe the position of the first character - * of this token; endLine and endColumn describe the position of the - * last character of this token. - */ - public int beginLine, beginColumn, endLine, endColumn; + /** The line number of the first character of this Token. */ + public int beginLine; + /** The column number of the first character of this Token. */ + public int beginColumn; + /** The line number of the last character of this Token. */ + public int endLine; + /** The column number of the last character of this Token. */ + public int endColumn; /** * The string image of the token. @@ -50,12 +60,46 @@ public class Token { */ public Token specialToken; + /** + * An optional attribute value of the Token. + * Tokens which are not used as syntactic sugar will often contain + * meaningful values that will be used later on by the compiler or + * interpreter. This attribute value is often different from the image. + * Any subclass of Token that actually wants to return a non-null value can + * override this method as appropriate. + */ + public Object getValue() { + return null; + } + + /** + * No-argument constructor + */ + public Token() {} + + /** + * Constructs a new token for the specified Image. + */ + public Token(int kind) + { + this(kind, null); + } + + /** + * Constructs a new token for the specified Image and Kind. + */ + public Token(int kind, String image) + { + this.kind = kind; + this.image = image; + } + /** * Returns the image. */ public String toString() { - return image; + return image; } /** @@ -63,19 +107,25 @@ public String toString() * can create and return subclass objects based on the value of ofKind. * Simply add the cases to the switch for all those special cases. * For example, if you have a subclass of Token called IDToken that - * you want to create if ofKind is ID, simlpy add something like : + * you want to create if ofKind is ID, simply add something like : * - * case MyParserConstants.ID : return new IDToken(); + * case MyParserConstants.ID : return new IDToken(ofKind, image); * * to the following switch statement. Then you can cast matchedToken - * variable to the appropriate type and use it in your lexical actions. + * variable to the appropriate type and use sit in your lexical actions. */ - public static final Token newToken(int ofKind) + public static Token newToken(int ofKind, String image) + { + switch(ofKind) + { + default : return new Token(ofKind, image); + } + } + + public static Token newToken(int ofKind) { - switch(ofKind) - { - default : return new Token(); - } + return newToken(ofKind, null); } } +/* JavaCC - OriginalChecksum=b1d06cea3c141751bbf19cb898f9de74 (do not edit this line) */ diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/TokenMgrError.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/TokenMgrError.java index e8862d5495877..eb18e1e43e212 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/TokenMgrError.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/TokenMgrError.java @@ -1,133 +1,147 @@ -/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */ +/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */ +/* JavaCCOptions: */ package org.apache.ignite.internal.processors.query.calcite.sql.generated; +/** Token Manager Error. */ public class TokenMgrError extends Error { - /* - * Ordinals for various reasons why an Error of this type can be thrown. - */ - /** - * Lexical error occured. - */ - static final int LEXICAL_ERROR = 0; + /** + * The version identifier for this Serializable class. + * Increment only if the serialized form of the + * class changes. + */ + private static final long serialVersionUID = 1L; - /** - * An attempt wass made to create a second instance of a static token manager. - */ - static final int STATIC_LEXER_ERROR = 1; + /* + * Ordinals for various reasons why an Error of this type can be thrown. + */ - /** - * Tried to change to an invalid lexical state. - */ - static final int INVALID_LEXICAL_STATE = 2; + /** + * Lexical error occurred. + */ + static final int LEXICAL_ERROR = 0; - /** - * Detected (and bailed out of) an infinite loop in the token manager. - */ - static final int LOOP_DETECTED = 3; + /** + * An attempt was made to create a second instance of a static token manager. + */ + static final int STATIC_LEXER_ERROR = 1; - /** - * Indicates the reason why the exception is thrown. It will have - * one of the above 4 values. - */ - int errorCode; + /** + * Tried to change to an invalid lexical state. + */ + static final int INVALID_LEXICAL_STATE = 2; - /** - * Replaces unprintable characters by their espaced (or unicode escaped) - * equivalents in the given string - */ - protected static final String addEscapes(String str) { - StringBuffer retval = new StringBuffer(); - char ch; - for (int i = 0; i < str.length(); i++) { - switch (str.charAt(i)) - { - case 0 : - continue; - case '\b': - retval.append("\\b"); - continue; - case '\t': - retval.append("\\t"); - continue; - case '\n': - retval.append("\\n"); - continue; - case '\f': - retval.append("\\f"); - continue; - case '\r': - retval.append("\\r"); - continue; - case '\"': - retval.append("\\\""); - continue; - case '\'': - retval.append("\\\'"); - continue; - case '\\': - retval.append("\\\\"); - continue; - default: - if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { - String s = "0000" + Integer.toString(ch, 16); - retval.append("\\u" + s.substring(s.length() - 4, s.length())); - } else { - retval.append(ch); - } - continue; - } + /** + * Detected (and bailed out of) an infinite loop in the token manager. + */ + static final int LOOP_DETECTED = 3; + + /** + * Indicates the reason why the exception is thrown. It will have + * one of the above 4 values. + */ + int errorCode; + + /** + * Replaces unprintable characters by their escaped (or unicode escaped) + * equivalents in the given string + */ + protected static final String addEscapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; } - return retval.toString(); - } + } + return retval.toString(); + } - /** - * Returns a detailed message for the Error when it is thrown by the - * token manager to indicate a lexical error. - * Parameters : - * EOFSeen : indicates if EOF caused the lexicl error - * curLexState : lexical state in which this error occured - * errorLine : line number when the error occured - * errorColumn : column number when the error occured - * errorAfter : prefix that was seen before this error occured - * curchar : the offending character - * Note: You can customize the lexical error message by modifying this method. - */ - protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { - return("Lexical error at line " + - errorLine + ", column " + - errorColumn + ". Encountered: " + - (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + - "after : \"" + addEscapes(errorAfter) + "\""); - } + /** + * Returns a detailed message for the Error when it is thrown by the + * token manager to indicate a lexical error. + * Parameters : + * EOFSeen : indicates if EOF caused the lexical error + * curLexState : lexical state in which this error occurred + * errorLine : line number when the error occurred + * errorColumn : column number when the error occurred + * errorAfter : prefix that was seen before this error occurred + * curchar : the offending character + * Note: You can customize the lexical error message by modifying this method. + */ + protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { + return("Lexical error at line " + + errorLine + ", column " + + errorColumn + ". Encountered: " + + (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + + "after : \"" + addEscapes(errorAfter) + "\""); + } - /** - * You can also modify the body of this method to customize your error messages. - * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not - * of end-users concern, so you can return something like : - * - * "Internal Error : Please file a bug report .... " - * - * from this method for such cases in the release version of your parser. - */ - public String getMessage() { - return super.getMessage(); - } + /** + * You can also modify the body of this method to customize your error messages. + * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not + * of end-users concern, so you can return something like : + * + * "Internal Error : Please file a bug report .... " + * + * from this method for such cases in the release version of your parser. + */ + public String getMessage() { + return super.getMessage(); + } - /* - * Constructors of various flavors follow. - */ + /* + * Constructors of various flavors follow. + */ - public TokenMgrError() { - } + /** No arg constructor. */ + public TokenMgrError() { + } - public TokenMgrError(String message, int reason) { - super(message); - errorCode = reason; - } + /** Constructor with message and reason. */ + public TokenMgrError(String message, int reason) { + super(message); + errorCode = reason; + } - public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { - this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); - } + /** Full Constructor. */ + public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { + this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); + } } +/* JavaCC - OriginalChecksum=3a07dcffb6d9deef48a9f20ea779e1bf (do not edit this line) */ diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/trait/TraitUtils.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/trait/TraitUtils.java index ff27c6e41c649..f89fd36531102 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/trait/TraitUtils.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/trait/TraitUtils.java @@ -48,6 +48,7 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.core.Spool; +import org.apache.calcite.rel.core.Window; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexLiteral; @@ -383,6 +384,10 @@ public static RelInput changeTraits(RelInput input, RelTrait... traits) { @Override public List getSearchBounds(String tag) { return ((RelInputEx)input).getSearchBounds(tag); } + + @Override public Window.Group getWindowGroup(String tag) { + return ((RelInputEx)input).getWindowGroup(tag); + } }; } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/type/IgniteTypeSystem.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/type/IgniteTypeSystem.java index 47c53c8c3bcfe..a0500966cf6ec 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/type/IgniteTypeSystem.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/type/IgniteTypeSystem.java @@ -34,13 +34,23 @@ public class IgniteTypeSystem extends RelDataTypeSystemImpl implements Serializa public static final RelDataTypeSystem INSTANCE = new IgniteTypeSystem(); /** {@inheritDoc} */ - @Override public int getMaxNumericScale() { - return Short.MAX_VALUE; + @Override public int getMaxScale(SqlTypeName typeName) { + switch (typeName) { + case DECIMAL: + return Short.MAX_VALUE; + default: + return super.getMaxScale(typeName); + } } /** {@inheritDoc} */ - @Override public int getMaxNumericPrecision() { - return Short.MAX_VALUE; + @Override public int getMaxPrecision(SqlTypeName typeName) { + switch (typeName) { + case DECIMAL: + return Short.MAX_VALUE; + default: + return super.getMaxPrecision(typeName); + } } /** {@inheritDoc} */ diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashJoinExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashJoinExecutionTest.java index 56d650f254c43..d1a1e81c4d4ae 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashJoinExecutionTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/HashJoinExecutionTest.java @@ -22,13 +22,11 @@ import java.util.function.BiPredicate; import java.util.stream.IntStream; import java.util.stream.Stream; -import com.google.common.collect.ImmutableList; +import org.apache.calcite.rel.core.JoinInfo; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.type.RelDataType; -import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.ImmutableIntList; import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; -import org.apache.ignite.internal.processors.query.calcite.rel.IgniteJoinInfo; import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils; import org.apache.ignite.internal.util.typedef.F; @@ -683,8 +681,7 @@ private static HashJoinNode createJoinNode( ? leftType : TypeUtils.combinedRowType(tf, leftType, rightType); - IgniteJoinInfo joinInfo = new IgniteJoinInfo(ImmutableIntList.of(2), ImmutableIntList.of(0), - ImmutableBitSet.of(), ImmutableList.of()); + JoinInfo joinInfo = JoinInfo.of(ImmutableIntList.of(2), ImmutableIntList.of(0)); return HashJoinNode.create(ctx, outType, leftType, rightType, joinType, joinInfo, postCondition); } diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/JoinBuffersExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/JoinBuffersExecutionTest.java index 397fb702f4462..4ff685131cea0 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/JoinBuffersExecutionTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/JoinBuffersExecutionTest.java @@ -25,13 +25,11 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.stream.IntStream; -import com.google.common.collect.ImmutableList; +import org.apache.calcite.rel.core.JoinInfo; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.type.RelDataType; -import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.ImmutableIntList; import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; -import org.apache.ignite.internal.processors.query.calcite.rel.IgniteJoinInfo; import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.testframework.GridTestUtils; @@ -79,8 +77,7 @@ public void testNLJoinBuffers() throws Exception { /** */ @Test public void testHashJoinBuffers() throws Exception { - IgniteJoinInfo joinInfo = new IgniteJoinInfo(ImmutableIntList.of(0), ImmutableIntList.of(0), - ImmutableBitSet.of(), ImmutableList.of()); + JoinInfo joinInfo = JoinInfo.of(ImmutableIntList.of(0), ImmutableIntList.of(0)); JoinFactory joinFactory = (ctx, outType, leftType, rightType, joinType) -> HashJoinNode.create(ctx, outType, leftType, rightType, joinType, joinInfo, null); diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/WindowExecutionTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/WindowExecutionTest.java new file mode 100644 index 0000000000000..bf409bde84b22 --- /dev/null +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/WindowExecutionTest.java @@ -0,0 +1,739 @@ + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.rel; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.UUID; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.apache.calcite.rel.RelCollations; +import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexWindowBound; +import org.apache.calcite.rex.RexWindowBounds; +import org.apache.calcite.rex.RexWindowExclusion; +import org.apache.calcite.sql.SqlAggFunction; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.apache.calcite.util.ImmutableBitSet; +import org.apache.calcite.util.ImmutableIntList; +import org.apache.ignite.internal.processors.query.calcite.exec.ArrayRowHandler; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.IgniteRexBuilder; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.window.WindowFunctions; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.window.WindowPartition; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.window.WindowPartitionFactory; +import org.apache.ignite.internal.processors.query.calcite.sql.fun.IgniteOwnSqlOperatorTable; +import org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils; +import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; +import org.apache.ignite.internal.processors.query.calcite.util.TypeUtils; +import org.apache.ignite.internal.util.typedef.F; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.apache.calcite.rex.RexWindowBounds.CURRENT_ROW; +import static org.apache.calcite.rex.RexWindowBounds.UNBOUNDED_FOLLOWING; +import static org.apache.calcite.rex.RexWindowBounds.UNBOUNDED_PRECEDING; + +/** */ +public class WindowExecutionTest extends AbstractExecutionTest { + /** row_number() over (partition by {0}). */ + @Test + public void testRowNumber() { + checkWindow(rowNumber(), true, + new Object[][] {{1}, {2}, {1}, {2}, {3}, {1}}); + } + + /** dense_rank() over (partition by {0} order by {1}). */ + @Test + public void testDenseRank() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.DENSE_RANK, + relIntType, + F.asList(), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, true, + new Object[][] {{1}, {1}, {1}, {2}, {3}, {1}}); + } + + /** rank() over (partition by {0} order by {1}). */ + @Test + public void testRank() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.RANK, + relIntType, + F.asList(), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, true, + new Object[][] {{1}, {1}, {1}, {2}, {3}, {1}}); + } + + /** percent_rank() over (partition by {0} order by {1}). */ + @Test + public void testRercentRank() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.PERCENT_RANK, + relDoubleType, + F.asList(), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{0.0}, {0.0}, {0.0}, {0.5}, {1.0}, {0.0}}); + } + + /** cume_dist() over (partition by {0} order by {1}). */ + @Test + public void testCumeDist() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.CUME_DIST, + relDoubleType, + F.asList(), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{1.0}, {1.0}, {1.0 / 3}, {2.0 / 3}, {1.0}, {1.0}}); + } + + /** first_value({1}) over (partition by {0} order by {1}). */ + @Test + public void testFirstValue() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.FIRST_VALUE, + relIntType, + F.asList(rexBuilder.makeInputRef(relIntType, 1)), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{1}, {1}, {1}, {1}, {1}, {0}}); + } + + /** last_value({2}) over (partition by {0} order by {1}). */ + @Test + public void testLastValue() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.LAST_VALUE, + relIntType, + F.asList(rexBuilder.makeInputRef(relIntType, 2)), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{5}, {5}, {1}, {5}, {6}, {1}}); + } + + /** ntile({3}) over (partition by {0}). */ + @Test + public void testNTile() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.NTILE, + relIntType, + F.asList(rexBuilder.makeInputRef(relIntType, 3)), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.EMPTY, + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{1}, {2}, {1}, {1}, {2}, {1}}); + } + + /** nth_value({2}, {0}) over (partition by {0}). */ + @Test + public void testNth() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.NTH_VALUE, + typeFactory.createTypeWithNullability(relIntType, true), + F.asList( + rexBuilder.makeInputRef(relIntType, 2), + rexBuilder.makeInputRef(relIntType, 0) + ), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{1}, {1}, {null}, {5}, {5}, {null}}); + } + + /** lag({2}) over (partition by {0} order by {1}). */ + @Test + public void testLag1() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + IgniteOwnSqlOperatorTable.LAG, + typeFactory.createTypeWithNullability(relIntType, true), + F.asList(rexBuilder.makeInputRef(relIntType, 2)), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{null}, {1}, {null}, {1}, {5}, {null}}); + } + + /** lag({2}, {0}) over (partition by {0} order by {1}). */ + @Test + public void testLag2() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + IgniteOwnSqlOperatorTable.LAG, + typeFactory.createTypeWithNullability(relIntType, true), + F.asList( + rexBuilder.makeInputRef(relIntType, 2), + rexBuilder.makeInputRef(relIntType, 0) + ), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{null}, {1}, {null}, {null}, {1}, {null}}); + } + + /** lag({2}, {0}, {1}) over (partition by {0} order by {1}). */ + @Test + public void testLag3() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + IgniteOwnSqlOperatorTable.LAG, + typeFactory.createTypeWithNullability(relIntType, true), + F.asList( + rexBuilder.makeInputRef(relIntType, 2), + rexBuilder.makeInputRef(relIntType, 0), + rexBuilder.makeInputRef(relIntType, 1) + ), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{1}, {1}, {1}, {2}, {1}, {0}}); + } + + /** lead({2}) over (partition by {0} order by {1}). */ + @Test + public void testLead1() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + IgniteOwnSqlOperatorTable.LEAD, + typeFactory.createTypeWithNullability(relIntType, true), + F.asList(rexBuilder.makeInputRef(relIntType, 2)), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{5}, {null}, {5}, {6}, {null}, {null}}); + } + + /** lead({2}, {0}) over (partition by {0} order by {1}). */ + @Test + public void testLead2() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + IgniteOwnSqlOperatorTable.LEAD, + typeFactory.createTypeWithNullability(relIntType, true), + F.asList( + rexBuilder.makeInputRef(relIntType, 2), + rexBuilder.makeInputRef(relIntType, 0) + ), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{5}, {null}, {6}, {null}, {null}, {null}}); + } + + /** lead({2}, {0}, {1}) over (partition by {0} order by {1}). */ + @Test + public void testLead3() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + IgniteOwnSqlOperatorTable.LEAD, + typeFactory.createTypeWithNullability(relIntType, true), + F.asList( + rexBuilder.makeInputRef(relIntType, 2), + rexBuilder.makeInputRef(relIntType, 0), + rexBuilder.makeInputRef(relIntType, 1) + ), + 0, + false, + false + ); + Window.Group grp = new Window.Group( + ImmutableBitSet.of(0), + false, + UNBOUNDED_PRECEDING, + CURRENT_ROW, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + + checkWindow(grp, false, + new Object[][] {{5}, {1}, {6}, {2}, {3}, {0}}); + } + + /** count(*) over (partition by {0} rows between unbounded prescending and current row). */ + @Test + public void testCountRowsBetweenUnboundedPrescendingAndCurrentRow() { + checkWindow(count(true, UNBOUNDED_PRECEDING, CURRENT_ROW), true, + new Object[][] {{1}, {2}, {1}, {2}, {3}, {1}}); + } + + /** count(*) over (partition by {0} rows between unbounded prescending and unbounded following). */ + @Test + public void testCountRowsBetweenUnboundedPrescendingAndUnboundedFollowing() { + checkWindow(count(true, UNBOUNDED_PRECEDING, UNBOUNDED_FOLLOWING), false, + new Object[][] {{2}, {2}, {3}, {3}, {3}, {1}}); + } + + /** count(*) over (partition by {0} order by {1} range between unbounded prescending and current row). */ + @Test + public void testCountRangeBetweenUnboundedPrescendingAndCurrentRow() { + checkWindow(count(false, UNBOUNDED_PRECEDING, CURRENT_ROW), false, + new Object[][] {{2}, {2}, {1}, {2}, {3}, {1}}); + } + + /** count(*) over (partition by {0} order by {1} range between unbounded prescending and unbounded following). */ + @Test + public void testCountRangeBetweenUnboundedPrescendingAndUnboundedFollowing() { + checkWindow(count(false, UNBOUNDED_PRECEDING, UNBOUNDED_FOLLOWING), false, + new Object[][] {{2}, {2}, {3}, {3}, {3}, {1}}); + } + + /** count(*) over (partition by {0} order by {1} range between 2 prescending and 1 following). */ + @Test + public void testCountRangeBetween2PrescendingAnd1Following() { + IgniteRexBuilder rexBuilder = new IgniteRexBuilder(typeFactory); + RexWindowBound lower = RexWindowBounds.preceding(rexBuilder.makeLiteral(2, relIntType)); + RexWindowBound upper = RexWindowBounds.following(rexBuilder.makeLiteral(1, relIntType)); + checkWindow(count(false, lower, upper), false, + new Object[][] {{2}, {2}, {2}, {3}, {3}, {1}}); + } + + /** + * sum({0}) over (partition by {1} rows between unbounded prescending and current row), + * row_number() over (partition by {1} rows between unbounded prescending and current row). + * */ + @Test + public void testSumRowsAndRowNumberToCurrentRow() { + checkWindow(sumRowsAndRowNumber(CURRENT_ROW), true, + new Object[][] {{1, 1}, {2, 2}, {2, 1}, {4, 2}, {6, 3}, {3, 1}}); + } + + /** + * sum({0}) over (partition by {1} rows between unbounded prescending and inbounded following), + * row_number() over (partition by {1} rows between unbounded prescending and inbounded following). + * */ + @Test + public void testSumRowsAndRowNumberToUnboundedFollowing() { + checkWindow(sumRowsAndRowNumber(UNBOUNDED_FOLLOWING), false, + new Object[][] {{2, 1}, {2, 2}, {6, 1}, {6, 2}, {6, 3}, {3, 1}}); + } + + /** row_number() over (partition by {0}). */ + @Test + public void testStreamLargeInput() { + ExecutionContext ctx = executionContext(F.first(nodes()), UUID.randomUUID(), 0); + Object[][] exp = IntStream.range(0, 10000) + .mapToObj(i -> row(i + 1)) + .toArray(Object[][]::new); + + checkWindow(ctx, rowNumber(), true, createSeqInputNode(ctx, 10000), exp); + } + + /** count(*) over (partition by {0} rows between unbounded prescending and unbounded following). */ + @Test + public void testBufLargeInput() { + ExecutionContext ctx = executionContext(F.first(nodes()), UUID.randomUUID(), 0); + Object[][] exp = IntStream.range(0, 10000) + .mapToObj(i -> row(10000)) + .toArray(Object[][]::new); + + checkWindow(ctx, count(true, UNBOUNDED_PRECEDING, UNBOUNDED_FOLLOWING), false, + createSeqInputNode(ctx, 10000), exp); + } + + /** */ + private void checkWindow(Window.Group grp, boolean streaming, Object[][] expRes) { + ExecutionContext ctx = executionContext(F.first(nodes()), UUID.randomUUID(), 0); + Node input = createSmallInputNode(ctx); + checkWindow(ctx, grp, streaming, input, expRes); + } + + /** */ + private void checkWindow( + ExecutionContext ctx, + Window.Group grp, + boolean streaming, + Node input, + Object[][] expRes + ) { + Assert.assertEquals(streaming, WindowFunctions.streamable(grp)); + + WindowNode window = createWindowNode(ctx, grp, input); + + int resFldShift = input.rowType().getFieldCount(); + + try (RootNode root = new RootNode<>(ctx, window.rowType())) { + root.register(window); + + for (int i = 0; i < expRes.length; i++) { + assertTrue(root.hasNext()); + Object[] row = root.next(); + for (int j = 0; j < expRes[i].length; j++) + assertEquals(expRes[i][j], row[resFldShift + j]); + } + assertFalse(root.hasNext()); + } + } + + /** */ + private WindowNode createWindowNode(ExecutionContext ctx, Window.Group grp, Node input) { + Class[] outFields = new Class[input.rowType().getFieldCount() + grp.aggCalls.size()]; + Arrays.fill(outFields, int.class); + RelDataType outRowType = TypeUtils.createRowType(typeFactory, outFields); + + Comparator partCmp = ctx.expressionFactory() + .comparator(TraitUtils.createCollation(grp.keys.asList())); + + List aggCalls = toAggCall(grp); + + Supplier> partitionFactory = + new WindowPartitionFactory<>(ctx, grp, aggCalls, input.rowType()); + + WindowNode window = new WindowNode<>( + ctx, + outRowType, + partCmp, + partitionFactory, + rowFactory() + ); + window.register(input); + return window; + } + + /** */ + private List toAggCall(Window.Group grp) { + List calls = new ArrayList<>(); + for (Window.RexWinAggCall aggCall : grp.aggCalls) { + SqlAggFunction op = (SqlAggFunction)aggCall.op; + ImmutableIntList args = Window.getProjectOrdinals(aggCall.operands); + AggregateCall call = AggregateCall.create( + op, + aggCall.distinct, + false, + aggCall.ignoreNulls, + aggCall.operands, + args, + -1, + null, + RelCollations.EMPTY, + aggCall.type, + null + ); + calls.add(call); + } + return calls; + } + + /** */ + private Node createSmallInputNode(ExecutionContext ctx) { + RelDataType inputRowType = TypeUtils.createRowType(typeFactory, int.class, int.class, int.class, int.class); + List data = F.asList( + row(1, 1, 1, 4), + row(1, 1, 5, 4), + row(2, 1, 1, 2), + row(2, 2, 5, 2), + row(2, 3, 6, 2), + row(3, 0, 1, 1) + ); + return new ScanNode<>(ctx, inputRowType, data); + } + + /** */ + private Node createSeqInputNode(ExecutionContext ctx, int size) { + assert size > 0; + RelDataType inputRowType = TypeUtils.createRowType(typeFactory, int.class); + List data = IntStream.range(0, size).mapToObj(ignored -> row(1)).collect(Collectors.toList()); + return new ScanNode<>(ctx, inputRowType, data); + } + + /** + * @throws Exception If failed. + */ + @Before + @Override public void setup() throws Exception { + nodesCnt = 1; + super.setup(); + } + + /** row_number() over (partition by {0}). */ + private static Window.Group rowNumber() { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.ROW_NUMBER, + relIntType, + F.asList(), + 0, + false, + false + ); + return new Window.Group( + ImmutableBitSet.of(0), + true, + UNBOUNDED_PRECEDING, + UNBOUNDED_FOLLOWING, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.EMPTY, + F.asList(aggCall) + ); + } + + /** + * count({0}) over (partition by {0} rows between [lower] and [upper]) + */ + private static Window.Group count(boolean rows, RexWindowBound lower, RexWindowBound upper) { + Window.RexWinAggCall aggCall = new Window.RexWinAggCall( + SqlStdOperatorTable.COUNT, + relIntType, + F.asList(rexBuilder.makeInputRef(relIntType, 0)), + 0, + false, + false + ); + return new Window.Group( + ImmutableBitSet.of(0), + rows, + lower, + upper, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.of(1), + F.asList(aggCall) + ); + } + + /** + * sum({0}) over (partition by {0} rows between unbounded prescending and [upper]), + * row_number() over (partition by {0} rows between unbounded prescending and [upper]) + */ + private static Window.Group sumRowsAndRowNumber(RexWindowBound upper) { + Window.RexWinAggCall sumCall = new Window.RexWinAggCall( + SqlStdOperatorTable.SUM, + relIntType, + F.asList(rexBuilder.makeInputRef(relIntType, 0)), + 0, + false, + false + ); + Window.RexWinAggCall rowNumberCall = new Window.RexWinAggCall( + SqlStdOperatorTable.ROW_NUMBER, + relIntType, + F.asList(), + 0, + false, + false + ); + return new Window.Group( + ImmutableBitSet.of(0), + true, + UNBOUNDED_PRECEDING, + upper, + RexWindowExclusion.EXCLUDE_NO_OTHER, + RelCollations.EMPTY, + F.asList(sumCall, rowNumberCall) + ); + } + + /** */ + private static final IgniteTypeFactory typeFactory = new IgniteTypeFactory(); + + /** */ + private static final RelDataType relIntType = typeFactory.createType(int.class); + + /** */ + private static final RelDataType relDoubleType = typeFactory.createType(double.class); + + /** */ + private static final RexBuilder rexBuilder = new IgniteRexBuilder(typeFactory); + + /** */ + protected RowHandler.RowFactory rowFactory() { + return new RowHandler.RowFactory<>() { + /** */ + @Override public RowHandler handler() { + return ArrayRowHandler.INSTANCE; + } + + /** */ + @Override public Object[] create() { + throw new AssertionError(); + } + + /** */ + @Override public Object[] create(Object... fields) { + return fields; + } + }; + } +} diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/AggregatesIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/AggregatesIntegrationTest.java index ce9b477b3a731..7b0b9685e47e5 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/AggregatesIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/AggregatesIntegrationTest.java @@ -191,6 +191,14 @@ public void testCountIndexedField() { .returns(1L, null) .check(); + assertQuery("select count(salary) as salary from person group by salary") + .returns(0L) + .returns(1L) + .returns(1L) + .returns(1L) + .returns(1L) + .check(); + for (int i = 0; i < 100; i++) { sql("INSERT INTO tbl VALUES (null, null, ?)", i % 2 == 0 ? i : null); sql("INSERT INTO tbl VALUES (?, ?, ?)", i, i, i % 2 == 0 ? null : i); diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/FunctionsTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/FunctionsTest.java index 90101ce48f5a1..2e52c5a34797a 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/FunctionsTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/FunctionsTest.java @@ -161,12 +161,13 @@ private Iterable> bitwiseParams() { res.add(F.asList("AND", 1, "TINYINT", 1, "INT", 1)); res.add(F.asList("AND", 1, "TINYINT", 1, "SMALLINT", (short)1)); res.add(F.asList("AND", 0, "TINYINT", 0, "TINYINT", (byte)0)); - res.add(F.asList("AND", 1, "TINYINT", 1, "SMALLINT", (short)1)); + res.add(F.asList("AND", 1, "SMALLINT", 1, "TINYINT", (short)1)); res.add(F.asList("AND", 15, null, 7, null, 7)); res.add(F.asList("AND", -1, null, 1, null, 1)); res.add(F.asList("AND", (short)32767, null, 65535, null, 32767)); res.add(F.asList("AND", null, null, 1, null, null)); res.add(F.asList("AND", 1, "SMALLINT", null, null, null)); + res.add(F.asList("AND", 1, null, null, null, null)); // BITOR res.add(F.asList("OR", 1, null, 1.0, null, orErr)); res.add(F.asList("OR", 1.0, null, 1, null, orErr)); @@ -179,7 +180,7 @@ private Iterable> bitwiseParams() { res.add(F.asList("OR", 1, "TINYINT", 1, "INT", 1)); res.add(F.asList("OR", 1, "TINYINT", 1, "SMALLINT", (short)1)); res.add(F.asList("OR", 0, "TINYINT", 0, "TINYINT", (byte)0)); - res.add(F.asList("OR", 1, "TINYINT", 1, "SMALLINT", (short)1)); + res.add(F.asList("OR", 1, "SMALLINT", 1, "TINYINT", (short)1)); res.add(F.asList("OR", 8, null, 7, null, 15)); res.add(F.asList("OR", -1, null, 1, null, -1)); res.add(F.asList("OR", (short)32767, null, 65535, null, 65535)); @@ -198,7 +199,7 @@ private Iterable> bitwiseParams() { res.add(F.asList("XOR", 1, "TINYINT", 1, "INT", 0)); res.add(F.asList("XOR", 1, "TINYINT", 1, "SMALLINT", (short)0)); res.add(F.asList("XOR", 0, "TINYINT", 0, "TINYINT", (byte)0)); - res.add(F.asList("XOR", 1, "TINYINT", 1, "SMALLINT", (short)0)); + res.add(F.asList("XOR", 1, "SMALLINT", 1, "TINYINT", (short)0)); res.add(F.asList("XOR", 8, null, 7, null, 15)); res.add(F.asList("XOR", -1, null, 1, null, -2)); res.add(F.asList("XOR", (short)32767, null, 65535, null, 32768)); diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/IntervalTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/IntervalTest.java index dc8788adfea5c..63b2e816dfd81 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/IntervalTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/IntervalTest.java @@ -150,11 +150,11 @@ public void testIntervalToIntervalCast() { */ @Test public void testDml() { - executeSql("CREATE TABLE test(ym INTERVAL YEAR, dt INTERVAL DAYS)"); - executeSql("INSERT INTO test(ym, dt) VALUES (INTERVAL 1 MONTH, INTERVAL 2 DAYS)"); - executeSql("INSERT INTO test(ym, dt) VALUES (INTERVAL 3 YEARS, INTERVAL 4 HOURS)"); - executeSql("INSERT INTO test(ym, dt) VALUES (INTERVAL '4-5' YEARS TO MONTHS, INTERVAL '6:7' HOURS TO MINUTES)"); - executeSql("INSERT INTO test(ym, dt) VALUES (NULL, NULL)"); + sql("CREATE TABLE test(ym INTERVAL YEAR, dt INTERVAL DAYS)"); + sql("INSERT INTO test(ym, dt) VALUES (INTERVAL 1 MONTH, INTERVAL 2 DAYS)"); + sql("INSERT INTO test(ym, dt) VALUES (INTERVAL 3 YEARS, INTERVAL 4 HOURS)"); + sql("INSERT INTO test(ym, dt) VALUES (INTERVAL '4-5' YEARS TO MONTHS, INTERVAL '6:7' HOURS TO MINUTES)"); + sql("INSERT INTO test(ym, dt) VALUES (NULL, NULL)"); assertThrows("INSERT INTO test(ym, dt) VALUES (INTERVAL 1 DAYS, INTERVAL 1 HOURS)", IgniteSQLException.class, "Cannot assign"); assertThrows("INSERT INTO test(ym, dt) VALUES (INTERVAL 1 YEARS, INTERVAL 1 MONTHS)", @@ -170,13 +170,12 @@ public void testDml() { assertThrows("SELECT * FROM test WHERE ym = INTERVAL 6 DAYS", IgniteSQLException.class, "Cannot apply"); assertThrows("SELECT * FROM test WHERE dt = INTERVAL 6 YEARS", IgniteSQLException.class, "Cannot apply"); - executeSql("UPDATE test SET dt = INTERVAL 3 DAYS WHERE ym = INTERVAL 1 MONTH"); - executeSql("UPDATE test SET ym = INTERVAL 5 YEARS WHERE dt = INTERVAL 4 HOURS"); - executeSql("UPDATE test SET ym = INTERVAL '6-7' YEARS TO MONTHS, dt = INTERVAL '8 9' DAYS TO HOURS " + + sql("UPDATE test SET dt = INTERVAL 3 DAYS WHERE ym = INTERVAL 1 MONTH"); + sql("UPDATE test SET ym = INTERVAL 5 YEARS WHERE dt = INTERVAL 4 HOURS"); + sql("UPDATE test SET ym = INTERVAL '6-7' YEARS TO MONTHS, dt = INTERVAL '8 9' DAYS TO HOURS " + "WHERE ym = INTERVAL '4-5' YEARS TO MONTHS AND dt = INTERVAL '6:7' HOURS TO MINUTES"); - assertThrows("UPDATE test SET dt = INTERVAL 5 YEARS WHERE ym = INTERVAL 1 MONTH", IgniteSQLException.class, - "Cannot assign"); + assertThrowsSqlException("UPDATE test SET dt = INTERVAL 5 YEARS WHERE ym = INTERVAL 1 MONTH", null); assertThrows("UPDATE test SET ym = INTERVAL 8 YEARS WHERE dt = INTERVAL 1 MONTH", IgniteSQLException.class, "Cannot apply"); @@ -191,16 +190,16 @@ public void testDml() { assertThrows("DELETE FROM test WHERE ym = INTERVAL 6 DAYS", IgniteSQLException.class, "Cannot apply"); assertThrows("DELETE FROM test WHERE dt = INTERVAL 6 YEARS", IgniteSQLException.class, "Cannot apply"); - executeSql("DELETE FROM test WHERE ym = INTERVAL 1 MONTH"); - executeSql("DELETE FROM test WHERE dt = INTERVAL 4 HOURS"); - executeSql("DELETE FROM test WHERE ym = INTERVAL '6-7' YEARS TO MONTHS AND dt = INTERVAL '8 9' DAYS TO HOURS"); - executeSql("DELETE FROM test WHERE ym IS NULL AND dt IS NULL"); + sql("DELETE FROM test WHERE ym = INTERVAL 1 MONTH"); + sql("DELETE FROM test WHERE dt = INTERVAL 4 HOURS"); + sql("DELETE FROM test WHERE ym = INTERVAL '6-7' YEARS TO MONTHS AND dt = INTERVAL '8 9' DAYS TO HOURS"); + sql("DELETE FROM test WHERE ym IS NULL AND dt IS NULL"); - assertEquals(0, executeSql("SELECT * FROM test").size()); + assertEquals(0, sql("SELECT * FROM test").size()); - executeSql("ALTER TABLE test ADD (ym2 INTERVAL MONTH, dt2 INTERVAL HOURS)"); + sql("ALTER TABLE test ADD (ym2 INTERVAL MONTH, dt2 INTERVAL HOURS)"); - executeSql("INSERT INTO test(ym, ym2, dt, dt2) VALUES (INTERVAL 1 YEAR, INTERVAL 2 YEARS, " + + sql("INSERT INTO test(ym, ym2, dt, dt2) VALUES (INTERVAL 1 YEAR, INTERVAL 2 YEARS, " + "INTERVAL 1 SECOND, INTERVAL 2 MINUTES)"); assertQuery("SELECT ym, ym2, dt, dt2 FROM test") @@ -395,6 +394,15 @@ public void testExtract() { assertThrows("SELECT EXTRACT(MONTH FROM INTERVAL 1 DAY)", IgniteSQLException.class, "Cannot apply"); } + /** */ + @Test + public void testDmlIntervalArithmetic() { + sql("CREATE TABLE test(ts TIMESTAMP)"); + sql("INSERT INTO test VALUES (?)", Timestamp.valueOf("2021-01-01 00:00:01")); + sql("UPDATE test SET ts = ts - INTERVAL 1 SECOND"); + assertQuery("SELECT * FROM test").returns(Timestamp.valueOf("2021-01-01 00:00:00")).check(); + } + /** */ public Object eval(String exp, Object... params) { return executeSql("SELECT " + exp, params).get(0).get(0); diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/OperatorsExtensionIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/OperatorsExtensionIntegrationTest.java index 53b6d23bcf14f..d08259d0877d6 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/OperatorsExtensionIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/OperatorsExtensionIntegrationTest.java @@ -18,12 +18,18 @@ import java.math.BigDecimal; import java.sql.Timestamp; +import java.util.List; +import java.util.function.Supplier; import com.google.common.collect.ImmutableList; import org.apache.calcite.adapter.enumerable.NullPolicy; import org.apache.calcite.avatica.util.TimeUnitRange; import org.apache.calcite.linq4j.tree.Expressions; +import org.apache.calcite.plan.Contexts; +import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.rex.RexNode; +import org.apache.calcite.sql.SqlAggFunction; import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlFunction; import org.apache.calcite.sql.SqlFunctionCategory; @@ -43,12 +49,19 @@ import org.apache.calcite.tools.FrameworkConfig; import org.apache.calcite.tools.Frameworks; import org.apache.calcite.util.BuiltInMethod; +import org.apache.calcite.util.Optionality; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor; +import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; +import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; import org.apache.ignite.internal.processors.query.calcite.exec.exp.RexImpTable; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.Accumulator; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.AccumulatorFactoryProvider; +import org.apache.ignite.internal.processors.query.calcite.exec.exp.agg.Accumulators; import org.apache.ignite.internal.processors.query.calcite.prepare.IgniteConvertletTable; import org.apache.ignite.internal.processors.query.calcite.prepare.IgniteSqlNodeRewriter; import org.apache.ignite.internal.processors.query.calcite.prepare.IgniteSqlValidator; +import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; import org.apache.ignite.plugin.AbstractTestPluginProvider; import org.apache.ignite.plugin.PluginContext; import org.jetbrains.annotations.Nullable; @@ -75,6 +88,9 @@ public class OperatorsExtensionIntegrationTest extends AbstractBasicIntegrationT .sqlValidatorConfig( ((IgniteSqlValidator.Config)CalciteQueryProcessor.FRAMEWORK_CONFIG.getSqlValidatorConfig()) .withSqlNodeRewriter(new SqlRewriter())) + .context(Contexts.chain( + CalciteQueryProcessor.FRAMEWORK_CONFIG.getContext(), + Contexts.of(new AccumulatorFactoryProviderImpl()))) .build(); return (T)cfg; @@ -134,6 +150,14 @@ public void testOperatorsCallsInViews() { assertQuery("SELECT val_str from my_view").returns(new BigDecimal("0")).check(); } + /** */ + @Test + public void testCustomAggregateFunction() { + assertQuery("SELECT TEST_SUM(x) FROM (VALUES (1), (2), (3)) t(x)") + .returns(6L) + .check(); + } + /** Rewrites LTRIM with 2 parameters. */ public static SqlCall rewriteLtrim(SqlValidator validator, SqlCall call) { if (call.operandCount() != 2) @@ -193,6 +217,9 @@ public static class OperatorTable extends ReflectiveSqlOperatorTable { OperandTypes.STRING_STRING, SqlFunctionCategory.STRING ); + + /** */ + public static final SqlAggFunction TEST_SUM = new SqlTestSumAggFunction(); } /** Extended convertlet table. */ @@ -229,4 +256,73 @@ private static class SqlRewriter implements IgniteSqlNodeRewriter { return node; } } + + /** */ + private static class AccumulatorFactoryProviderImpl implements AccumulatorFactoryProvider { + /** {@inheritDoc} */ + @Override public @Nullable Supplier> factory(AggregateCall call, ExecutionContext ctx) { + if (call.getAggregation().getName().equals(OperatorTable.TEST_SUM.getName())) + return () -> new TestSum<>(call, ctx.rowHandler()); + + return null; + } + } + + /** */ + public static class SqlTestSumAggFunction extends SqlAggFunction { + /** */ + public SqlTestSumAggFunction() { + super( + "TEST_SUM", + null, + SqlKind.SUM, + ReturnTypes.AGG_SUM, + null, + OperandTypes.NUMERIC, + SqlFunctionCategory.NUMERIC, + false, + false, + Optionality.FORBIDDEN + ); + } + } + + /** */ + private static class TestSum extends Accumulators.AbstractAccumulator { + /** */ + private long sum; + + /** */ + protected TestSum(AggregateCall aggCall, RowHandler hnd) { + super(aggCall, hnd); + } + + /** {@inheritDoc} */ + @Override public void add(Row row) { + Number val = get(0, row); + + if (val != null) + sum += val.longValue(); + } + + /** {@inheritDoc} */ + @Override public void apply(Accumulator other) { + sum += ((TestSum)other).sum; + } + + /** {@inheritDoc} */ + @Override public Object end() { + return sum; + } + + /** {@inheritDoc} */ + @Override public List argumentTypes(IgniteTypeFactory typeFactory) { + return List.of(typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.BIGINT), true)); + } + + /** {@inheritDoc} */ + @Override public RelDataType returnType(IgniteTypeFactory typeFactory) { + return typeFactory.createSqlType(org.apache.calcite.sql.type.SqlTypeName.BIGINT); + } + } } diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/StdSqlOperatorsTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/StdSqlOperatorsTest.java index 72d6feaa33544..2f78ee9c6f724 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/StdSqlOperatorsTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/StdSqlOperatorsTest.java @@ -370,6 +370,20 @@ public void testCurrentTimeFunctions() { assertExpression("LOCALTIMESTAMP").check(); } + /** */ + @Test + public void testWindowFunctions() { + assertExpression("ROW_NUMBER() OVER()").returns(1).check(); + assertExpression("DENSE_RANK() OVER(ORDER BY val)").returns(1L).check(); + assertExpression("RANK() OVER(ORDER BY val)").returns(1L).check(); + assertExpression("PERCENT_RANK() OVER(ORDER BY val)").returns(0.0).check(); + assertExpression("CUME_DIST() OVER(ORDER BY val)").returns(1.0).check(); + assertExpression("FIRST_VALUE(val) OVER()").returns(1).check(); + assertExpression("LAST_VALUE(val) OVER()").returns(1).check(); + assertExpression("NTILE(1) OVER(ORDER BY val)").returns(1L).check(); + assertExpression("NTH_VALUE(val, 1) OVER()").returns(1).check(); + } + /** */ private QueryChecker assertExpression(String qry) { // Select expressions from table to test plan serialization containing these expressions. diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/TableDdlIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/TableDdlIntegrationTest.java index 7164c0d8eb15a..a4ace5c795e5f 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/TableDdlIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/TableDdlIntegrationTest.java @@ -562,7 +562,7 @@ public void testInlineSizeMultiKeyWrapParam() { @Test public void createTableUseReservedWord() { assertThrows("create table table (id int primary key, val varchar)", IgniteSQLException.class, - "Failed to parse query. Encountered \"table table\""); + "Failed to parse query. Encountered \" \"TABLE\" \"table \" \"TABLE\" \"table \"\""); sql("create table \"table\" (id int primary key, val varchar)"); diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/WindowIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/WindowIntegrationTest.java new file mode 100644 index 0000000000000..43ff9fa0eb50b --- /dev/null +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/WindowIntegrationTest.java @@ -0,0 +1,213 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.integration; + +import java.math.BigDecimal; +import org.junit.Test; + +/** + * Integration test for WINDOW operator. + */ +public class WindowIntegrationTest extends AbstractBasicIntegrationTransactionalTest { + /** {@inheritDoc} */ + @Override protected void init() throws Exception { + super.init(); + + sql("CREATE TABLE empsalary(depname VARCHAR, empno BIGINT, salary INT, enroll_date DATE, " + + "PRIMARY KEY (depname, empno)) WITH AFFINITY_KEY=depname, " + atomicity()); + sql("INSERT INTO empsalary VALUES " + + "('develop', 10, 5300, '2007-08-01'), " + + "('sales', 1, 5000, '2006-10-01'), " + + "('person', 5, 3500, '2007-12-10'), " + + "('sales', 4, 4900, '2007-08-08'), " + + "('person', 2, 3900, '2006-12-23'), " + + "('develop', 7, 4200, '2008-01-01'), " + + "('develop', 9, 4500, '2008-01-01'), " + + "('sales', 3, 4800, '2007-08-01'), " + + "('develop', 8, 6000, '2006-10-01'), " + + "('develop', 11, 5200, '2007-08-15');"); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() { + // No-op + } + + /** */ + @Test + public void testRowNumber() { + assertQuery("SELECT empno, ROW_NUMBER() OVER (ORDER BY salary) FROM empsalary") + .returns(1L, 7L) + .returns(2L, 2L) + .returns(3L, 5L) + .returns(4L, 6L) + .returns(5L, 1L) + .returns(7L, 3L) + .returns(8L, 10L) + .returns(9L, 4L) + .returns(10L, 9L) + .returns(11L, 8L) + .check(); + } + + /** */ + @Test + public void testCountAllRange() { + assertQuery("SELECT depname, " + + "COUNT(1) OVER (ORDER BY depname RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM empsalary") + .returns("develop", 10L) + .returns("develop", 10L) + .returns("develop", 10L) + .returns("develop", 10L) + .returns("develop", 10L) + .returns("person", 10L) + .returns("person", 10L) + .returns("sales", 10L) + .returns("sales", 10L) + .returns("sales", 10L) + .check(); + } + + /** */ + @Test + public void testCountRangePartitioned() { + assertQuery("SELECT depname, COUNT(1) OVER (PARTITION BY depname) FROM empsalary") + .returns("develop", 5L) + .returns("develop", 5L) + .returns("develop", 5L) + .returns("develop", 5L) + .returns("develop", 5L) + .returns("person", 2L) + .returns("person", 2L) + .returns("sales", 3L) + .returns("sales", 3L) + .returns("sales", 3L) + .check(); + } + + /** */ + @Test + public void testCountRangePartitionedWithIntBounds() { + assertQuery("SELECT depname, " + + "COUNT(1) OVER (PARTITION BY depname ORDER BY empno RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING) FROM empsalary") + .returns("develop", 2L) + .returns("develop", 3L) + .returns("develop", 3L) + .returns("develop", 4L) + .returns("develop", 4L) + .returns("person", 1L) + .returns("person", 1L) + .returns("sales", 1L) + .returns("sales", 2L) + .returns("sales", 3L) + .check(); + } + + /** */ + @Test + public void testCountRangePartitionedWithDateBounds() { + assertQuery("SELECT depname, " + + "COUNT(1) OVER (PARTITION BY depname ORDER BY enroll_date " + + "RANGE BETWEEN INTERVAL 730 DAYS PRECEDING AND INTERVAL 360 DAYS FOLLOWING) FROM empsalary") + .returns("develop", 3L) + .returns("develop", 5L) + .returns("develop", 5L) + .returns("develop", 5L) + .returns("develop", 5L) + .returns("person", 2L) + .returns("person", 2L) + .returns("sales", 3L) + .returns("sales", 3L) + .returns("sales", 3L) + .check(); + } + + /** */ + @Test + public void testCountRowsPartitioned() { + assertQuery("SELECT depname, " + + "COUNT(1) OVER (PARTITION BY depname ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM empsalary") + .returns("develop", 1L) + .returns("develop", 2L) + .returns("develop", 3L) + .returns("develop", 4L) + .returns("develop", 5L) + .returns("person", 1L) + .returns("person", 2L) + .returns("sales", 1L) + .returns("sales", 2L) + .returns("sales", 3L) + .check(); + } + + /** */ + @Test + public void testCountRowsPartitionedWithBounds() { + assertQuery("SELECT depname, " + + "COUNT(1) OVER (PARTITION BY depname ORDER BY empno ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING) FROM empsalary") + .returns("develop", 2L) + .returns("develop", 3L) + .returns("develop", 4L) + .returns("develop", 4L) + .returns("develop", 3L) + .returns("person", 2L) + .returns("person", 2L) + .returns("sales", 2L) + .returns("sales", 3L) + .returns("sales", 3L) + .check(); + } + + /** */ + @Test + public void testCorrelation() { + assertQuery("SELECT depname, (SELECT ROW_NUMBER() OVER (ORDER BY depname)) FROM empsalary") + .returns("develop", 1L) + .returns("develop", 1L) + .returns("develop", 1L) + .returns("develop", 1L) + .returns("develop", 1L) + .returns("person", 1L) + .returns("person", 1L) + .returns("sales", 1L) + .returns("sales", 1L) + .returns("sales", 1L) + .check(); + } + + /** */ + @Test + public void testAggregateWithWindowFunction() { + assertQuery("SELECT depname, COUNT(*), SUM(SUM(salary)) OVER (PARTITION BY depname) FROM empsalary GROUP BY depname") + .returns("develop", 5L, BigDecimal.valueOf(25200)) + .returns("person", 2L, BigDecimal.valueOf(7400)) + .returns("sales", 3L, BigDecimal.valueOf(14700)) + .check(); + } + + /** Test Ignite custom lead/lag functions. */ + @Test + public void testLeadLagFunctions() { + assertQuery("SELECT LEAD(empno) OVER() FROM empsalary WHERE empno = 1").returns(NULL_RESULT).check(); + assertQuery("SELECT LEAD(empno, 2) OVER() FROM empsalary WHERE empno = 1").returns(NULL_RESULT).check(); + assertQuery("SELECT LEAD(empno, 3, 0) OVER() FROM empsalary WHERE empno = 1").returns(0L).check(); + assertQuery("SELECT LAG(empno) OVER() FROM empsalary WHERE empno = 1").returns(NULL_RESULT).check(); + assertQuery("SELECT LAG(empno, 2) OVER() FROM empsalary WHERE empno = 1").returns(NULL_RESULT).check(); + assertQuery("SELECT LAG(empno, 3, 0) OVER() FROM empsalary WHERE empno = 1").returns(0L).check(); + } +} diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/CorrelatedSubqueryPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/CorrelatedSubqueryPlannerTest.java index 97e6a4debbb70..202bdef4aa0cf 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/CorrelatedSubqueryPlannerTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/CorrelatedSubqueryPlannerTest.java @@ -253,12 +253,10 @@ public void testCorrelatesCollisionsMixed() throws Exception { List correlates = findNodes(rel, byClass(LogicalCorrelate.class)); - assertEquals(4, correlates.size()); + assertEquals(2, correlates.size()); // There are collisions by correlation id. assertEquals(correlates.get(0).getCorrelationId(), correlates.get(1).getCorrelationId()); - assertEquals(correlates.get(0).getCorrelationId(), correlates.get(2).getCorrelationId()); - assertEquals(correlates.get(0).getCorrelationId(), correlates.get(3).getCorrelationId()); rel = planner.replaceCorrelatesCollisions(rel); diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/DataTypesPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/DataTypesPlannerTest.java index 22af50db1e0ed..140665b4ca4ce 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/DataTypesPlannerTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/DataTypesPlannerTest.java @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.List; +import java.util.UUID; import java.util.function.Predicate; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.SetOp; @@ -127,4 +128,15 @@ public void testSetOpNullableDateCast() throws Exception { assertPlan("SELECT NULL::DATE UNION ALL SELECT TIMESTAMP '2025-07-04 10:00:00'", createSchema(), rel -> rel.fieldIsNullable(0)); } + + /** */ + @Test + public void testLiteralToUuidConversion() throws Exception { + IgniteSchema schema = createSchema(createTable("T", IgniteDistributions.single(), "UID", SqlTypeName.UUID)); + + UUID uuid1 = UUID.randomUUID(); + UUID uuid2 = UUID.randomUUID(); + + assertPlan("SELECT * FROM t WHERE uid in ('" + uuid1 + "', '" + uuid2 + "')", schema, isTableScan("T")); + } } diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/HashIndexSpoolPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/HashIndexSpoolPlannerTest.java index d83844f183bb2..44b05e243358b 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/HashIndexSpoolPlannerTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/HashIndexSpoolPlannerTest.java @@ -22,6 +22,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rex.RexFieldAccess; import org.apache.calcite.rex.RexNode; +import org.apache.calcite.sql.type.SqlTypeName; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteHashIndexSpool; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteRel; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteTableScan; @@ -234,7 +235,7 @@ public void testSourceWithoutCollation() throws Exception { */ @Test public void testCorrelatedFilterSplit() throws Exception { - TestTable tbl = createTable("TBL", IgniteDistributions.random(), "ID", Integer.class); + TestTable tbl = createTable("TBL", IgniteDistributions.random(), "ID", SqlTypeName.INTEGER); IgniteSchema publicSchema = createSchema(tbl); String sql = "SELECT (SELECT id FROM tbl AS t2 WHERE t2.id < 50 AND t2.id = t1.id) FROM tbl AS t1"; diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/WindowPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/WindowPlannerTest.java new file mode 100644 index 0000000000000..c38512955f032 --- /dev/null +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/WindowPlannerTest.java @@ -0,0 +1,471 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.planner; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; +import org.apache.calcite.rel.RelCollation; +import org.apache.calcite.rel.RelCollations; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.Window; +import org.apache.calcite.rex.RexLiteral; +import org.apache.calcite.rex.RexWindowBound; +import org.apache.calcite.sql.SqlAggFunction; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.apache.calcite.sql.type.SqlTypeName; +import org.apache.calcite.util.ImmutableBitSet; +import org.apache.calcite.util.ImmutableIntList; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteCorrelatedNestedLoopJoin; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteExchange; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteProject; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteSort; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteWindow; +import org.apache.ignite.internal.processors.query.calcite.rel.agg.IgniteColocatedAggregateBase; +import org.apache.ignite.internal.processors.query.calcite.schema.IgniteSchema; +import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistribution; +import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions; +import org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils; +import org.apache.ignite.internal.processors.query.calcite.util.Commons; +import org.apache.ignite.internal.util.typedef.F; +import org.jetbrains.annotations.Nullable; +import org.junit.Test; + +import static java.util.function.Predicate.not; +import static org.apache.calcite.rex.RexWindowBounds.CURRENT_ROW; +import static org.apache.calcite.rex.RexWindowBounds.UNBOUNDED_FOLLOWING; +import static org.apache.calcite.rex.RexWindowBounds.UNBOUNDED_PRECEDING; + +/** */ +public class WindowPlannerTest extends AbstractPlannerTest { + /** + * @throws Exception if failed + */ + @Test + public void testSplitWindowRelsByGroup() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.single(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER, + "C", SqlTypeName.INTEGER, "D", SqlTypeName.INTEGER) + ); + + String sql = "SELECT " + + "SUM(d) OVER (PARTITION BY a, b ORDER BY c, d), " + + "ROW_NUMBER() OVER (), " + + "MIN(a) OVER (PARTITION BY a, b ORDER BY c, d), " + + "MAX(a) OVER (PARTITION BY a, b ORDER BY c, d RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)" + + "FROM TBL"; + assertPlan(sql, schema, + nodeOrAnyChild(isInstanceOf(IgniteWindow.class) + .and(isWindow(F.asList(0, 1), F.asList(0, 1, 2, 3), CURRENT_ROW, UNBOUNDED_FOLLOWING, + SqlStdOperatorTable.MAX))) + .and(nodeOrAnyChild(isInstanceOf(IgniteWindow.class) + .and(IgniteWindow::isStreaming) + .and(isWindow(F.asList(), F.asList(0, 1, 2, 3), UNBOUNDED_PRECEDING, CURRENT_ROW, SqlStdOperatorTable.ROW_NUMBER)))) + .and(nodeOrAnyChild(isInstanceOf(IgniteWindow.class) + .and(not(IgniteWindow::isStreaming)) + .and(isWindow(F.asList(0, 1), F.asList(0, 1, 2, 3), UNBOUNDED_PRECEDING, CURRENT_ROW, + SqlStdOperatorTable.COUNT, SqlStdOperatorTable.SUM, SqlStdOperatorTable.MIN))))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testMergeWindowRelsByGroup() throws Exception { + // Different agg calls but with the same window definition. + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.single(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER) + ); + + String sql = "SELECT " + + "SUM(a) OVER (PARTITION BY a ORDER BY b ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING), " + + "MIN(b) OVER (PARTITION BY a ORDER BY b ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) " + + "FROM TBL"; + assertPlan(sql, schema, + hasChildThat(isInstanceOf(IgniteWindow.class) + .and(hasChildThat(isInstanceOf(IgniteWindow.class)).negate()))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testProjectWindowConstantsUsedInAggCalls() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.single(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER) + ); + + String sql = "SELECT a, b, " + + "MAX(2) OVER (PARTITION BY a ORDER BY b ROWS BETWEEN 10 PRECEDING AND 20 FOLLOWING) " + + "FROM TBL"; + assertPlan(sql, schema, + isInstanceOf(IgniteProject.class) + // The top project should remove constants from the window rel on position 2..4. + .and(project -> "[$0, $1, $3]".equals(project.getProjects().toString())) + .and(input(isInstanceOf(IgniteWindow.class) + .and(it -> it.getGroup().lowerBound.getOffset() instanceof RexLiteral + && it.getGroup().upperBound.getOffset() instanceof RexLiteral) + .and(hasChildThat(isInstanceOf(IgniteProject.class) + // The bottom project should add agg call constants from the window rel on position 2..4. + .and(project -> "[$0, $1, 2]".equals(project.getProjects().toString())))))), + "ProjectTableScanMergeRule", "ProjectTableScanMergeSkipCorrelatedRule", "ProjectMergeRule", "ProjectWindowTransposeRule"); + } + + /** + * @throws Exception if failed + */ + @Test + public void testProjectWindowConstantsUnusedInAggCalls() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.single(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER) + ); + + String sql = "SELECT a, b, " + + "MAX(a) OVER (PARTITION BY a ORDER BY b ROWS BETWEEN 10 PRECEDING AND 20 FOLLOWING) " + + "FROM TBL"; + assertPlan(sql, schema, + isInstanceOf(IgniteWindow.class) + .and(it -> it.getGroup().lowerBound.getOffset() instanceof RexLiteral + && it.getGroup().upperBound.getOffset() instanceof RexLiteral) + .and(not(hasChildThat(isInstanceOf(IgniteProject.class)))), + "ProjectTableScanMergeRule", "ProjectMergeRule", "ProjectWindowTransposeRule"); + } + + /** + * @throws Exception if failed + */ + @Test + public void testPassThroughOrderByWithWindow() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.random(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER, "C", SqlTypeName.INTEGER) + ); + + RelCollation derivedCollation = RelCollations.of( + TraitUtils.createFieldCollation(0, false), + TraitUtils.createFieldCollation(1, true) + ); + + Function> chk = collation -> + nodeOrAnyChild(isInstanceOf(IgniteSort.class).negate()) + .and(hasChildThat(isInstanceOf(IgniteWindow.class) + .and(window -> window.collation().equals(collation)) + .and(input(isInstanceOf(IgniteExchange.class) + .and(exchange -> exchange.collation().equals(collation)))))); + + String sql = "SELECT MAX(c) OVER (PARTITION BY a ORDER BY b) FROM tbl ORDER BY a DESC, b"; + assertPlan(sql, schema, chk.apply(derivedCollation)); + + sql = "SELECT MAX(c) OVER (PARTITION BY a ORDER BY b) FROM tbl ORDER BY a DESC"; + assertPlan(sql, schema, chk.apply(derivedCollation)); + + sql = "SELECT MAX(c) OVER (PARTITION BY a ORDER BY b) FROM tbl ORDER BY a DESC, b, c"; + derivedCollation = RelCollations.of( + TraitUtils.createFieldCollation(0, false), + TraitUtils.createFieldCollation(1, true), + TraitUtils.createFieldCollation(2, true) + ); + assertPlan(sql, schema, chk.apply(derivedCollation)); + } + + /** + * @throws Exception if failed + */ + @Test + public void testNotPassThroughOrderByWithWindow() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.random(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER, "C", SqlTypeName.INTEGER) + ); + + RelCollation windowCollation = RelCollations.of( + TraitUtils.createFieldCollation(0, true), + TraitUtils.createFieldCollation(1, false) + ); + + Predicate predicate = nodeOrAnyChild(isInstanceOf(IgniteSort.class) + .and(not(sort -> sort.collation().equals(windowCollation))) + .and(hasChildThat(isInstanceOf(IgniteWindow.class) + .and(window -> window.collation().equals(windowCollation)) + .and(hasChildThat(isInstanceOf(IgniteSort.class) + .and(sort -> sort.collation().equals(windowCollation))))))); + + String sql = "SELECT MAX(b) OVER (PARTITION BY a ORDER BY b DESC) FROM tbl ORDER BY a, c, b DESC"; + assertPlan(sql, schema, predicate); + + sql = "SELECT MAX(b) OVER (PARTITION BY a ORDER BY b DESC) FROM tbl ORDER BY a, c"; + assertPlan(sql, schema, predicate); + + sql = "SELECT MAX(b) OVER (PARTITION BY a ORDER BY b DESC) FROM tbl ORDER BY a, b"; + assertPlan(sql, schema, predicate); + } + + /** + * @throws Exception if failed + */ + @Test + public void testHashTableDistributionAndWindow() throws Exception { + IgniteDistribution hash = IgniteDistributions.hash(ImmutableIntList.of(0)); + + RelCollation collation = RelCollations.of( + TraitUtils.createFieldCollation(1, false), + TraitUtils.createFieldCollation(0, false) + ); + + IgniteSchema schema = createSchema( + createTable("TBL", hash, + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER) + .addIndex(collation, "TBL_IDX") + ); + + checkDistributionAndCollationDeriviation(schema, hash, collation); + } + + /** + * @throws Exception if failed + */ + @Test + public void testAffinityTableDistributionAndWindow() throws Exception { + IgniteDistribution aff = IgniteDistributions.affinity(0, "affinity_tbl", "hash"); + + RelCollation collation = RelCollations.of( + TraitUtils.createFieldCollation(1, false), + TraitUtils.createFieldCollation(0, false) + ); + + IgniteSchema schema = createSchema( + createTable("TBL", aff, + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER) + .addIndex(collation, "TBL_IDX") + ); + + checkDistributionAndCollationDeriviation(schema, aff, collation); + } + + /** */ + private void checkDistributionAndCollationDeriviation(IgniteSchema schema, IgniteDistribution dist, + RelCollation collation) throws Exception { + // Both collation and distribution derivation. + String sql = "SELECT FIRST_VALUE(b) OVER (PARTITION BY a, b) FROM tbl"; + assertPlan(sql, schema, isInstanceOf(IgniteExchange.class) + .and(hasChildThat(isInstanceOf(IgniteWindow.class) + .and(hasDistribution(dist)) + .and(window -> window.collation().equals(collation)) + .and(hasChildThat(isIndexScan("TBL", "TBL_IDX")))))); + + // Collation only deriviation. + sql = "SELECT FIRST_VALUE(b) OVER (PARTITION BY b ORDER BY a DESC) FROM tbl"; + assertPlan(sql, schema, nodeOrAnyChild(isInstanceOf(IgniteWindow.class) + .and(window -> window.collation().equals(collation)) + .and(hasChildThat(isInstanceOf(IgniteExchange.class))))); + + // Distribution only deriviation. + sql = "SELECT FIRST_VALUE(b) OVER (PARTITION BY a ORDER BY a DESC) FROM tbl"; + assertPlan(sql, schema, isInstanceOf(IgniteExchange.class) + .and(hasChildThat(isInstanceOf(IgniteWindow.class)) + .and(hasChildThat(isInstanceOf(IgniteSort.class))))); + + // None deriviation. + sql = "SELECT FIRST_VALUE(b) OVER (PARTITION BY b ORDER BY a) FROM tbl"; + assertPlan(sql, schema, nodeOrAnyChild(isInstanceOf(IgniteWindow.class) + .and(hasChildThat(isInstanceOf(IgniteExchange.class))) + .and(hasChildThat(isInstanceOf(IgniteSort.class))))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testHashTableAndWindowWithAnotherDistribution() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.hash(ImmutableIntList.of(0)), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER) + ); + + String sql = "SELECT FIRST_VALUE(a) OVER (PARTITION BY b) FROM tbl"; + assertPlan(sql, schema, hasChildThat(isInstanceOf(IgniteWindow.class) + .and(hasDistribution(IgniteDistributions.single()))) + .and(hasChildThat(isInstanceOf(IgniteExchange.class)))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testIndexedTableAndWindow() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.single(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER, "C", SqlTypeName.INTEGER) + .addIndex("TBL_IDX", 1, 0, 2) + ); + + // Should derive collation (can use index scan). + String sql = "SELECT row_number() OVER (PARTITION BY a, b ORDER BY c) FROM tbl"; + assertPlan(sql, schema, nodeOrAnyChild(isInstanceOf(IgniteWindow.class) + .and(input(isIndexScan("TBL", "TBL_IDX"))))); + + // Should not derive collation (cannot use index scan). + sql = "SELECT row_number() OVER (PARTITION BY a, c) FROM tbl"; + assertPlan(sql, schema, nodeOrAnyChild(isInstanceOf(IgniteWindow.class) + .and(input(isIndexScan("TBL", "TBL_IDX")).negate()))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testIndexedAffinityTableAndWindow() throws Exception { + IgniteDistribution aff = IgniteDistributions.affinity(0, "tbl", "hash"); + RelCollation collation = TraitUtils.createCollation(F.asList(0, 1, 2)); + + IgniteSchema schema = createSchema( + createTable("TBL", aff, + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER, "C", SqlTypeName.INTEGER) + .addIndex(collation, "TBL_IDX") + ); + + // Affinity distribution and index collation deriviation. + // Table index cover more columns than partition/order by, + // table index has different directions than partition fields. + String sql = "SELECT MAX(c) OVER (PARTITION BY a ORDER BY b) FROM (SELECT * FROM tbl) S"; + assertPlan(sql, schema, isInstanceOf(IgniteExchange.class) + .and(input(hasChildThat(isInstanceOf(IgniteWindow.class) + .and(it -> it.collation().equals(collation)) + .and(hasDistribution(aff)) + .and(input(isIndexScan("TBL", "TBL_IDX"))))))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testCorrelatedSubqueryWithWindow() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.single(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER) + ); + + String sql = "SELECT a, (SELECT row_number() OVER (ORDER BY a)) FROM tbl ORDER BY a"; + + assertPlan(sql, schema, nodeOrAnyChild(isInstanceOf(IgniteCorrelatedNestedLoopJoin.class) + .and(input(0, nodeOrAnyChild(isTableScan("TBL")))) + .and(input(1, nodeOrAnyChild(isInstanceOf(IgniteWindow.class)))))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testPassThroughCollationWiderThanInputRow() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.single(), + "A", SqlTypeName.INTEGER, "B", SqlTypeName.INTEGER) + ); + + String sql = "SELECT a, b, row_number() OVER (ORDER BY a) FROM tbl ORDER BY 1, 3, 2"; + + RelCollation sortCollation = TraitUtils.createCollation(F.asList(0, 2, 1)); + RelCollation windowCollation = TraitUtils.createCollation(F.asList(0)); + + assertPlan(sql, schema, nodeOrAnyChild(isInstanceOf(IgniteSort.class) + .and(it -> it.collation().equals(sortCollation)) + .and(input(isInstanceOf(IgniteWindow.class) + .and(it -> it.collation().equals(windowCollation)) + .and(input(nodeOrAnyChild(isInstanceOf(IgniteSort.class) + .and(it -> it.collation().equals(windowCollation))))))))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testConstantsInPartitionByAndOrderBy() throws Exception { + IgniteSchema schema = createSchema( + createTable("TBL", IgniteDistributions.single(), + "A", SqlTypeName.INTEGER) + ); + + String sql = "SELECT MAX(a) OVER (PARTITION BY 1 ORDER BY 2) FROM tbl"; + + assertPlan(sql, schema, nodeOrAnyChild(isInstanceOf(IgniteWindow.class) + .and(it -> it.getGroup().keys.isEmpty() + && it.collation().getKeys().isEmpty()) + .and(not(input(nodeOrAnyChild(isInstanceOf(IgniteProject.class))))))); + } + + /** + * @throws Exception if failed + */ + @Test + public void testCorrelatedDistribution() throws Exception { + IgniteSchema schema = createSchema( + createTable("TA1", IgniteDistributions.affinity(0, "cache1", "hash"), + "A", Integer.class, "B", Integer.class, "C", Integer.class), + createTable("TA2", IgniteDistributions.affinity(1, "cache2", "hash"), + "A", Integer.class, "B", Integer.class, "C", Integer.class), + // TODO: https://issues.apache.org/jira/browse/IGNITE-28881 + // Test need to pass also without additional indexes. + createTable("TH1", IgniteDistributions.hash(Arrays.asList(0, 1)), + "A", Integer.class, "B", Integer.class, "C", Integer.class) + .addIndex("TH1_IDX", 0, 1), + createTable("TH2", IgniteDistributions.hash(Arrays.asList(1, 2)), + "A", Integer.class, "B", Integer.class, "C", Integer.class) + .addIndex("TH2_IDX", 0, 1) + ); + + Predicate colocatedPredicate = nodeOrAnyChild(isInstanceOf(IgniteColocatedAggregateBase.class) + .and(hasChildThat(isInstanceOf(IgniteExchange.class)).negate()) + .and(hasChildThat(isInstanceOf(IgniteWindow.class)) + .and(window -> TraitUtils.correlation(window).correlated()))); + + // Affinity distribution and window with one correlated variable. + String sql = "SELECT a FROM ta1 WHERE EXISTS (SELECT s.a FROM ( " + + "SELECT a, ROW_NUMBER() OVER ( PARTITION BY ta1.a ORDER BY ta2.b ) rn " + + "FROM ta2 WHERE ta2.b = ta1.a) s WHERE rn > 1 )"; + assertPlan(sql, schema, colocatedPredicate); + + // Hash distribution on two columns and window without correlated variables. + sql = "SELECT a FROM th1 WHERE EXISTS (SELECT s.a FROM ( " + + "SELECT a, ROW_NUMBER() OVER ( PARTITION BY th2.a ORDER BY th2.b ) rn " + + "FROM th2 WHERE th2.b = th1.a AND th2.c = th1.b) s WHERE rn > 1 )"; + assertPlan(sql, schema, colocatedPredicate); + + // Hash distribution on two columns and window with two correlated variables. + sql = "SELECT a FROM th1 WHERE EXISTS (SELECT s.a FROM ( " + + "SELECT a, ROW_NUMBER() OVER ( PARTITION BY th1.a ORDER BY th1.b ) rn " + + "FROM th2 WHERE th2.b = th1.a AND th2.c = th1.b) s WHERE rn > 1 )"; + assertPlan(sql, schema, colocatedPredicate); + } + + /** */ + private Predicate isWindow(List keys, @Nullable List collation, + RexWindowBound lower, RexWindowBound upper, SqlAggFunction... functions) { + return isInstanceOf(IgniteWindow.class) + .and(window -> ImmutableBitSet.of(keys).equals(window.getGroup().keys)) + .and(window -> TraitUtils.createCollation(collation).equals(window.collation())) + .and(window -> lower.equals(window.getGroup().lowerBound)) + .and(window -> upper.equals(window.getGroup().upperBound)) + .and(window -> F.asList(functions).equals( + Commons.transform(window.getGroup().aggCalls, Window.RexWinAggCall::getOperator))); + } +} diff --git a/modules/calcite/src/test/java/org/apache/ignite/testsuites/ExecutionTestSuite.java b/modules/calcite/src/test/java/org/apache/ignite/testsuites/ExecutionTestSuite.java index 728c2e8f0f105..6b01981684987 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/testsuites/ExecutionTestSuite.java +++ b/modules/calcite/src/test/java/org/apache/ignite/testsuites/ExecutionTestSuite.java @@ -36,6 +36,7 @@ import org.apache.ignite.internal.processors.query.calcite.exec.rel.TableSpoolExecutionTest; import org.apache.ignite.internal.processors.query.calcite.exec.rel.TimeCalculationExecutionTest; import org.apache.ignite.internal.processors.query.calcite.exec.rel.UncollectExecutionTest; +import org.apache.ignite.internal.processors.query.calcite.exec.rel.WindowExecutionTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -63,6 +64,7 @@ TimeCalculationExecutionTest.class, UncollectExecutionTest.class, ScanTableRowExecutionTest.class, + WindowExecutionTest.class, }) public class ExecutionTestSuite { } diff --git a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java index f4e123c6a7c40..b965adf193dc1 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java +++ b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java @@ -86,6 +86,7 @@ import org.apache.ignite.internal.processors.query.calcite.integration.UserDefinedFunctionsIntegrationTransactionalTest; import org.apache.ignite.internal.processors.query.calcite.integration.UserDefinedTxAwareFunctionsIntegrationTest; import org.apache.ignite.internal.processors.query.calcite.integration.ViewsIntegrationTest; +import org.apache.ignite.internal.processors.query.calcite.integration.WindowIntegrationTest; import org.apache.ignite.internal.processors.query.calcite.integration.tpch.TpchScale001Test; import org.apache.ignite.internal.processors.query.calcite.integration.tpch.TpchScale010Test; import org.apache.ignite.internal.processors.query.calcite.integration.tpch.TpchScale100Test; @@ -183,6 +184,7 @@ CacheWithInterceptorIntegrationTest.class, TxThreadLockingTest.class, SelectByKeyFieldTest.class, + WindowIntegrationTest.class, }) public class IntegrationTestSuite { } diff --git a/modules/calcite/src/test/java/org/apache/ignite/testsuites/PlannerTestSuite.java b/modules/calcite/src/test/java/org/apache/ignite/testsuites/PlannerTestSuite.java index c9efde09f373d..7daf90205ddda 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/testsuites/PlannerTestSuite.java +++ b/modules/calcite/src/test/java/org/apache/ignite/testsuites/PlannerTestSuite.java @@ -50,6 +50,7 @@ import org.apache.ignite.internal.processors.query.calcite.planner.UncollectPlannerTest; import org.apache.ignite.internal.processors.query.calcite.planner.UnionPlannerTest; import org.apache.ignite.internal.processors.query.calcite.planner.UserDefinedViewsPlannerTest; +import org.apache.ignite.internal.processors.query.calcite.planner.WindowPlannerTest; import org.apache.ignite.internal.processors.query.calcite.planner.hints.HintsTestSuite; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -91,6 +92,7 @@ RexSimplificationPlannerTest.class, SerializationPlannerTest.class, UncollectPlannerTest.class, + WindowPlannerTest.class, AbstractPlannerUtilityTest.class, HintsTestSuite.class, diff --git a/modules/calcite/src/test/sql/aggregate/group/test_group_by.test b/modules/calcite/src/test/sql/aggregate/group/test_group_by.test index 56ffeccd35525..c6b9948aa03cd 100644 --- a/modules/calcite/src/test/sql/aggregate/group/test_group_by.test +++ b/modules/calcite/src/test/sql/aggregate/group/test_group_by.test @@ -137,7 +137,8 @@ SELECT 1 AS i, SUM(t.i) FROM integers t GROUP BY t.i ORDER BY 2; query IR SELECT 1 AS i, SUM(i) FROM integers GROUP BY i ORDER BY 2; ---- -1 8.000000 +1 2.000000 +1 6.000000 # refer to the same alias twice query IR diff --git a/modules/calcite/src/test/sql/subquery/scalar/test_complex_correlated_subquery.test b/modules/calcite/src/test/sql/subquery/scalar/test_complex_correlated_subquery.test index 5589b45a639ab..824a673ae201f 100644 --- a/modules/calcite/src/test/sql/subquery/scalar/test_complex_correlated_subquery.test +++ b/modules/calcite/src/test/sql/subquery/scalar/test_complex_correlated_subquery.test @@ -68,8 +68,8 @@ SELECT i, (SELECT SUM(s1.i) FROM integers s1 FULL OUTER JOIN integers s2 ON s1.i # REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3})); # REQUIRE(CHECK_COLUMN(result, 1, {6, 6, 9, 12})); -# correlated expression inside window function not supported -statement error +# correlated expression inside window function supported +statement ok SELECT i, (SELECT row_number() OVER (ORDER BY i)) FROM integers i1 ORDER BY i; # union with correlated expression diff --git a/modules/calcite/src/test/sql/subquery/scalar/test_window_function_subquery.test_ignore b/modules/calcite/src/test/sql/subquery/scalar/test_window_function_subquery.test similarity index 95% rename from modules/calcite/src/test/sql/subquery/scalar/test_window_function_subquery.test_ignore rename to modules/calcite/src/test/sql/subquery/scalar/test_window_function_subquery.test index a9b99f27aa0b6..0f1c670c3b184 100644 --- a/modules/calcite/src/test/sql/subquery/scalar/test_window_function_subquery.test_ignore +++ b/modules/calcite/src/test/sql/subquery/scalar/test_window_function_subquery.test @@ -1,7 +1,6 @@ # name: test/sql/subquery/scalar/test_window_function_subquery.test # description: Test window functions in correlated subqueries # group: [scalar] -# Ignore https://issues.apache.org/jira/browse/IGNITE-14777 statement ok PRAGMA enable_verification diff --git a/modules/calcite/src/test/sql/window/test_window_functions.test b/modules/calcite/src/test/sql/window/test_window_functions.test new file mode 100644 index 0000000000000..4bff9d4e5e1f3 --- /dev/null +++ b/modules/calcite/src/test/sql/window/test_window_functions.test @@ -0,0 +1,617 @@ +# name: test/sql/window/test_window_functions.test +# description: Test window functions +# group: [window] + +# sample data +statement ok +CREATE TABLE empsalary(depname VARCHAR, empno BIGINT, salary INT, enroll_date DATE); + +statement ok +INSERT INTO empsalary VALUES ('develop', 10, 5200, '2007-08-01'), ('sales', 1, 5000, '2006-10-01'), ('person', 5, 3500, '2007-12-10'), ('sales', 4, 4800, '2007-08-08'), ('person', 2, 3900, '2006-12-23'), ('develop', 7, 4200, '2008-01-01'), ('develop', 9, 4500, '2008-01-01'), ('sales', 3, 4800, '2007-08-01'), ('develop', 8, 6000, '2006-10-01'), ('develop', 11, 5200, '2007-08-15'); + +statement ok +CREATE TABLE numbers (id INTEGER, val1 INTEGER, val2 INTEGER, val3 INTEGER, val4 INTEGER); + +statement ok +INSERT INTO numbers VALUES (0, 0, 0, 0, 0), (1, 1, 3, 1, 91), (2, 0, 0, 0, 20), (3, 0, 2, 0, 50), (4, 0, 0, 4, 64), (5, 1, 1, 9, 9), (6, 1, 1, 7, 57), (7, 1, 1, 1, 1), (8, 1, 1, 1, 21), (9, 1, 3, 3, 43), (10, 0, 2, 4, 14); + +statement ok +CREATE TABLE t_lag_lead(id INTEGER, val INTEGER, def INTEGER); + +statement ok +INSERT INTO t_lag_lead VALUES (1, 10, 999), (2, NULL, 999), (3, 30, 999); + +statement ok +CREATE TABLE t_first_value(id INTEGER, val INTEGER); + +statement ok +INSERT INTO t_first_value VALUES (1, 10), (2, 20), (3, 30); + +# sum with partition by +query IITI +SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary ORDER BY depname, salary, empno; +---- +develop 7 4200 25100 +develop 9 4500 25100 +develop 10 5200 25100 +develop 11 5200 25100 +develop 8 6000 25100 +person 5 3500 7400 +person 2 3900 7400 +sales 3 4800 14600 +sales 4 4800 14600 +sales 1 5000 14600 + +# rank function with partition and order by +query IITI rowsort +SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary) FROM empsalary +---- +develop 7 4200 1 +develop 9 4500 2 +develop 10 5200 3 +develop 11 5200 3 +develop 8 6000 5 +person 5 3500 1 +person 2 3900 2 +sales 3 4800 1 +sales 4 4800 1 +sales 1 5000 3 + +# window with group by +query IIII rowsort +SELECT val2, val3, SUM(SUM(val2)) OVER (PARTITION BY val2), AVG(val3) FROM numbers GROUP BY val2, val3; +---- +0 4 0 4 +0 0 0 0 +1 9 4 9 +1 7 4 7 +1 1 4 1 +2 4 4 4 +2 0 4 0 +3 3 6 3 +3 1 6 1 + +# empty windows specification +query I +SELECT COUNT(*) OVER () FROM numbers WHERE id < 10; +---- +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 + +# cumulative aggregate +query III +SELECT SUM(val2) OVER (PARTITION BY val3 ORDER BY id) AS sum_1, val3, val2 FROM numbers WHERE id < 10; +---- +0 0 0 +0 0 0 +2 0 2 +3 1 3 +4 1 1 +5 1 1 +3 3 3 +0 4 0 +1 7 1 +1 9 1 + +# row number +query I +SELECT ROW_NUMBER() OVER (ORDER BY id) FROM numbers WHERE id < 10; +---- +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 + +# rank +query III +SELECT RANK() OVER (PARTITION BY val2 ORDER BY val3) AS rank_1, val3, val2 FROM numbers WHERE id < 10; +---- +1 0 0 +1 0 0 +3 4 0 +1 1 1 +1 1 1 +3 7 1 +4 9 1 +1 0 2 +1 1 3 +2 3 3 + +# dense_rank +query III +SELECT DENSE_RANK() OVER (PARTITION BY val2 ORDER BY val3), val3, val2 FROM numbers WHERE id < 10; +---- +1 0 0 +1 0 0 +2 4 0 +1 1 1 +1 1 1 +2 7 1 +3 9 1 +1 0 2 +1 1 3 +2 3 3 + +# percent_rank +query RII +SELECT PERCENT_RANK() OVER (PARTITION BY val2 ORDER BY val3), val3, val2 FROM numbers WHERE id < 10; +---- +0 0 0 +0 0 0 +1 4 0 +0 1 1 +0 1 1 +0.6666666666666666 7 1 +1 9 1 +0 0 2 +0 1 3 +1 3 3 + +# cume_dist +query RII +SELECT CUME_DIST() OVER (PARTITION BY val2 ORDER BY val3), val3, val2 FROM numbers WHERE id < 10; +---- +0.6666666666666666 0 0 +0.6666666666666666 0 0 +1 4 0 +0.5 1 1 +0.5 1 1 +0.75 7 1 +1 9 1 +1 0 2 +0.5 1 3 +1 3 3 + +# lag +query IIIII +SELECT LAG(val3) OVER (PARTITION BY val2 ORDER BY val3), LAG(val3, val2) OVER (PARTITION BY val2 ORDER BY val3), LAG(val3, val2, -1) OVER (PARTITION BY val2 ORDER BY val3), val3, val2 FROM numbers WHERE id < 10; +---- +NULL 0 0 0 0 +0 0 0 0 0 +0 4 4 4 0 +NULL NULL -1 1 1 +1 1 1 1 1 +1 1 1 7 1 +7 7 7 9 1 +NULL NULL -1 0 2 +NULL NULL -1 1 3 +1 NULL -1 3 3 + +# lead +query IIIII +SELECT LEAD(val3) OVER (PARTITION BY val2 ORDER BY val3), LEAD(val3, val2) OVER (PARTITION BY val2 ORDER BY val3), LEAD(val3, val2, -1) OVER (PARTITION BY val2 ORDER BY val3), val3, val2 FROM numbers WHERE id < 10; +---- +0 0 0 0 0 +4 0 0 0 0 +NULL 4 4 4 0 +1 1 1 1 1 +7 7 7 1 1 +9 9 9 7 1 +NULL NULL -1 9 1 +NULL NULL -1 0 2 +3 NULL -1 1 3 +NULL NULL -1 3 3 + +# first value +query III +SELECT FIRST_VALUE(val3) OVER (PARTITION BY val2 ORDER BY val3), val3, val2 FROM numbers WHERE id < 10; +---- +0 0 0 +0 0 0 +0 4 0 +1 1 1 +1 1 1 +1 7 1 +1 9 1 +0 0 2 +1 1 3 +1 3 3 + +# last value +query III +SELECT LAST_VALUE(val3) OVER (PARTITION BY val2 ORDER BY val3), val3, val2 FROM numbers WHERE id < 10; +---- +0 0 0 +0 0 0 +4 4 0 +1 1 1 +1 1 1 +7 7 1 +9 9 1 +0 0 2 +1 1 3 +3 3 3 + +# ntile +query TI +SELECT depname, NTILE(4) OVER (ORDER BY depname) FROM empsalary; +---- +develop 1 +develop 1 +develop 1 +develop 2 +develop 2 +person 2 +person 3 +sales 3 +sales 4 +sales 4 + +# nth_value +query TT +SELECT depname, NTH_VALUE(depname, 6) OVER (ORDER BY depname) FROM empsalary; +---- +develop NULL +develop NULL +develop NULL +develop NULL +develop NULL +person person +person person +sales person +sales person +sales person + +# query with different windows evaluation. +query III rowsort +SELECT * FROM ( + SELECT + COUNT(*) OVER (PARTITION BY val2 ORDER BY val3) + SUM(val4) OVER (PARTITION BY val1 ORDER BY val3) AS total, + COUNT(*) OVER (PARTITION BY val2 ORDER BY val3) AS val2count, SUM(val4) OVER (PARTITION BY val1 ORDER BY val3) AS val1sum + FROM numbers +) sub WHERE total = val2count + val1sum; +---- +72 2 70 +72 2 70 +151 3 148 +115 2 113 +115 2 113 +216 3 213 +226 4 222 +71 1 70 +150 2 148 +114 1 113 +158 2 156 + +# non-default frame specifications +query IIII rowsort +SELECT val2, val3, + SUM(val3) OVER (PARTITION BY val2 ORDER BY val3), + LAST_VALUE(val3) OVER (PARTITION BY val2 ORDER BY val3) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss +---- +0 0 0 0 +0 4 4 4 +1 1 1 1 +1 7 8 7 +1 9 17 9 +2 0 0 0 +2 4 4 4 +3 1 1 1 +3 3 4 3 + +query IIII rowsort +SELECT val2, val3, + SUM(val3) over (PARTITION BY val2 ORDER BY val3 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), + LAST_VALUE(val3) OVER (PARTITION BY val2 ORDER BY val3 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss +---- +0 0 0 0 +0 4 4 4 +1 1 1 1 +1 7 8 7 +1 9 17 9 +2 0 0 0 +2 4 4 4 +3 1 1 1 +3 3 4 3 + +query IIII rowsort +SELECT val2, val3, + SUM(val3) over (PARTITION BY val2 ORDER BY val3 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), + LAST_VALUE(val3) OVER (PARTITION BY val2 ORDER BY val3 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss +---- +0 0 4 4 +0 4 4 4 +1 1 17 9 +1 7 17 9 +1 9 17 9 +2 0 4 4 +2 4 4 4 +3 1 4 3 +3 3 4 3 + + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), + LAST_VALUE(val3) OVER (ORDER BY val2 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2, val3 +---- +0 0 29 3 +0 4 29 3 +1 1 25 3 +1 7 25 3 +1 9 25 3 +2 0 8 3 +2 4 8 3 +3 1 4 3 +3 3 4 3 + + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 RANGE BETWEEN 4 PRECEDING AND 2 FOLLOWING), + LAST_VALUE(val3) OVER (ORDER BY val2 RANGE BETWEEN 4 PRECEDING AND 2 FOLLOWING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2, val3 +---- +0 0 25 4 +0 4 25 4 +1 1 29 3 +1 7 29 3 +1 9 29 3 +2 0 29 3 +2 4 29 3 +3 1 29 3 +3 3 29 3 + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 DESC RANGE BETWEEN 4 PRECEDING AND 2 FOLLOWING), + LAST_VALUE(val3) OVER (ORDER BY val2 DESC RANGE BETWEEN 4 PRECEDING AND 2 FOLLOWING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2 DESC, val3 DESC +---- +3 3 25 1 +3 1 25 1 +2 4 29 0 +2 0 29 0 +1 9 29 0 +1 7 29 0 +1 1 29 0 +0 4 29 0 +0 0 29 0 + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 RANGE BETWEEN 4 PRECEDING AND 2 PRECEDING), + LAST_VALUE(val3) OVER (ORDER BY val2 RANGE BETWEEN 4 PRECEDING AND 2 PRECEDING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2, val3 +---- +0 0 NULL NULL +0 4 NULL NULL +1 1 NULL NULL +1 7 NULL NULL +1 9 NULL NULL +2 0 4 4 +2 4 4 4 +3 1 21 9 +3 3 21 9 + + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 DESC RANGE BETWEEN 4 PRECEDING AND 2 PRECEDING), + LAST_VALUE(val3) OVER (ORDER BY val2 DESC RANGE BETWEEN 4 PRECEDING AND 2 PRECEDING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2 DESC, val3 DESC +---- +3 3 NULL NULL +3 1 NULL NULL +2 4 NULL NULL +2 0 NULL NULL +1 9 4 1 +1 7 4 1 +1 1 4 1 +0 4 8 0 +0 0 8 0 + +query IIII rowsort +SELECT val2, val3, + SUM(val3) over (PARTITION BY val2 ORDER BY val3 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), + LAST_VALUE(val3) OVER (PARTITION BY val2 ORDER BY val3 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss +---- +0 0 0 0 +0 4 4 4 +1 1 1 1 +1 7 8 7 +1 9 17 9 +2 0 0 0 +2 4 4 4 +3 1 1 1 +3 3 4 3 + +query IIII rowsort +SELECT val2, val3, + SUM(val3) over (PARTITION BY val2 ORDER BY val3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), + LAST_VALUE(val3) OVER (PARTITION BY val2 ORDER BY val3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss +---- +0 0 4 4 +0 4 4 4 +1 1 17 9 +1 7 17 9 +1 9 17 9 +2 0 4 4 +2 4 4 4 +3 1 4 3 +3 3 4 3 + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), + LAST_VALUE(val3) OVER (ORDER BY val2 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2, val3 +---- +0 0 29 3 +0 4 29 3 +1 1 25 3 +1 7 24 3 +1 9 17 3 +2 0 8 3 +2 4 8 3 +3 1 4 3 +3 3 3 3 + + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING), + LAST_VALUE(val3) OVER (ORDER BY val2 ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2, val3 +---- +0 0 5 1 +0 4 12 7 +1 1 21 9 +1 7 21 0 +1 9 25 4 +2 0 26 1 +2 4 25 3 +3 1 24 3 +3 3 17 3 + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 DESC ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING), + LAST_VALUE(val3) OVER (ORDER BY val2 DESC ROWS BETWEEN 4 PRECEDING AND 2 FOLLOWING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2 DESC, val3 DESC +---- +3 3 8 4 +3 1 8 0 +2 4 17 9 +2 0 24 7 +1 9 25 1 +1 7 26 4 +1 1 25 0 +0 4 21 0 +0 0 21 0 + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING), + LAST_VALUE(val3) OVER (ORDER BY val2 ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2, val3 +---- +0 0 NULL NULL +0 4 NULL NULL +1 1 0 0 +1 7 4 4 +1 9 5 1 +2 0 12 7 +2 4 17 9 +3 1 16 0 +3 3 13 4 + +query IIII +SELECT val2, val3, + SUM(val3) OVER (ORDER BY val2 DESC ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING), + LAST_VALUE(val3) OVER (ORDER BY val2 DESC ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING) +FROM (SELECT DISTINCT val3, val2 FROM numbers) ss ORDER BY val2 DESC, val3 DESC +---- +3 3 NULL NULL +3 1 NULL NULL +2 4 3 3 +2 0 4 1 +1 9 8 4 +1 7 5 0 +1 1 13 9 +0 4 16 7 +0 0 17 1 + +# date time interval bounds +query TI +SELECT * +FROM ( + SELECT + depname, + SUM(salary) OVER (PARTITION BY depname ORDER BY enroll_date RANGE BETWEEN INTERVAL 730 DAYS PRECEDING AND INTERVAL 365 DAYS FOLLOWING) val + FROM empsalary) s +ORDER BY s.depname, s.val +---- +develop 16400 +develop 25100 +develop 25100 +develop 25100 +develop 25100 +person 7400 +person 7400 +sales 14600 +sales 14600 +sales 14600 + +# window in correlated subquery +query II +SELECT id, (SELECT row_number() OVER (ORDER BY id)) FROM numbers i1 ORDER BY id; +---- +0 1 +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +9 1 +10 1 + +# downstream should not be ended in case window output is not empty. +query III +SELECT COUNT(*), MIN(cnt), MAX(cnt) +FROM ( + SELECT *, COUNT(*) OVER () AS cnt + FROM TABLE(SYSTEM_RANGE(1, 2000)) +); +---- +2000 2000 2000 + +# lag/lead default value. +query IIII +SELECT id, val, + LAG(val, 1, 999) OVER (ORDER BY id), + LEAD(val, 1, 999) OVER (ORDER BY id) +FROM t_lag_lead +ORDER BY id; +---- +1 10 999 NULL +2 NULL 10 30 +3 30 NULL 999 + +query IIII +SELECT id, val, + LAG(val, 1, def) OVER (ORDER BY id), + LEAD(val, 1, def) OVER (ORDER BY id) +FROM t_lag_lead +ORDER BY id; +---- +1 10 999 NULL +2 NULL 10 30 +3 30 NULL 999 + +# First_value outside of window. +query II +SELECT id, + FIRST_VALUE(val) OVER ( + ORDER BY id + ROWS BETWEEN 4 PRECEDING AND 2 PRECEDING + ) +FROM t_first_value +ORDER BY id; +---- +1 NULL +2 NULL +3 10 \ No newline at end of file diff --git a/modules/checkstyle/pom.xml b/modules/checkstyle/pom.xml index 49246c6b9c3a8..3982c193b8d45 100644 --- a/modules/checkstyle/pom.xml +++ b/modules/checkstyle/pom.xml @@ -41,7 +41,7 @@ 17 pom-installed.xml 2.19.0-SNAPSHOT - 8.45 + 12.3.1 https://ignite.apache.org diff --git a/modules/clients/src/test/resources/jetty/rest-jetty-ssl-client-auth.xml b/modules/clients/src/test/resources/jetty/rest-jetty-ssl-client-auth.xml index 00158a85cc226..b95d81dd1ef29 100644 --- a/modules/clients/src/test/resources/jetty/rest-jetty-ssl-client-auth.xml +++ b/modules/clients/src/test/resources/jetty/rest-jetty-ssl-client-auth.xml @@ -19,7 +19,7 @@ - + 5 10 @@ -76,17 +76,6 @@ - - - - - - - - - - - false diff --git a/modules/clients/src/test/resources/jetty/rest-jetty-ssl.xml b/modules/clients/src/test/resources/jetty/rest-jetty-ssl.xml index d84df0d48b3e8..d34d2c9ada2a8 100644 --- a/modules/clients/src/test/resources/jetty/rest-jetty-ssl.xml +++ b/modules/clients/src/test/resources/jetty/rest-jetty-ssl.xml @@ -20,7 +20,7 @@ - + 10 @@ -38,7 +38,7 @@ - + /src/test/keystore/server.jks 123456 123456 @@ -77,18 +77,5 @@ - - - - - - - - - - - - - false diff --git a/modules/clients/src/test/resources/jetty/rest-jetty.xml b/modules/clients/src/test/resources/jetty/rest-jetty.xml index d84bf8ae49c17..c4dcc0f37afe2 100644 --- a/modules/clients/src/test/resources/jetty/rest-jetty.xml +++ b/modules/clients/src/test/resources/jetty/rest-jetty.xml @@ -20,7 +20,7 @@ - + 20 @@ -61,17 +61,5 @@ - - - - - - - - - - - - false diff --git a/modules/clients/src/test/resources/jetty/router-jetty-ssl.xml b/modules/clients/src/test/resources/jetty/router-jetty-ssl.xml index 093fa181535cc..85081526a7d33 100644 --- a/modules/clients/src/test/resources/jetty/router-jetty-ssl.xml +++ b/modules/clients/src/test/resources/jetty/router-jetty-ssl.xml @@ -20,7 +20,7 @@ - + 10 @@ -38,7 +38,7 @@ - + /src/test/keystore/server.jks 123456 123456 @@ -77,18 +77,5 @@ - - - - - - - - - - - - - false diff --git a/modules/clients/src/test/resources/jetty/router-jetty.xml b/modules/clients/src/test/resources/jetty/router-jetty.xml index 8815431069b75..eecb262972c17 100644 --- a/modules/clients/src/test/resources/jetty/router-jetty.xml +++ b/modules/clients/src/test/resources/jetty/router-jetty.xml @@ -20,7 +20,7 @@ - + 20 @@ -61,17 +61,5 @@ - - - - - - - - - - - - false diff --git a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java index 052db3afcdf62..2fe3a5e7d8097 100644 --- a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java +++ b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java @@ -462,6 +462,9 @@ else if (assignableFrom(type, type("org.apache.ignite.internal.util.GridLongList else if (assignableFrom(type, type("org.apache.ignite.lang.IgniteProductVersion"))) returnFalseIfWriteFailed(write, field, "writer.writeIgniteProductVersion", getExpr); + else if (assignableFrom(type, type("org.apache.ignite.internal.processors.cache.version.GridCacheVersion"))) + returnFalseIfWriteFailed(write, field, "writer.writeGridCacheVersion", getExpr); + else if (assignableFrom(type, type(MESSAGE_INTERFACE))) { if (sameType(type, COMPRESSED_MESSAGE_CLASS)) throw new IllegalArgumentException(COMPRESSED_MSG_ERROR); @@ -691,6 +694,9 @@ else if (assignableFrom(type, type("org.apache.ignite.internal.util.GridLongList else if (assignableFrom(type, type("org.apache.ignite.lang.IgniteProductVersion"))) returnFalseIfReadFailed(field, "reader.readIgniteProductVersion"); + else if (assignableFrom(type, type("org.apache.ignite.internal.processors.cache.version.GridCacheVersion"))) + returnFalseIfReadFailed(field, "reader.readGridCacheVersion"); + else if (assignableFrom(type, type(MESSAGE_INTERFACE))) { if (sameType(type, COMPRESSED_MESSAGE_CLASS)) throw new IllegalArgumentException(COMPRESSED_MSG_ERROR); @@ -833,6 +839,9 @@ private String messageCollectionItemType(TypeMirror type) throws Exception { if (sameType(type, "org.apache.ignite.lang.IgniteUuid")) return "IGNITE_UUID"; + if (sameType(type, "org.apache.ignite.internal.processors.cache.version.GridCacheVersion")) + return "GRID_CACHE_VERSION"; + if (sameType(type, "org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion")) return "AFFINITY_TOPOLOGY_VERSION"; diff --git a/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java b/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java index 6aa8c01e95744..ec443398ce3e4 100644 --- a/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java +++ b/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java @@ -19,6 +19,7 @@ import java.io.Serializable; import org.apache.ignite.internal.util.GridLogThrottle; +import org.apache.ignite.lang.IgniteExperimental; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.util.CommonUtils.DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE; @@ -153,6 +154,67 @@ public class IgniteCommonsSystemProperties { "memory block is released. This will help to recognize cases when already released memory is accessed") public static final String IGNITE_OFFHEAP_SAFE_RELEASE = "IGNITE_OFFHEAP_SAFE_RELEASE"; + /** Human-readable ID of a data center where the node is running. */ + @IgniteExperimental + @SystemProperty(value = "Data Center ID where local node is running. Not required for a single Data Center deployments", + type = String.class) + public static final String IGNITE_DATA_CENTER_ID = "IGNITE_DATA_CENTER_ID"; + + /** Defines path to the file that contains list of classes allowed to safe deserialization.*/ + @SystemProperty(value = "Path to the file that contains list of classes allowed to safe deserialization", + type = String.class) + public static final String IGNITE_MARSHALLER_WHITELIST = "IGNITE_MARSHALLER_WHITELIST"; + + /** Defines path to the file that contains list of classes disallowed to safe deserialization.*/ + @SystemProperty(value = "Path to the file that contains list of classes disallowed to safe deserialization", + type = String.class) + public static final String IGNITE_MARSHALLER_BLACKLIST = "IGNITE_MARSHALLER_BLACKLIST"; + + /** + * If this parameter is set to true, Ignite will automatically configure an ObjectInputFilter instance for the + * current JVM it is running in. + * Default value is {@code true}. + */ + @SystemProperty( + value = "If this parameter is set to true, Ignite will automatically configure an ObjectInputFilter" + + " instance for the current JVM it is running in. Filtering is based on class lists defined by the" + + " `IGNITE_MARSHALLER_WHITELIST` and `IGNITE_MARSHALLER_BLACKLIST` system properties or their default values." + + " Disabling it is not recommended because the Ignite host may be vulnerable to RCE attacks based on Java" + + " serialization mechanisms", + defaults = "true" + ) + public static final String IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION = "IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION"; + + /** + * Enables default selected keys set to be used inside {@code GridNioServer}. + *

+ * Default value is {@code false}. Should be switched to {@code true} if there are + * any problems in communication layer. + */ + @SystemProperty("Enables default selected keys set to be used inside GridNioServer " + + "which lead to some extra garbage generation when processing selected keys. " + + "Should be switched to true if there are any problems in communication layer") + public static final String IGNITE_NO_SELECTOR_OPTS = "IGNITE_NO_SELECTOR_OPTS"; + + /** Default IO balance period. */ + public static final int DFLT_IO_BALANCE_PERIOD = 5000; + + /** */ + @SystemProperty(value = "IO balance period in milliseconds", type = Long.class, + defaults = "" + DFLT_IO_BALANCE_PERIOD) + public static final String IGNITE_IO_BALANCE_PERIOD = "IGNITE_IO_BALANCE_PERIOD"; + + /** Default timeout for TCP client recovery descriptor reservation. */ + public static final int DFLT_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT = 5_000; + + /** + * Sets timeout for TCP client recovery descriptor reservation. + */ + @SystemProperty(value = "Timeout for TCP client recovery descriptor reservation in milliseconds", + type = Long.class, defaults = "" + DFLT_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT) + public static final String IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT = + "IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT"; + /** * @param enumCls Enum type. * @param name Name of the system property or environment variable. diff --git a/modules/core/src/main/java/org/apache/ignite/cache/CacheEntryVersion.java b/modules/commons/src/main/java/org/apache/ignite/cache/CacheEntryVersion.java similarity index 74% rename from modules/core/src/main/java/org/apache/ignite/cache/CacheEntryVersion.java rename to modules/commons/src/main/java/org/apache/ignite/cache/CacheEntryVersion.java index 0953740f957c2..71046d1239c9b 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/CacheEntryVersion.java +++ b/modules/commons/src/main/java/org/apache/ignite/cache/CacheEntryVersion.java @@ -18,18 +18,15 @@ package org.apache.ignite.cache; import java.io.Serializable; -import java.util.Map; -import org.apache.ignite.internal.processors.cache.CacheConflictResolutionManager; -import org.apache.ignite.internal.processors.cache.IgniteInternalCache; -import org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager; /** * Entry event order. * Two concurrent updates of the same entry can be ordered based on {@link CacheEntryVersion} comparsion. * Greater value means that event occurs later. * - * @see CacheConflictResolutionManager - * @see GridCacheVersionManager#dataCenterId(byte) + * + * {@ignitelink org.apache.ignite.internal.processors.cache.CacheConflictResolutionManager} + * {@ignitelink org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager#dataCenterId(byte)} */ public interface CacheEntryVersion extends Comparable, Serializable { /** @@ -44,7 +41,7 @@ public interface CacheEntryVersion extends Comparable, Serial /** * Cluster id is a value to distinguish updates in case user wants to aggregate and sort updates from several * Ignite clusters. {@code clusterId} id can be set for the node using - * {@link GridCacheVersionManager#dataCenterId(byte)}. + * {@ignitelink org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager#dataCenterId(byte)} * * @return Cluster id. */ @@ -55,11 +52,12 @@ public interface CacheEntryVersion extends Comparable, Serial /** * If source of the update is "local" cluster then {@code null} will be returned. - * If updated comes from the other cluster using {@link IgniteInternalCache#putAllConflict(Map)} + * If updated comes from the other cluster using + * {@ignitelink org.apache.ignite.internal.processors.cache.IgniteInternalCache#putAllConflict(Map)} * then entry version for other cluster. * @return Replication version. - * @see IgniteInternalCache#putAllConflict(Map) - * @see IgniteInternalCache#removeAllConflict(Map) + * {@ignitelink org.apache.ignite.internal.processors.cache.IgniteInternalCache#putAllConflict(Map)} + * {@ignitelink org.apache.ignite.internal.processors.cache.IgniteInternalCache#removeAllConflict(Map)} */ public CacheEntryVersion otherClusterVersion(); } diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/CacheEntryEventAdapter.java b/modules/commons/src/main/java/org/apache/ignite/cache/query/CacheEntryEventAdapter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/cache/query/CacheEntryEventAdapter.java rename to modules/commons/src/main/java/org/apache/ignite/cache/query/CacheEntryEventAdapter.java diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/IndexQuery.java b/modules/commons/src/main/java/org/apache/ignite/cache/query/IndexQuery.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/cache/query/IndexQuery.java rename to modules/commons/src/main/java/org/apache/ignite/cache/query/IndexQuery.java diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/IndexQueryCriterion.java b/modules/commons/src/main/java/org/apache/ignite/cache/query/IndexQueryCriterion.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/cache/query/IndexQueryCriterion.java rename to modules/commons/src/main/java/org/apache/ignite/cache/query/IndexQueryCriterion.java diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlQuery.java b/modules/commons/src/main/java/org/apache/ignite/cache/query/SqlQuery.java similarity index 97% rename from modules/core/src/main/java/org/apache/ignite/cache/query/SqlQuery.java rename to modules/commons/src/main/java/org/apache/ignite/cache/query/SqlQuery.java index 64864b3510406..b7be00fc6b759 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlQuery.java +++ b/modules/commons/src/main/java/org/apache/ignite/cache/query/SqlQuery.java @@ -19,8 +19,6 @@ import java.util.concurrent.TimeUnit; import javax.cache.Cache; -import org.apache.ignite.IgniteCache; -import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.A; @@ -30,7 +28,7 @@ /** * SQL Query. * - * @see IgniteCache#query(Query) + * {@ignitelink org.apache.ignite.IgniteCache#query(Query)} * * @deprecated Since 2.8, please use {@link SqlFieldsQuery} instead. */ @@ -209,7 +207,7 @@ public SqlQuery setTimeout(int timeout, TimeUnit timeUnit) { * @return {@code this} For chaining. */ public SqlQuery setType(Class type) { - return setType(QueryUtils.typeName(type)); + return setType(CommonUtils.typeName(type)); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/compute/ComputeExecutionRejectedException.java b/modules/commons/src/main/java/org/apache/ignite/compute/ComputeExecutionRejectedException.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/compute/ComputeExecutionRejectedException.java rename to modules/commons/src/main/java/org/apache/ignite/compute/ComputeExecutionRejectedException.java diff --git a/modules/core/src/main/java/org/apache/ignite/failure/FailureType.java b/modules/commons/src/main/java/org/apache/ignite/failure/FailureType.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/failure/FailureType.java rename to modules/commons/src/main/java/org/apache/ignite/failure/FailureType.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/ClassSet.java b/modules/commons/src/main/java/org/apache/ignite/internal/ClassSet.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/ClassSet.java rename to modules/commons/src/main/java/org/apache/ignite/internal/ClassSet.java diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/IgniteFutureCancelledCheckedException.java b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteFutureCancelledCheckedException.java index 1cec418142dd5..1ef01e562d21f 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/IgniteFutureCancelledCheckedException.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteFutureCancelledCheckedException.java @@ -18,12 +18,13 @@ package org.apache.ignite.internal; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.util.future.GridCompoundFuture.SkipLoggingException; import org.jetbrains.annotations.Nullable; /** * Future computation cannot be retrieved because it was cancelled. */ -public class IgniteFutureCancelledCheckedException extends IgniteCheckedException { +public class IgniteFutureCancelledCheckedException extends IgniteCheckedException implements SkipLoggingException { /** */ private static final long serialVersionUID = 0L; diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/IgniteProperties.java b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteProperties.java index 75a49ccaaed0c..cc5c2c869f954 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/IgniteProperties.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteProperties.java @@ -25,8 +25,8 @@ * Ignite properties holder. */ public class IgniteProperties { - /** Properties file path. */ - private static final String FILE_PATH = "ignite.properties"; + /** Build info file path. */ + private static final String FILE_PATH = "ignite-build-info.properties"; /** Properties. */ private static final Properties PROPS; diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java index f72e339c2b273..52f46a6e48efa 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java @@ -49,6 +49,11 @@ public class IgniteVersionUtils { COPYRIGHT = year + " Copyright(C) Apache Software Foundation"; } + /** Builds a string containing the semantic version based on the specified Ignite product version. */ + public static String semanticVersion(IgniteProductVersion productVer) { + return productVer.major() + "." + productVer.minor() + "." + productVer.maintenance(); + } + /** * Private constructor. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/NodeStoppingException.java b/modules/commons/src/main/java/org/apache/ignite/internal/NodeStoppingException.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/NodeStoppingException.java rename to modules/commons/src/main/java/org/apache/ignite/internal/NodeStoppingException.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/InIndexQueryCriterion.java b/modules/commons/src/main/java/org/apache/ignite/internal/cache/query/InIndexQueryCriterion.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/cache/query/InIndexQueryCriterion.java rename to modules/commons/src/main/java/org/apache/ignite/internal/cache/query/InIndexQueryCriterion.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/RangeIndexQueryCriterion.java b/modules/commons/src/main/java/org/apache/ignite/internal/cache/query/RangeIndexQueryCriterion.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/cache/query/RangeIndexQueryCriterion.java rename to modules/commons/src/main/java/org/apache/ignite/internal/cache/query/RangeIndexQueryCriterion.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/AffinityTopologyVersion.java b/modules/commons/src/main/java/org/apache/ignite/internal/processors/affinity/AffinityTopologyVersion.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/AffinityTopologyVersion.java rename to modules/commons/src/main/java/org/apache/ignite/internal/processors/affinity/AffinityTopologyVersion.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeResult.java b/modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeResult.java similarity index 88% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeResult.java rename to modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeResult.java index 23605aabe2fff..b868064804c5a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeResult.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeResult.java @@ -25,9 +25,6 @@ import javax.cache.processor.EntryProcessorException; import javax.cache.processor.EntryProcessorResult; import javax.cache.processor.MutableEntry; -import org.apache.ignite.IgniteException; -import org.apache.ignite.internal.UnregisteredBinaryTypeException; -import org.apache.ignite.internal.UnregisteredClassException; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; @@ -99,11 +96,8 @@ public static CacheInvokeResult fromError(Throwable err) { /** {@inheritDoc} */ @Override public T get() throws EntryProcessorException { if (err != null) { - if (err instanceof UnregisteredClassException || err instanceof UnregisteredBinaryTypeException) - throw (IgniteException)err; - - if (err instanceof EntryProcessorException) - throw (EntryProcessorException)err; + if (err instanceof RuntimeException) + throw (RuntimeException)err; throw new EntryProcessorException(err); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java b/modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java similarity index 92% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java rename to modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java index d5abdd43f4084..ed2a945685b4e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java @@ -21,16 +21,12 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; -import java.util.UUID; import org.apache.ignite.cache.CacheEntryVersion; -import org.apache.ignite.internal.Order; -import org.apache.ignite.lang.IgniteUuid; -import org.apache.ignite.plugin.extensions.communication.Message; /** * Grid unique version. */ -public class GridCacheVersion implements Message, Externalizable, CacheEntryVersion { +public class GridCacheVersion implements Externalizable, CacheEntryVersion { /** */ private static final long serialVersionUID = 0L; @@ -44,15 +40,12 @@ public class GridCacheVersion implements Message, Externalizable, CacheEntryVers private static final int DR_ID_MASK = 0x1F; /** Topology version. */ - @Order(0) int topVer; /** Node order (used as global order) and DR ID. */ - @Order(1) int nodeOrderDrId; /** Order. */ - @Order(2) long order; /** @@ -149,6 +142,21 @@ public GridCacheVersion conflictVersion() { return this; // Use current version. } + /** */ + public void topologyVersion(int topVer) { + this.topVer = topVer; + } + + /** */ + public void nodeOrderAndDrIdRaw(int nodeOrder) { + this.nodeOrderDrId = nodeOrder; + } + + /** */ + public void order(long order) { + this.order = order; + } + /** * @param ver Version. * @return {@code True} if this version is greater. @@ -173,13 +181,6 @@ public boolean isLess(GridCacheVersion ver) { return compareTo(ver) < 0; } - /** - * @return Version represented as {@code IgniteUuid} - */ - public IgniteUuid asIgniteUuid() { - return new IgniteUuid(new UUID(topVer, nodeOrderDrId), order); - } - /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeInt(topVer); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientConnectionNodeRecoveryException.java b/modules/commons/src/main/java/org/apache/ignite/internal/processors/odbc/ClientConnectionNodeRecoveryException.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientConnectionNodeRecoveryException.java rename to modules/commons/src/main/java/org/apache/ignite/internal/processors/odbc/ClientConnectionNodeRecoveryException.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cache/expiry/PlatformExpiryPolicy.java b/modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/cache/expiry/PlatformExpiryPolicy.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cache/expiry/PlatformExpiryPolicy.java rename to modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/cache/expiry/PlatformExpiryPolicy.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientFlag.java b/modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientFlag.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientFlag.java rename to modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientFlag.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java b/modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java rename to modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/IgniteClientException.java b/modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/client/IgniteClientException.java similarity index 80% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/IgniteClientException.java rename to modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/client/IgniteClientException.java index 6b0e5ee2f3116..959c6ca5f95bf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/IgniteClientException.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/processors/platform/client/IgniteClientException.java @@ -19,9 +19,6 @@ import java.sql.SQLException; import org.apache.ignite.IgniteException; -import org.apache.ignite.plugin.security.SecurityException; - -import static org.apache.ignite.internal.processors.platform.client.ClientStatus.SECURITY_VIOLATION; /** * Client exception. @@ -64,13 +61,4 @@ public IgniteClientException(int statusCode, String msg, Throwable cause) { public int statusCode() { return statusCode; } - - /** */ - public static IgniteClientException wrapAuthorizationExeption(SecurityException e) { - return new IgniteClientException( - SECURITY_VIOLATION, - "Client is not authorized to perform this operation [errMsg=" + e.getMessage() + ']', - e - ); - } } diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContext.java b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContext.java index 6953d8b853891..4a8f556781cf7 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContext.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/thread/context/OperationContext.java @@ -322,7 +322,7 @@ private static class AttributeValueHolder { } /** Allows to change multiple attribute values in a single update operation and skip updates that changes nothing. */ - private static class ContextUpdater { + static class ContextUpdater { /** */ private static final int INIT_UPDATES_CAPACITY = 3; diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java index e87513b9b0aae..8954c0cafd18c 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java @@ -37,9 +37,11 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.ByteBuffer; import java.nio.channels.ClosedChannelException; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; +import java.nio.channels.SocketChannel; import java.nio.file.Files; import java.nio.file.Path; import java.security.AccessController; @@ -79,6 +81,7 @@ import org.apache.ignite.internal.IgniteFutureTimeoutCheckedException; import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.internal.processors.cache.CacheClassLoaderMarker; +import org.apache.ignite.internal.util.lang.GridClosureException; import org.apache.ignite.internal.util.lang.GridTuple; import org.apache.ignite.internal.util.typedef.C1; import org.apache.ignite.internal.util.typedef.F; @@ -86,6 +89,7 @@ import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.LT; import org.apache.ignite.internal.util.typedef.internal.SB; +import org.apache.ignite.internal.util.worker.GridWorker; import org.apache.ignite.lang.IgniteFutureCancelledException; import org.apache.ignite.lang.IgniteFutureTimeoutException; import org.apache.ignite.lang.IgnitePredicate; @@ -100,6 +104,12 @@ * Collection of utility methods used in 'ignite-commons' and throughout the system. */ public abstract class CommonUtils { + /** Empty longs array. */ + public static final long[] EMPTY_LONGS = new long[0]; + + /** Network packet header (corresponds to {@code 0x0149474E}). */ + public static final byte[] IGNITE_HEADER = new byte[] {0x01, 0x49, 0x47, 0x4E}; + /** */ public static final long KB = 1024L; @@ -207,6 +217,24 @@ public abstract class CommonUtils { /** Ignite package. */ public static final String IGNITE_PKG = "org.apache.ignite."; + /** Default data structures group name. */ + public static final String DEFAULT_DS_GROUP_NAME = "default-ds-group"; + + /** Atomics system cache name. */ + public static final String ATOMICS_CACHE_NAME = "ignite-sys-atomic-cache"; + + /** Thin client handshake (connection type) code. */ + public static final byte THIN_CLIENT = 2; + + /** Handshake request command code. */ + public static final int HANDSHAKE = 1; + + /** Default client connector port. */ + public static final int DFLT_PORT = 10800; + + /** Default client connector port range. */ + public static final int DFLT_PORT_RANGE = 100; + /** * Short date format pattern for log messages in "quiet" mode. * Only time is included since we don't expect "quiet" mode to be used @@ -2354,4 +2382,367 @@ public static int toDigit(char ch, int idx) throws IgniteCheckedException { return sqlClasses; } + + /** + * Quietly closes given resource ignoring possible checked exception. + * + * @param rsrc Resource to close. If it's {@code null} - it's no-op. + */ + public static void closeQuiet(@Nullable AutoCloseable rsrc) { + if (rsrc != null) + try { + rsrc.close(); + } + catch (Exception ignored) { + // No-op. + } + } + + /** + * Quietly closes given {@link Socket} ignoring possible checked exception. + * + * @param sock Socket to close. If it's {@code null} - it's no-op. + */ + public static void closeQuiet(@Nullable Socket sock) { + if (sock == null) + return; + + try { + // Avoid tls 1.3 incompatibility https://bugs.openjdk.java.net/browse/JDK-8208526 + sock.shutdownOutput(); + sock.shutdownInput(); + } + catch (Exception ignored) { + // No-op. + } + + try { + sock.close(); + } + catch (Exception ignored) { + // No-op. + } + } + + /** + * Utility method to add the given throwable error to the given throwable root error. If the given + * suppressed throwable is an {@code Error}, but the root error is not, will change the root to the {@code Error}. + * + * @param root Root error to add suppressed error to. + * @param err Error to add. + * @return New root error. + */ + public static T addSuppressed(T root, T err) { + assert err != null; + + if (root == null) + return err; + + if (err instanceof Error && !(root instanceof Error)) { + err.addSuppressed(root); + + root = err; + } + else + root.addSuppressed(err); + + return root; + } + + /** + * Gets absolute value for integer. If integer is {@link Integer#MIN_VALUE}, then {@code 0} is returned. + * + * @param i Integer. + * @return Absolute value. + */ + public static int safeAbs(int i) { + i = Math.abs(i); + + return i < 0 ? 0 : i; + } + + /** + * Gets absolute value for long. If argument is {@link Long#MIN_VALUE}, then {@code 0} is returned. + * + * @param i Argument. + * @return Absolute value. + */ + public static long safeAbs(long i) { + i = Math.abs(i); + + return i < 0 ? 0 : i; + } + + /** + * Helper method to calculates mask. + * + * @param parts Number of partitions. + * @return Mask to use in calculation when partitions count is power of 2. + */ + public static int calculateMask(int parts) { + return (parts & (parts - 1)) == 0 ? parts - 1 : -1; + } + + /** + * Helper method to calculate partition. + * + * @param key Key to get partition for. + * @param mask Mask to use in calculation when partitions count is power of 2. + * @param parts Number of partitions. + * @return Partition number for a given key. + */ + public static int calculatePartition(Object key, int mask, int parts) { + if (mask >= 0) { + int h; + + return ((h = key.hashCode()) ^ (h >>> 16)) & mask; + } + + return safeAbs(key.hashCode() % parts); + } + + /** + * Unwraps closure exceptions. + * + * @param t Exception. + * @return Unwrapped exception. + */ + public static Exception unwrap(Throwable t) { + assert t != null; + + while (true) { + if (t instanceof Error) + throw (Error)t; + + if (t instanceof GridClosureException) { + t = ((GridClosureException)t).unwrap(); + + continue; + } + + return (Exception)t; + } + } + + /** + * Casts the passed {@code Throwable t} to {@link IgniteCheckedException}.
+ * If {@code t} is a {@link GridClosureException}, it is unwrapped and then cast to {@link IgniteCheckedException}. + * If {@code t} is an {@link IgniteCheckedException}, it is returned. + * If {@code t} is not a {@link IgniteCheckedException}, a new {@link IgniteCheckedException} caused by {@code t} + * is returned. + * + * @param t Throwable to cast. + * @return {@code t} cast to {@link IgniteCheckedException}. + */ + public static IgniteCheckedException cast(Throwable t) { + assert t != null; + + t = unwrap(t); + + return t instanceof IgniteCheckedException + ? (IgniteCheckedException)t + : new IgniteCheckedException(t); + } + + /** + * Gets type name by class name. + * + * @param clsName Class name. + * @return Type name. + */ + public static String typeName(String clsName) { + int genericStart = clsName.indexOf('`'); // .NET generic, not valid for Java class name. + + if (genericStart >= 0) + clsName = clsName.substring(0, genericStart); + + int pkgEnd = clsName.lastIndexOf('.'); + + if (pkgEnd >= 0 && pkgEnd < clsName.length() - 1) + clsName = clsName.substring(pkgEnd + 1); + + if (clsName.endsWith("[]")) + clsName = clsName.substring(0, clsName.length() - 2) + "_array"; + + int parentEnd = clsName.lastIndexOf('$'); + + if (parentEnd >= 0) + clsName = clsName.substring(parentEnd + 1); + + parentEnd = clsName.lastIndexOf('+'); // .NET parent + + if (parentEnd >= 0) + clsName = clsName.substring(parentEnd + 1); + + return clsName; + } + + /** + * Gets type name by class. + * + * @param cls Class. + * @return Type name. + */ + public static String typeName(Class cls) { + String typeName = cls.getSimpleName(); + + // To protect from failure on anonymous classes. + if (typeName.isEmpty()) { + String pkg = cls.getPackage().getName(); + + typeName = cls.getName().substring(pkg.length() + (pkg.isEmpty() ? 0 : 1)); + } + + if (cls.isArray()) { + assert typeName.endsWith("[]"); + + typeName = typeName.substring(0, typeName.length() - 2) + "_array"; + } + + return typeName; + } + + /** + * Cancels given runnable. + * + * @param w Worker to cancel - it's no-op if runnable is {@code null}. + */ + public static void cancel(@Nullable GridWorker w) { + if (w != null) + w.cancel(); + } + + /** + * Cancels collection of runnables. + * + * @param ws Collection of workers - it's no-op if collection is {@code null}. + */ + public static void cancel(Iterable ws) { + if (ws != null) + for (GridWorker w : ws) + w.cancel(); + } + + /** + * Joins runnable. + * + * @param w Worker to join. + * @param log The logger to possible exception. + * @return {@code true} if worker has not been interrupted, {@code false} if it was interrupted. + */ + public static boolean join(@Nullable GridWorker w, @Nullable IgniteLogger log) { + if (w != null) + try { + w.join(); + } + catch (InterruptedException ignore) { + warn(log, "Got interrupted while waiting for completion of runnable: " + w); + + Thread.currentThread().interrupt(); + + return false; + } + + return true; + } + + /** + * Joins given collection of runnables. + * + * @param ws Collection of workers to join. + * @param log The logger to possible exceptions. + * @return {@code true} if none of the worker have been interrupted, + * {@code false} if at least one was interrupted. + */ + public static boolean join(Iterable ws, IgniteLogger log) { + boolean retval = true; + + if (ws != null) + for (GridWorker w : ws) + if (!join(w, log)) + retval = false; + + return retval; + } + + /** + * Creates thread with given worker. + * + * @param worker Runnable to create thread with. + */ + public static IgniteThread newThread(GridWorker worker) { + return new IgniteThread(worker.igniteInstanceName(), worker.name(), worker); + } + + /** + * Sleeps for given number of milliseconds. + * + * @param ms Time to sleep. + * @throws IgniteInterruptedCheckedException Wrapped {@link InterruptedException}. + */ + public static void sleep(long ms) throws IgniteInterruptedCheckedException { + try { + Thread.sleep(ms); + } + catch (InterruptedException e) { + Thread.currentThread().interrupt(); + + throw new IgniteInterruptedCheckedException(e); + } + } + + /** + * Safely write buffer fully to blocking socket channel. + * Will throw assert if non blocking channel passed. + * + * @param sockCh WritableByteChannel. + * @param buf Buffer. + * @throws IOException IOException. + */ + public static void writeFully(SocketChannel sockCh, ByteBuffer buf) throws IOException { + int totalWritten = 0; + + assert sockCh.isBlocking() : "SocketChannel should be in blocking mode " + sockCh; + + while (buf.hasRemaining()) { + int written = sockCh.write(buf); + + if (written < 0) + throw new IOException("Error writing buffer to channel " + + "[written = " + written + ", buf " + buf + ", totalWritten = " + totalWritten + "]"); + + totalWritten += written; + } + } + + /** + * @param a First byte array. + * @param aOff First byte array offset. + * @param b Second byte array. + * @param bOff Second byte array offset. + * @param len Number of bytes to compare. + * @return {@code True} if the specified sub-arrays are equal. + */ + public static boolean bytesEqual(byte[] a, int aOff, byte[] b, int bOff, int len) { + if (aOff + len > a.length || bOff + len > b.length) + return false; + else { + for (int i = 0; i < len; i++) + if (a[aOff + i] != b[bOff + i]) + return false; + + return true; + } + } + + /** + * Concatenates the two parameter bytes to form a message type value. + * + * @param b0 The first byte. + * @param b1 The second byte. + * @return Message type. + */ + public static short makeMessageType(byte b0, byte b1) { + return (short)((b1 & 0xFF) << 8 | b0 & 0xFF); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridLongList.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/GridLongList.java similarity index 99% rename from modules/core/src/main/java/org/apache/ignite/internal/util/GridLongList.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/GridLongList.java index 27f5dfc13b5a2..ba69dcaba6d0a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridLongList.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/GridLongList.java @@ -26,7 +26,7 @@ import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.SB; -import static org.apache.ignite.internal.util.IgniteUtils.EMPTY_LONGS; +import static org.apache.ignite.internal.util.CommonUtils.EMPTY_LONGS; /** * Minimal list API to work with primitive longs. This list exists diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/HostAndPortRange.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/HostAndPortRange.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/HostAndPortRange.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/HostAndPortRange.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java similarity index 92% rename from modules/core/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java index 28e2544921084..2b3abd84230b1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridCompoundFuture.java @@ -26,16 +26,12 @@ import java.util.function.Supplier; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; -import org.apache.ignite.internal.IgniteFutureCancelledCheckedException; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.NodeStoppingException; -import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; -import org.apache.ignite.internal.processors.cache.distributed.near.consistency.IgniteConsistencyViolationException; -import org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.lang.IgniteReducer; import org.jetbrains.annotations.Nullable; @@ -117,17 +113,14 @@ public GridCompoundFuture(@Nullable IgniteReducer rdc) { throw e; } } - catch (IgniteTxOptimisticCheckedException | IgniteFutureCancelledCheckedException | - ClusterTopologyCheckedException | IgniteConsistencyViolationException e) { - if (!processFailure(e, fut)) - onDone(e); - } catch (IgniteCheckedException e) { if (!processFailure(e, fut)) { - if (e instanceof NodeStoppingException) - logDebug(logger(), "Failed to execute compound future reducer, node stopped."); - else - logError(null, "Failed to execute compound future reducer: " + this, e); + if (!(e instanceof SkipLoggingException)) { + if (e instanceof NodeStoppingException) + logDebug(logger(), "Failed to execute compound future reducer, node stopped."); + else + logError(null, "Failed to execute compound future reducer: " + this, e); + } onDone(e); } @@ -370,7 +363,7 @@ private void checkComplete() { * @param e Exception. */ protected void logError(IgniteLogger log, String msg, Throwable e) { - U.error(log, msg, e); + CommonUtils.error(log, msg, e); } /** @@ -425,4 +418,9 @@ protected final boolean hasFutures() { F.viewReadOnly(futures(), (IgniteInternalFuture f) -> Boolean.toString(f.isDone())) ); } + + /** */ + public interface SkipLoggingException { + // No-op marker interface. + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridFinishedFuture.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridFinishedFuture.java similarity index 98% rename from modules/core/src/main/java/org/apache/ignite/internal/util/future/GridFinishedFuture.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridFinishedFuture.java index 2b42c4bb2f58d..cc6d57dfeb884 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridFinishedFuture.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridFinishedFuture.java @@ -21,9 +21,9 @@ import java.util.concurrent.TimeUnit; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.lang.GridClosureException; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteClosure; import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.lang.IgniteOutClosure; @@ -100,7 +100,7 @@ public GridFinishedFuture(Throwable err) { /** {@inheritDoc} */ @Override public T get() throws IgniteCheckedException { if (resFlag == ERR) - throw U.cast((Throwable)res); + throw CommonUtils.cast((Throwable)res); return (T)res; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridFutureAdapter.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridFutureAdapter.java similarity index 98% rename from modules/core/src/main/java/org/apache/ignite/internal/util/future/GridFutureAdapter.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridFutureAdapter.java index c932a9c3f8ffc..6f301814f1b01 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridFutureAdapter.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridFutureAdapter.java @@ -29,11 +29,11 @@ import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.internal.thread.context.function.OperationContextAwareInClosure; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.lang.GridClosureException; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteClosure; import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.lang.IgniteOutClosure; @@ -263,7 +263,7 @@ private R resolve() throws IgniteCheckedException { if (state == null || state.getClass() != ErrorWrapper.class) return (R)state; - throw U.cast(((ErrorWrapper)state).error); + throw CommonUtils.cast(((ErrorWrapper)state).error); } /** @@ -477,11 +477,11 @@ private void notifyListener(IgniteInClosure> lsn lsnr.apply(this); } catch (IllegalStateException e) { - U.error(logger(), "Failed to notify listener (is grid stopped?) [fut=" + this + + CommonUtils.error(logger(), "Failed to notify listener (is grid stopped?) [fut=" + this + ", lsnr=" + lsnr + ", err=" + e.getMessage() + ']', e); } catch (RuntimeException | Error e) { - U.error(logger(), "Failed to notify listener: " + lsnr, e); + CommonUtils.error(logger(), "Failed to notify listener: " + lsnr, e); throw e; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/future/GridFutureChainListener.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridFutureChainListener.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/future/GridFutureChainListener.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/future/GridFutureChainListener.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/ClusterNodeFunc.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/ClusterNodeFunc.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/lang/ClusterNodeFunc.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/lang/ClusterNodeFunc.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/IgniteInClosure2X.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/IgniteInClosure2X.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/lang/IgniteInClosure2X.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/lang/IgniteInClosure2X.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ContainsNodeIdsPredicate.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ContainsNodeIdsPredicate.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ContainsNodeIdsPredicate.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ContainsNodeIdsPredicate.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/EqualsClusterNodeIdPredicate.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/EqualsClusterNodeIdPredicate.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/EqualsClusterNodeIdPredicate.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/EqualsClusterNodeIdPredicate.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasEqualIdPredicate.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasEqualIdPredicate.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasEqualIdPredicate.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasEqualIdPredicate.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasNotEqualIdPredicate.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasNotEqualIdPredicate.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasNotEqualIdPredicate.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/HasNotEqualIdPredicate.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/typedef/CIX2.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/typedef/CIX2.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/typedef/CIX2.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/typedef/CIX2.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/worker/GridWorker.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/worker/GridWorker.java similarity index 96% rename from modules/core/src/main/java/org/apache/ignite/internal/util/worker/GridWorker.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/worker/GridWorker.java index e19e2170aa1db..414b8dac3c704 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/worker/GridWorker.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/worker/GridWorker.java @@ -24,9 +24,9 @@ import org.apache.ignite.IgniteInterruptedException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.IgniteInterruptedCheckedException; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; /** @@ -140,9 +140,10 @@ protected GridWorker(@Nullable String igniteInstanceName, String name, IgniteLog if (!X.hasCause(e, InterruptedException.class) && !X.hasCause(e, IgniteInterruptedCheckedException.class) && !X.hasCause(e, IgniteInterruptedException.class)) - U.error(log, "Runtime error caught during grid runnable execution: " + this, e); + CommonUtils.error(log, "Runtime error caught during grid runnable execution: " + this, e); else - U.warn(log, "Runtime exception occurred during grid runnable execution caused by thread interruption: " + e.getMessage()); + CommonUtils.warn(log, + "Runtime exception occurred during grid runnable execution caused by thread interruption: " + e.getMessage()); if (e instanceof Error) throw e; @@ -271,7 +272,7 @@ public boolean isDone() { /** {@inheritDoc} */ @Override public void updateHeartbeat() { - long curTs = U.currentTimeMillis(); + long curTs = CommonUtils.currentTimeMillis(); long hbTs = heartbeatTs; // Avoid heartbeat update while in the blocking section. @@ -290,7 +291,7 @@ public boolean isDone() { /** {@inheritDoc} */ @Override public void blockingSectionEnd() { - heartbeatTs = U.currentTimeMillis(); + heartbeatTs = CommonUtils.currentTimeMillis(); } /** Can be called from {@link #runner()} thread to perform idleness handling. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerListener.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerListener.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerListener.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerListener.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerPool.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerPool.java similarity index 95% rename from modules/core/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerPool.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerPool.java index 83f8fd8a30872..51b6a97bd3265 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerPool.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/worker/GridWorkerPool.java @@ -23,8 +23,8 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.compute.ComputeExecutionRejectedException; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridConcurrentHashSet; -import org.apache.ignite.internal.util.typedef.internal.U; /** * Pool of runnable workers. This class automatically takes care of @@ -102,9 +102,9 @@ public void join(boolean cancel) { for (GridWorker worker : workers) { try { if (cancel) - U.cancel(worker); + CommonUtils.cancel(worker); - U.join(worker, log); + CommonUtils.join(worker, log); } catch (Exception e) { if (log != null) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/worker/WorkProgressDispatcher.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/worker/WorkProgressDispatcher.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/worker/WorkProgressDispatcher.java rename to modules/commons/src/main/java/org/apache/ignite/internal/util/worker/WorkProgressDispatcher.java diff --git a/modules/core/src/main/java/org/apache/ignite/logger/NullLogger.java b/modules/commons/src/main/java/org/apache/ignite/logger/NullLogger.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/logger/NullLogger.java rename to modules/commons/src/main/java/org/apache/ignite/logger/NullLogger.java diff --git a/modules/core/src/main/java/org/apache/ignite/platform/PlatformServiceMethod.java b/modules/commons/src/main/java/org/apache/ignite/platform/PlatformServiceMethod.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/platform/PlatformServiceMethod.java rename to modules/commons/src/main/java/org/apache/ignite/platform/PlatformServiceMethod.java diff --git a/modules/core/src/main/java/org/apache/ignite/spi/tracing/Scope.java b/modules/commons/src/main/java/org/apache/ignite/spi/tracing/Scope.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/spi/tracing/Scope.java rename to modules/commons/src/main/java/org/apache/ignite/spi/tracing/Scope.java diff --git a/modules/core/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java b/modules/commons/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java rename to modules/commons/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java diff --git a/modules/core/src/main/java/org/apache/ignite/ssl/AbstractSslContextFactory.java b/modules/commons/src/main/java/org/apache/ignite/ssl/AbstractSslContextFactory.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/ssl/AbstractSslContextFactory.java rename to modules/commons/src/main/java/org/apache/ignite/ssl/AbstractSslContextFactory.java diff --git a/modules/core/src/main/java/org/apache/ignite/ssl/DelegatingSSLContextSpi.java b/modules/commons/src/main/java/org/apache/ignite/ssl/DelegatingSSLContextSpi.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/ssl/DelegatingSSLContextSpi.java rename to modules/commons/src/main/java/org/apache/ignite/ssl/DelegatingSSLContextSpi.java diff --git a/modules/core/src/main/java/org/apache/ignite/ssl/SSLContextWrapper.java b/modules/commons/src/main/java/org/apache/ignite/ssl/SSLContextWrapper.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/ssl/SSLContextWrapper.java rename to modules/commons/src/main/java/org/apache/ignite/ssl/SSLContextWrapper.java diff --git a/modules/core/src/main/java/org/apache/ignite/ssl/SSLServerSocketFactoryWrapper.java b/modules/commons/src/main/java/org/apache/ignite/ssl/SSLServerSocketFactoryWrapper.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/ssl/SSLServerSocketFactoryWrapper.java rename to modules/commons/src/main/java/org/apache/ignite/ssl/SSLServerSocketFactoryWrapper.java diff --git a/modules/core/src/main/java/org/apache/ignite/ssl/SSLSocketFactoryWrapper.java b/modules/commons/src/main/java/org/apache/ignite/ssl/SSLSocketFactoryWrapper.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/ssl/SSLSocketFactoryWrapper.java rename to modules/commons/src/main/java/org/apache/ignite/ssl/SSLSocketFactoryWrapper.java diff --git a/modules/core/src/main/java/org/apache/ignite/ssl/SslContextFactory.java b/modules/commons/src/main/java/org/apache/ignite/ssl/SslContextFactory.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/ssl/SslContextFactory.java rename to modules/commons/src/main/java/org/apache/ignite/ssl/SslContextFactory.java diff --git a/modules/core/src/main/java/org/apache/ignite/ssl/package-info.java b/modules/commons/src/main/java/org/apache/ignite/ssl/package-info.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/ssl/package-info.java rename to modules/commons/src/main/java/org/apache/ignite/ssl/package-info.java diff --git a/modules/core/src/main/java/org/apache/ignite/util/deque/FastSizeDeque.java b/modules/commons/src/main/java/org/apache/ignite/util/deque/FastSizeDeque.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/util/deque/FastSizeDeque.java rename to modules/commons/src/main/java/org/apache/ignite/util/deque/FastSizeDeque.java diff --git a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/junits/IgniteCompatibilityAbstractTest.java b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/junits/IgniteCompatibilityAbstractTest.java index b5bf5d91595b1..32dadf33964e4 100644 --- a/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/junits/IgniteCompatibilityAbstractTest.java +++ b/modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/junits/IgniteCompatibilityAbstractTest.java @@ -294,7 +294,9 @@ protected Set getExcluded(String ver, Collection dependencie "ignite-binary-impl", "ignite-commons", "ignite-grid-unsafe", - "ignite-thin-client-api" + "ignite-thin-client-api", + "ignite-thin-client-impl", + "ignite-nio" )); // During local development, classes from the target directory (for example, ignite/modules/commons/target/classes) // are included in the classpath. @@ -304,7 +306,9 @@ protected Set getExcluded(String ver, Collection dependencie "modules/binary/impl", "modules/commons", "modules/unsafe", - "modules/thin-client/api" + "modules/thin-client/api", + "modules/thin-client/impl", + "modules/nio" )); return excluded; diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckIncrementalSnapshotTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckIncrementalSnapshotTest.java index 21fe7d4091304..766d312dbcdaa 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckIncrementalSnapshotTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckIncrementalSnapshotTest.java @@ -29,6 +29,7 @@ import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.TestRecordingCommunicationSpi; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.management.cache.IdleVerifyResult; import org.apache.ignite.internal.pagemem.wal.IgniteWriteAheadLogManager; import org.apache.ignite.internal.pagemem.wal.record.DataRecord; @@ -223,7 +224,7 @@ public void testSecondSnapshotCorrupted() { load(xid -> { if (skipTxRec == null) { skipTxRec = (consId, rec) -> - grid(0).localNode().consistentId().equals(consId) && xid.equals(rec.nearXidVersion().asIgniteUuid()); + grid(0).localNode().consistentId().equals(consId) && xid.equals(BinaryUtils.asIgniteUuid(rec.nearXidVersion())); } }); @@ -248,7 +249,7 @@ public void testSecondSnapshotCorrupted() { load(xid -> { if (skipTxRec == null) { skipTxRec = (consId, rec) -> - grid(0).localNode().consistentId().equals(consId) && xid.equals(rec.nearXidVersion().asIgniteUuid()); + grid(0).localNode().consistentId().equals(consId) && xid.equals(BinaryUtils.asIgniteUuid(rec.nearXidVersion())); } }); @@ -308,7 +309,7 @@ public void testSecondSnapshotCorrupted() { if (skipDataRec == null) { skipDataRec = (consId, rec) -> grid(0).localNode().consistentId().equals(consId) - && xid.equals(rec.writeEntries().get(0).nearXidVersion().asIgniteUuid()); + && xid.equals(BinaryUtils.asIgniteUuid(rec.writeEntries().get(0).nearXidVersion())); } }); @@ -325,14 +326,14 @@ public void testSecondSnapshotCorrupted() { if (skipDataRec == null) { skipDataRec = (consId, rec) -> grid(0).localNode().consistentId().equals(consId) - && xid.equals(rec.writeEntries().get(0).nearXidVersion().asIgniteUuid()); + && xid.equals(BinaryUtils.asIgniteUuid(rec.writeEntries().get(0).nearXidVersion())); return; } if (skipTxRec == null) { skipTxRec = (consId, rec) -> - grid(0).localNode().consistentId().equals(consId) && xid.equals(rec.nearXidVersion().asIgniteUuid()); + grid(0).localNode().consistentId().equals(consId) && xid.equals(BinaryUtils.asIgniteUuid(rec.nearXidVersion())); } }); diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 1baad66b3c5a9..872fb04cce0c7 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -3163,11 +3163,14 @@ private void doClusterSnapshotCreate(boolean syncMode) throws Exception { MetricRegistry metrics = ig.context().metric().registry(SNAPSHOT_METRICS); - LongMetric opEndTimeMetric = metrics.findMetric("LastSnapshotEndTime"); - BooleanSupplier endTimeMetricPredicate = () -> opEndTimeMetric.value() > 0; + assertTrue(waitForCondition(() -> metrics.findMetric("LastRequestId") != null, getTestTimeout(), 50)); String reqId = metrics.findMetric("LastRequestId").getAsString(); - assertFalse(F.isEmpty(reqId)); + + assert reqId != null; + + LongMetric opEndTimeMetric = metrics.findMetric("LastSnapshotEndTime"); + BooleanSupplier endTimeMetricPredicate = () -> opEndTimeMetric.value() > 0; // Make sure the operation ID has been shown to the user. assertContains(log, testOut.toString(), reqId); diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java index 288484d8a1483..d927b361a758e 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java @@ -61,9 +61,9 @@ import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectEnum; import org.apache.ignite.internal.management.SystemViewCommand; import org.apache.ignite.internal.management.SystemViewTask; -import org.apache.ignite.internal.metric.SystemViewSelfTest.TestPredicate; -import org.apache.ignite.internal.metric.SystemViewSelfTest.TestRunnable; -import org.apache.ignite.internal.metric.SystemViewSelfTest.TestTransformer; +import org.apache.ignite.internal.metric.SystemViewExecutorsTest.TestRunnable; +import org.apache.ignite.internal.metric.SystemViewQueriesTest.TestPredicate; +import org.apache.ignite.internal.metric.SystemViewQueriesTest.TestTransformer; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState; import org.apache.ignite.internal.processors.cache.metric.SqlViewExporterSpiTest.TestAffinityFunction; @@ -93,8 +93,8 @@ import static org.apache.ignite.internal.management.SystemViewCommand.COLUMN_SEPARATOR; import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.NODES_SYS_VIEW; import static org.apache.ignite.internal.managers.systemview.ScanQuerySystemView.SCAN_QRY_SYS_VIEW; -import static org.apache.ignite.internal.metric.SystemViewSelfTest.TEST_PREDICATE; -import static org.apache.ignite.internal.metric.SystemViewSelfTest.TEST_TRANSFORMER; +import static org.apache.ignite.internal.metric.SystemViewQueriesTest.TEST_PREDICATE; +import static org.apache.ignite.internal.metric.SystemViewQueriesTest.TEST_TRANSFORMER; import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHES_VIEW; import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHE_GRPS_VIEW; import static org.apache.ignite.internal.processors.cache.GridCacheProcessor.CACHE_GRP_PAGE_LIST_VIEW; diff --git a/modules/core/pom.xml b/modules/core/pom.xml index aebc94795a5f5..4f5c28a412581 100644 --- a/modules/core/pom.xml +++ b/modules/core/pom.xml @@ -81,6 +81,18 @@ compile + + ${project.groupId} + ignite-thin-client-impl + compile + + + + ${project.groupId} + ignite-nio + compile + + ${project.groupId} ignite-codegen @@ -150,15 +162,15 @@ - org.eclipse.jetty - jetty-servlets + org.eclipse.jetty.ee11 + jetty-ee11-servlets ${jetty.version} test - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee11 + jetty-ee11-webapp ${jetty.version} test @@ -360,6 +372,8 @@ ${project.groupId}:ignite-binary-impl ${project.groupId}:ignite-grid-unsafe ${project.groupId}:ignite-thin-client-api + ${project.groupId}:ignite-thin-client-impl + ${project.groupId}:ignite-nio @@ -463,7 +477,7 @@ false - + diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java index b1c36a9015827..430f5bfbf734f 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java @@ -41,7 +41,6 @@ import org.apache.ignite.internal.processors.query.schema.SchemaIndexCachePartitionWorker; import org.apache.ignite.internal.processors.rest.GridRestCommand; import org.apache.ignite.internal.util.IgniteUtils; -import org.apache.ignite.lang.IgniteExperimental; import org.apache.ignite.mxbean.MetricsMxBean; import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry; @@ -134,8 +133,6 @@ import static org.apache.ignite.internal.util.GridReflectionCache.DFLT_REFLECTION_CACHE_SIZE; import static org.apache.ignite.internal.util.IgniteExceptionRegistry.DEFAULT_QUEUE_SIZE; import static org.apache.ignite.internal.util.IgniteUtils.DFLT_MBEAN_APPEND_CLASS_LOADER_ID; -import static org.apache.ignite.internal.util.nio.GridNioRecoveryDescriptor.DFLT_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT; -import static org.apache.ignite.internal.util.nio.GridNioServer.DFLT_IO_BALANCE_PERIOD; import static org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi.DFLT_DISCOVERY_CLIENT_RECONNECT_HISTORY_SIZE; import static org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi.DFLT_DISCOVERY_METRICS_QNT_WARN; import static org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi.DFLT_DISCO_FAILED_CLIENT_RECONNECT_DELAY; @@ -744,12 +741,6 @@ public final class IgniteSystemProperties extends IgniteCommonsSystemProperties defaults = "" + DFLT_DISCOVERY_HISTORY_SIZE) public static final String IGNITE_DISCOVERY_HISTORY_SIZE = "IGNITE_DISCOVERY_HISTORY_SIZE"; - /** Human-readable ID of a data center where the node is running. */ - @IgniteExperimental - @SystemProperty(value = "Data Center ID where local node is running. Not required for a single Data Center deployments", - type = String.class) - public static final String IGNITE_DATA_CENTER_ID = "IGNITE_DATA_CENTER_ID"; - /** Maximum number of discovery message history used to support client reconnect. */ @SystemProperty(value = "Maximum number of discovery message history used to support client reconnect", type = Integer.class, defaults = "" + DFLT_DISCOVERY_CLIENT_RECONNECT_HISTORY_SIZE) @@ -814,44 +805,6 @@ public final class IgniteSystemProperties extends IgniteCommonsSystemProperties @SystemProperty("Enables local store keeps primary only. Backward compatibility flag") public static final String IGNITE_LOCAL_STORE_KEEPS_PRIMARY_ONLY = "IGNITE_LOCAL_STORE_KEEPS_PRIMARY_ONLY"; - /** Defines path to the file that contains list of classes allowed to safe deserialization.*/ - @SystemProperty(value = "Path to the file that contains list of classes allowed to safe deserialization", - type = String.class) - public static final String IGNITE_MARSHALLER_WHITELIST = "IGNITE_MARSHALLER_WHITELIST"; - - /** Defines path to the file that contains list of classes disallowed to safe deserialization.*/ - @SystemProperty(value = "Path to the file that contains list of classes disallowed to safe deserialization", - type = String.class) - public static final String IGNITE_MARSHALLER_BLACKLIST = "IGNITE_MARSHALLER_BLACKLIST"; - - /** - * If this parameter is set to true, Ignite will automatically configure an ObjectInputFilter instance for the - * current JVM it is running in. - * Default value is {@code true}. - */ - @SystemProperty( - value = "If this parameter is set to true, Ignite will automatically configure an ObjectInputFilter" + - " instance for the current JVM it is running in. Filtering is based on class lists defined by the" + - " `IGNITE_MARSHALLER_WHITELIST` and `IGNITE_MARSHALLER_BLACKLIST` system properties or their default values." + - " Disabling it is not recommended because the Ignite host may be vulnerable to RCE attacks based on Java" + - " serialization mechanisms", - defaults = "true" - ) - public static final String IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION = "IGNITE_ENABLE_OBJECT_INPUT_FILTER_AUTOCONFIGURATION"; - - /** - * If set to {@code true}, then default selected keys set is used inside - * {@code GridNioServer} which lead to some extra garbage generation when - * processing selected keys. - *

- * Default value is {@code false}. Should be switched to {@code true} if there are - * any problems in communication layer. - */ - @SystemProperty("Enables default selected keys set to be used inside GridNioServer " + - "which lead to some extra garbage generation when processing selected keys. " + - "Should be switched to true if there are any problems in communication layer") - public static final String IGNITE_NO_SELECTOR_OPTS = "IGNITE_NO_SELECTOR_OPTS"; - /** * System property to specify period in milliseconds between calls of the SQL statements cache cleanup task. *

@@ -926,11 +879,6 @@ public final class IgniteSystemProperties extends IgniteCommonsSystemProperties + "when resolving local node's addresses", defaults = "true") public static final String IGNITE_IGNORE_LOCAL_HOST_NAME = "IGNITE_IGNORE_LOCAL_HOST_NAME"; - /** */ - @SystemProperty(value = "IO balance period in milliseconds", type = Long.class, - defaults = "" + DFLT_IO_BALANCE_PERIOD) - public static final String IGNITE_IO_BALANCE_PERIOD = "IGNITE_IO_BALANCE_PERIOD"; - /** * When set to {@code true} BinaryObject will be unwrapped before passing to IndexingSpi to preserve * old behavior query processor with IndexingSpi. @@ -1351,13 +1299,6 @@ public final class IgniteSystemProperties extends IgniteCommonsSystemProperties public static final String IGNITE_DISABLE_REBALANCING_CANCELLATION_OPTIMIZATION = "IGNITE_DISABLE_REBALANCING_CANCELLATION_OPTIMIZATION"; - /** - * Sets timeout for TCP client recovery descriptor reservation. - */ - @SystemProperty(value = "Timeout for TCP client recovery descriptor reservation in milliseconds", - type = Long.class, defaults = "" + DFLT_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT) - public static final String IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT = - "IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT"; /** * When set to {@code true}, Ignite will skip partitions sizes check on partition validation after rebalance has finished. diff --git a/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java b/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java index 3c14f5d2615f0..78a776e50c5ce 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java @@ -37,12 +37,12 @@ import org.apache.ignite.failure.FailureType; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.processors.cache.GridCacheUtils; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.LT; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteBiPredicate; import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.resources.IgniteInstanceResource; @@ -117,7 +117,7 @@ public class RendezvousAffinityFunction implements AffinityFunction, Serializabl * @return Mask to use in calculation when partitions count is power of 2. */ public static int calculateMask(int parts) { - return (parts & (parts - 1)) == 0 ? parts - 1 : -1; + return CommonUtils.calculateMask(parts); } /** @@ -129,13 +129,7 @@ public static int calculateMask(int parts) { * @return Partition number for a given key. */ public static int calculatePartition(Object key, int mask, int parts) { - if (mask >= 0) { - int h; - - return ((h = key.hashCode()) ^ (h >>> 16)) & mask; - } - - return U.safeAbs(key.hashCode() % parts); + return CommonUtils.calculatePartition(key, mask, parts); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java index 4a8d52e81e770..ce1bc69c9b77d 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java @@ -52,10 +52,10 @@ import org.apache.ignite.cache.store.CacheStore; import org.apache.ignite.cache.store.CacheStoreSessionListener; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; -import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteExperimental; @@ -1984,7 +1984,7 @@ public CacheConfiguration setIndexedTypes(Class... indexedTypes) { qryEntities.add(newEntity); // Set key configuration if needed. - String affFieldName = CU.affinityFieldName(keyCls); + String affFieldName = BinaryUtils.affinityFieldName(keyCls); if (affFieldName != null) { CacheKeyConfiguration newKeyCfg = new CacheKeyConfiguration(newEntity.getKeyType(), affFieldName); diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/ClientConnectorConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/ClientConnectorConfiguration.java index 8a993bcc5304d..9f5b62b25e729 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/ClientConnectorConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/ClientConnectorConfiguration.java @@ -19,6 +19,7 @@ import javax.cache.configuration.Factory; import javax.net.ssl.SSLContext; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.ssl.SslContextFactory; @@ -29,10 +30,10 @@ */ public class ClientConnectorConfiguration { /** Default port. */ - public static final int DFLT_PORT = 10800; + public static final int DFLT_PORT = CommonUtils.DFLT_PORT; /** Default port range. */ - public static final int DFLT_PORT_RANGE = 100; + public static final int DFLT_PORT_RANGE = CommonUtils.DFLT_PORT_RANGE; /** Default socket send and receive buffer size. */ public static final int DFLT_SOCK_BUF_SIZE = 0; diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/ConnectorConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/ConnectorConfiguration.java index 00c5413dd374e..238f6ce8c48b2 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/ConnectorConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/ConnectorConfiguration.java @@ -21,6 +21,7 @@ import javax.cache.configuration.Factory; import javax.net.ssl.SSLContext; import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.internal.util.nio.GridNioServer; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.ssl.SslContextFactory; @@ -40,7 +41,7 @@ public class ConnectorConfiguration { public static final boolean DFLT_TCP_DIRECT_BUF = false; /** Default REST idle timeout. */ - public static final int DFLT_IDLE_TIMEOUT = 7000; + public static final int DFLT_IDLE_TIMEOUT = GridNioServer.DFLT_IDLE_TIMEOUT; /** Default rest port range. */ public static final int DFLT_PORT_RANGE = 100; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java index 9da592635d229..10ceff0dfbc8d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java @@ -28,7 +28,6 @@ import org.apache.ignite.internal.managers.communication.CompressedMessage; import org.apache.ignite.internal.managers.communication.ErrorMessage; import org.apache.ignite.internal.managers.communication.GridIoMessage; -import org.apache.ignite.internal.managers.communication.GridIoSecurityAwareMessage; import org.apache.ignite.internal.managers.communication.GridIoUserMessage; import org.apache.ignite.internal.managers.communication.IgniteIoTestMessage; import org.apache.ignite.internal.managers.communication.SessionChannelMessage; @@ -37,13 +36,16 @@ import org.apache.ignite.internal.managers.deployment.GridDeploymentResponse; import org.apache.ignite.internal.managers.discovery.SecurityAwareCustomMessageWrapper; import org.apache.ignite.internal.managers.encryption.ChangeCacheEncryptionRequest; +import org.apache.ignite.internal.managers.encryption.EncryptionDataBagItem; import org.apache.ignite.internal.managers.encryption.GenerateEncryptionKeyRequest; import org.apache.ignite.internal.managers.encryption.GenerateEncryptionKeyResponse; import org.apache.ignite.internal.managers.encryption.GroupKeyEncrypted; import org.apache.ignite.internal.managers.encryption.MasterKeyChangeRequest; import org.apache.ignite.internal.managers.encryption.NodeEncryptionKeys; +import org.apache.ignite.internal.managers.eventstorage.EventsDataBagItem; import org.apache.ignite.internal.managers.eventstorage.GridEventStorageMessage; import org.apache.ignite.internal.plugin.AbstractMarshallableMessageFactoryProvider; +import org.apache.ignite.internal.processors.authentication.AuthentificationDataBagItem; import org.apache.ignite.internal.processors.authentication.User; import org.apache.ignite.internal.processors.authentication.UserAcceptedMessage; import org.apache.ignite.internal.processors.authentication.UserAuthenticateRequestMessage; @@ -72,7 +74,7 @@ import org.apache.ignite.internal.processors.cache.WalStateFinishMessage; import org.apache.ignite.internal.processors.cache.WalStateProposeMessage; import org.apache.ignite.internal.processors.cache.binary.BinaryMetadataVersionInfo; -import org.apache.ignite.internal.processors.cache.binary.BinaryMetadataVersionsData; +import org.apache.ignite.internal.processors.cache.binary.CacheBinaryDataBagItem; import org.apache.ignite.internal.processors.cache.binary.MetadataRemoveAcceptedMessage; import org.apache.ignite.internal.processors.cache.binary.MetadataRemoveProposedMessage; import org.apache.ignite.internal.processors.cache.binary.MetadataRequestMessage; @@ -98,6 +100,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxOnePhaseCommitAckRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareResponse; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxSalvageMessage; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnlockRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessage; import org.apache.ignite.internal.processors.cache.distributed.dht.TransactionAttributesAwareRequest; @@ -176,12 +179,12 @@ import org.apache.ignite.internal.processors.cache.verify.PartitionHashRecord; import org.apache.ignite.internal.processors.cache.verify.TransactionsHashRecord; import org.apache.ignite.internal.processors.cache.version.GridCacheRawVersionedEntry; -import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; -import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx; import org.apache.ignite.internal.processors.cluster.CacheMetricsMessage; import org.apache.ignite.internal.processors.cluster.ChangeGlobalStateFinishMessage; import org.apache.ignite.internal.processors.cluster.ChangeGlobalStateMessage; +import org.apache.ignite.internal.processors.cluster.ClusterIdAndTag; import org.apache.ignite.internal.processors.cluster.ClusterMetricsUpdateMessage; +import org.apache.ignite.internal.processors.cluster.ClusterUpdateNotifierDataBagItem; import org.apache.ignite.internal.processors.cluster.NodeFullMetricsMessage; import org.apache.ignite.internal.processors.cluster.NodeMetricsMessage; import org.apache.ignite.internal.processors.continuous.ContinuousRoutineStartResultMessage; @@ -197,15 +200,15 @@ import org.apache.ignite.internal.processors.marshaller.MappedName; import org.apache.ignite.internal.processors.marshaller.MappingAcceptedMessage; import org.apache.ignite.internal.processors.marshaller.MappingProposedMessage; +import org.apache.ignite.internal.processors.marshaller.MarshallerDataBagItem; import org.apache.ignite.internal.processors.marshaller.MarshallerMappingItem; -import org.apache.ignite.internal.processors.marshaller.MarshallerMappingsData; import org.apache.ignite.internal.processors.marshaller.MissingMappingRequestMessage; import org.apache.ignite.internal.processors.marshaller.MissingMappingResponseMessage; import org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageCasAckMessage; import org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageCasMessage; import org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageUpdateAckMessage; import org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageUpdateMessage; -import org.apache.ignite.internal.processors.query.InlineSizesData; +import org.apache.ignite.internal.processors.plugin.PluginsDataBagItem; import org.apache.ignite.internal.processors.query.QueryField; import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryCancelRequest; import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryFailResponse; @@ -213,6 +216,10 @@ import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageResponse; import org.apache.ignite.internal.processors.query.messages.GridQueryKillRequest; import org.apache.ignite.internal.processors.query.messages.GridQueryKillResponse; +import org.apache.ignite.internal.processors.query.schema.message.QueryEntityExMessage; +import org.apache.ignite.internal.processors.query.schema.message.QueryEntityMessage; +import org.apache.ignite.internal.processors.query.schema.message.QueryInlineSizesDataBagItem; +import org.apache.ignite.internal.processors.query.schema.message.QueryProposalsDataBagItem; import org.apache.ignite.internal.processors.query.schema.message.SchemaFinishDiscoveryMessage; import org.apache.ignite.internal.processors.query.schema.message.SchemaOperationStatusMessage; import org.apache.ignite.internal.processors.query.schema.message.SchemaProposeDiscoveryMessage; @@ -229,6 +236,10 @@ import org.apache.ignite.internal.processors.query.stat.messages.StatisticsResponse; import org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultRequest; import org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultResponse; +import org.apache.ignite.internal.processors.rollingupgrade.RollingUpgradeClusterData; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteComponentFeatureSet; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeatureSet; +import org.apache.ignite.internal.processors.security.SecurityContextWrapper; import org.apache.ignite.internal.processors.service.ServiceChangeBatchRequest; import org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResult; import org.apache.ignite.internal.processors.service.ServiceClusterDeploymentResultBatch; @@ -238,6 +249,7 @@ import org.apache.ignite.internal.processors.service.ServiceSingleNodeDeploymentResultBatch; import org.apache.ignite.internal.processors.service.ServiceUndeploymentRequest; import org.apache.ignite.internal.util.GridByteArrayList; +import org.apache.ignite.internal.util.GridIntList; import org.apache.ignite.internal.util.GridPartitionStateMap; import org.apache.ignite.internal.util.distributed.FullMessage; import org.apache.ignite.internal.util.distributed.InitMessage; @@ -253,7 +265,7 @@ import org.apache.ignite.spi.communication.tcp.messages.HandshakeWaitMessage; import org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage; import org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage; -import org.apache.ignite.spi.discovery.ObjectData; +import org.apache.ignite.spi.discovery.SerializableDataBagItemWrapper; import org.apache.ignite.spi.discovery.tcp.internal.DiscoveryDataPacket; import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode; import org.apache.ignite.spi.discovery.tcp.messages.InetAddressMessage; @@ -350,11 +362,10 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchema(DiscoveryDataPacket.class); withNoSchema(GridByteArrayList.class); withNoSchema(CacheVersionedValue.class); - withNoSchema(GridCacheVersion.class); - withNoSchema(GridCacheVersionEx.class); withNoSchema(WALPointer.class); - withNoSchemaResolvedClassLoader(ObjectData.class); + withNoSchemaResolvedClassLoader(SerializableDataBagItemWrapper.class); withSchemaResolvedClassLoader(GridTopicMessage.class); + withNoSchema(GridIntList.class); // [5700 - 5900]: Discovery originated messages. msgIdx = 5700; @@ -573,8 +584,12 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchema(StatisticsRequest.class); withNoSchema(StatisticsResponse.class); withNoSchema(CacheContinuousQueryBatchAck.class); + withNoSchema(GridDhtTxSalvageMessage.class); withSchema(CacheContinuousQueryEntry.class); - withNoSchema(InlineSizesData.class); + withNoSchema(QueryInlineSizesDataBagItem.class); + withNoSchema(QueryProposalsDataBagItem.class); + withNoSchema(QueryEntityMessage.class); + withNoSchema(QueryEntityExMessage.class); // [11200 - 11300]: Compute, distributed process messages. msgIdx = 11200; @@ -593,12 +608,13 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C // [11500 - 11600]: IO, networking messages. msgIdx = NODE_ID_MSG_TYPE; withNoSchema(NodeIdMessage.class); + msgIdx = HANDSHAKE_MSG_TYPE; withNoSchema(HandshakeMessage.class); + msgIdx = HANDSHAKE_WAIT_MSG_TYPE; withNoSchema(HandshakeWaitMessage.class); withNoSchema(GridIoMessage.class); withNoSchema(IgniteIoTestMessage.class); withSchema(GridIoUserMessage.class); - withSchema(GridIoSecurityAwareMessage.class); withNoSchema(RecoveryLastReceivedMessage.class); withNoSchema(TcpInverseConnectionResponseMessage.class); withNoSchema(SessionChannelMessage.class); @@ -628,6 +644,7 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchema(UserAuthenticateRequestMessage.class); withNoSchema(UserAuthenticateResponseMessage.class); withNoSchema(TcpDiscoveryAuthFailedMessage.class); + withNoSchema(AuthentificationDataBagItem.class); // [12200 - 12300]: Binary, classloading and marshalling messages. msgIdx = 12200; @@ -640,9 +657,9 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchema(MetadataResponseMessage.class); withNoSchema(MarshallerMappingItem.class); withSchemaResolvedClassLoader(BinaryMetadataVersionInfo.class); - withNoSchema(BinaryMetadataVersionsData.class); + withNoSchema(CacheBinaryDataBagItem.class); withNoSchema(MappedName.class); - withNoSchema(MarshallerMappingsData.class); + withNoSchema(MarshallerDataBagItem.class); // [12400 - 12500]: Encryption messages. msgIdx = 12400; @@ -652,8 +669,9 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchema(MasterKeyChangeRequest.class); withNoSchema(GroupKeyEncrypted.class); withNoSchema(NodeEncryptionKeys.class); + withNoSchema(EncryptionDataBagItem.class); - // [13000 - 13300]: Control, configuration, diagnostincs and other messages. + // [13000 - 13300]: Control, configuration, diagnostics and other messages. msgIdx = 13000; withSchema(GridEventStorageMessage.class); withNoSchema(ChangeGlobalStateMessage.class); @@ -665,6 +683,21 @@ public CoreMessagesProvider(Marshaller dfltMarsh, Marshaller schemaAwareMarsh, C withNoSchemaResolvedClassLoader(DynamicCacheChangeRequest.class); withNoSchema(PartitionHashRecord.class); withNoSchema(TransactionsHashRecord.class); + withNoSchema(ClusterIdAndTag.class); + withNoSchema(ClusterUpdateNotifierDataBagItem.class); + withNoSchemaResolvedClassLoader(PluginsDataBagItem.class); + withSchema(EventsDataBagItem.class); + + // [13400 - 13500]: Operation context messages. + msgIdx = 13400; + withNoSchema(OperationContextMessage.class); + withNoSchema(SecurityContextWrapper.class); + + // [13600 - 13700]: Rolling Upgrade messages. + msgIdx = 13600; + withNoSchema(IgniteFeatureSet.class); + withNoSchema(IgniteComponentFeatureSet.class); + withNoSchema(RollingUpgradeClusterData.class); assert msgIdx <= MAX_MESSAGE_ID; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java b/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java index 87d769bf3d7de..95913aec95f1c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java @@ -82,7 +82,10 @@ enum DiscoveryDataExchangeType { PERFORMANCE_STAT_PROC, /** Event storage manager. */ - EVENT_MGR; + EVENT_MGR, + + /** Rolling upgrade processor. */ + ROLLING_UPGRADE_PROC; /** Cached values array. */ public static final DiscoveryDataExchangeType[] VALUES = values(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java index 744a844f88e2f..cab4d2a814686 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java @@ -78,6 +78,7 @@ import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor; import org.apache.ignite.internal.processors.tracing.Tracing; import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions; +import org.apache.ignite.internal.thread.context.OperationContextDispatcher; import org.apache.ignite.internal.util.IgniteExceptionRegistry; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.worker.WorkersRegistry; @@ -211,12 +212,19 @@ public interface GridKernalContext extends Iterable { public MaintenanceRegistry maintenanceRegistry(); /** - * Gets core message factoy. + * Gets core message factory. * * @return Core message factory. */ public MessageFactory messageFactory(); + /** + * Gets the distributed operation context dispatcher. + * + * @return The distributed operation context dispatcher. + */ + public OperationContextDispatcher operationContextDispatcher(); + /** * Gets transformation processor. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java index 5d779302d1f7b..fb3dcdb3412a7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java @@ -101,6 +101,7 @@ import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor; import org.apache.ignite.internal.processors.tracing.Tracing; import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions; +import org.apache.ignite.internal.thread.context.OperationContextDispatcher; import org.apache.ignite.internal.thread.pool.IgniteForkJoinPool; import org.apache.ignite.internal.util.IgniteExceptionRegistry; import org.apache.ignite.internal.util.spring.IgniteSpringHelper; @@ -697,6 +698,11 @@ else if (!(comp instanceof DiscoveryNodeValidationProcessor return grid.messageFactory(); } + /** {@inheritDoc} */ + @Override public OperationContextDispatcher operationContextDispatcher() { + return grid.operationContextDispatcher(); + } + /** {@inheritDoc} */ @Override public CacheObjectTransformerProcessor transformer() { return transProc; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java b/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java index f0e1a7c7b627a..56795c7ce11b7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridPluginComponent.java @@ -17,10 +17,10 @@ package org.apache.ignite.internal; -import java.io.Serializable; -import java.util.Map; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.processors.plugin.PluginsDataBagItem; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteFuture; import org.apache.ignite.plugin.PluginProvider; import org.apache.ignite.plugin.PluginValidationException; @@ -115,10 +115,10 @@ public PluginProvider plugin() { @Nullable @Override public IgniteNodeValidationResult validateNode(ClusterNode node, JoiningNodeDiscoveryData discoData) { try { - Map map = discoData.joiningNodeData(); + PluginsDataBagItem pluginsItem = discoData.joiningNodeData(); - if (map != null) - plugin.validateNewNode(node, map.get(plugin.name())); + if (pluginsItem != null && !F.isEmpty(pluginsItem.data())) + plugin.validateNewNode(node, pluginsItem.data().get(plugin.name())); else plugin.validateNewNode(node, null); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java index 8e9e483af45ef..6a895088bf711 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java @@ -208,7 +208,7 @@ public T createIfInClassPath(GridKernalContext ctx, boolean mandatory) try { Class.forName(cls); } - catch (ClassNotFoundException e) { + catch (ClassNotFoundException | LinkageError e) { if (mandatory) throw componentException(e); @@ -263,7 +263,7 @@ private T createOptional0(@Nullable GridKernalContext ctx) throws IgniteChec try { cls = Class.forName(clsName); } - catch (ClassNotFoundException ignored) { + catch (ClassNotFoundException | LinkageError ignored) { try { cls = Class.forName(noOpClsName); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 8e92f8118fcec..063774e7b13b5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -174,6 +174,7 @@ import org.apache.ignite.internal.suggestions.JvmConfigurationSuggestions; import org.apache.ignite.internal.suggestions.OsConfigurationSuggestions; import org.apache.ignite.internal.systemview.ConfigurationViewWalker; +import org.apache.ignite.internal.thread.context.OperationContextDispatcher; import org.apache.ignite.internal.util.TimeBag; import org.apache.ignite.internal.util.future.GridCompoundFuture; import org.apache.ignite.internal.util.future.GridFinishedFuture; @@ -444,6 +445,9 @@ public class IgniteKernal implements IgniteEx, Externalizable { /** Core message factory. */ private MessageFactory msgFactory; + /** Distributed operation context dispatcher. */ + private OperationContextDispatcher operationCtxDispatcher; + /** * No-arg constructor is required by externalization. */ @@ -930,6 +934,8 @@ public void start( longJVMPauseDetector ); + operationCtxDispatcher = new OperationContextDispatcher(); + startProcessor(new DiagnosticProcessor(ctx)); mBeansMgr = new IgniteMBeansManager(this); @@ -1152,6 +1158,8 @@ public void start( // All components exept Discovery are started, time to check if maintenance is still needed. mntcProc.prepareAndExecuteMaintenance(); + operationCtxDispatcher.finishRegistration(); + gw.writeLock(); try { @@ -3059,6 +3067,11 @@ MessageFactory messageFactory() { return msgFactory; } + /** @return Distributed operation context dispatcher. */ + OperationContextDispatcher operationContextDispatcher() { + return operationCtxDispatcher; + } + /** * Method is responsible for handling the {@link EventType#EVT_CLIENT_NODE_DISCONNECTED} event. Notify all the * GridComponents that the such even has been occurred (e.g. if the local client node disconnected from the cluster diff --git a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java index fda923e3596db..2521be22a8e93 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java @@ -19,10 +19,12 @@ import java.io.File; import java.io.IOException; +import java.net.URL; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -34,6 +36,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.function.BiPredicate; +import java.util.function.Consumer; import java.util.function.Function; import javax.management.MBeanServer; import org.apache.ignite.IgniteCheckedException; @@ -125,7 +128,7 @@ public MarshallerContextImpl(@Nullable Collection plugins, Ignit try { ClassLoader ldr = U.gridClassLoader(); - MarshallerUtils.processSystemClasses(ldr, plugins, clsName -> { + processSystemClasses(ldr, plugins, clsName -> { int typeId = clsName.hashCode(); MappedName oldClsName; @@ -709,6 +712,29 @@ public void setMarshallerMappingFileStoreDir(@Nullable final File marshallerMapp this.marshallerMappingFileStoreDir = marshallerMappingFileStoreDir; } + /** + * Finds all system class names (JDK, Ignite and plugin classes) and processes them with the given consumer. + * + * @param ldr Class loader. + * @param plugins Plugins (may be {@code null}). + * @param proc Class processor (class name consumer). + * @throws IOException In case of error. + */ + private static void processSystemClasses(ClassLoader ldr, @Nullable Collection plugins, + Consumer proc) throws IOException { + MarshallerUtils.processSystemClasses(ldr, proc); + + if (plugins != null && !plugins.isEmpty()) { + for (PluginProvider plugin : plugins) { + Enumeration pluginUrls = ldr.getResources("META-INF/" + plugin.name().toLowerCase() + + ".classnames.properties"); + + while (pluginUrls.hasMoreElements()) + MarshallerUtils.processResource(pluginUrls.nextElement(), proc); + } + } + } + /** * */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridDirectCollection.java b/modules/core/src/main/java/org/apache/ignite/internal/OperationContextMessage.java similarity index 60% rename from modules/core/src/main/java/org/apache/ignite/internal/GridDirectCollection.java rename to modules/core/src/main/java/org/apache/ignite/internal/OperationContextMessage.java index 1d7ff1fc0633b..9dc9fdb82ccea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridDirectCollection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/OperationContextMessage.java @@ -17,23 +17,26 @@ package org.apache.ignite.internal; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import org.apache.ignite.internal.thread.context.OperationContext; +import org.apache.ignite.internal.thread.context.OperationContextDispatcher; import org.apache.ignite.plugin.extensions.communication.Message; /** - * Annotates iterable fields. - * Note that for any {@link Message} implementations it is enough to set item type to {@code Message.class}. - * Deprecated, see {@link Order} and {@link MessageProcessor} for details. + * Message for {@link OperationContext} distributed attributes. + * + * @see OperationContextDispatcher */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -@Deprecated -public @interface GridDirectCollection { - /** - * @return Item type. - */ - Class value(); +public class OperationContextMessage implements Message { + /** Values of operation context attributes. */ + @Order(0) + public Message[] vals; + + /** Bitmap of effective attributes ids. */ + @Order(1) + public byte idBitmap; + + /** Empty constructor for serialization purposes. */ + public OperationContextMessage() { + // No-op. + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/QueryIndexMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/QueryIndexMessage.java index c42415be029b4..1bdb38fc3f0a1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/QueryIndexMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/QueryIndexMessage.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.cache.query; -import java.io.Serializable; import java.util.LinkedHashMap; import org.apache.ignite.cache.QueryIndex; import org.apache.ignite.cache.QueryIndexType; @@ -28,10 +27,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageFactory; /** Message for {@link QueryIndex}. */ -public class QueryIndexMessage implements Serializable, Message { - /** */ - private static final long serialVersionUID = 0L; - +public class QueryIndexMessage implements Message { /** Index name. */ @Order(0) public String name; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterTopologyCheckedException.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterTopologyCheckedException.java index bd194b7acba35..8da622fbea383 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterTopologyCheckedException.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterTopologyCheckedException.java @@ -19,12 +19,13 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.future.GridCompoundFuture.SkipLoggingException; import org.jetbrains.annotations.Nullable; /** * This exception is used to indicate error with grid topology (e.g., crashed node, etc.). */ -public class ClusterTopologyCheckedException extends IgniteCheckedException { +public class ClusterTopologyCheckedException extends IgniteCheckedException implements SkipLoggingException { /** */ private static final long serialVersionUID = 0L; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java index c5b2f3474fbc6..045db2f8cf9b9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java @@ -30,6 +30,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.KeyCacheObject; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.internal.util.tostring.GridToStringInclude; @@ -433,6 +434,17 @@ public ByteBuffer getBuffer() { return v; } + /** {@inheritDoc} */ + @Override public GridCacheVersion readGridCacheVersion() { + DirectByteBufferStream stream = state.item().stream; + + GridCacheVersion v = stream.readGridCacheVersion(); + + lastRead = stream.lastFinished(); + + return v; + } + /** {@inheritDoc} */ @Override public boolean isLastRead() { return lastRead; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java index ba4846b64a305..134e11f53cd50 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java @@ -30,6 +30,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.KeyCacheObject; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; @@ -404,6 +405,15 @@ public ByteBuffer getBuffer() { return stream.lastFinished(); } + /** {@inheritDoc} */ + @Override public boolean writeGridCacheVersion(GridCacheVersion ver) { + DirectByteBufferStream stream = state.item().stream; + + stream.writeGridCacheVersion(ver); + + return stream.lastFinished(); + } + /** {@inheritDoc} */ @Override public boolean isHeaderWritten() { return state.item().hdrWritten; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStream.java b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStream.java index 2192272747cd9..ada462de4f370 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStream.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStream.java @@ -36,6 +36,8 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.KeyCacheObject; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx; import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.internal.util.GridUnsafe; @@ -2091,6 +2093,11 @@ protected void write(MessageType type, Object val, MessageWriter writer) break; + case GRID_CACHE_VERSION: + writeGridCacheVersion((GridCacheVersion)val); + + break; + case AFFINITY_TOPOLOGY_VERSION: writeAffinityTopologyVersion((AffinityTopologyVersion)val); @@ -2215,6 +2222,9 @@ protected Object read(MessageType type, MessageReader reader) { case IGNITE_UUID: return readIgniteUuid(); + case GRID_CACHE_VERSION: + return readGridCacheVersion(); + case AFFINITY_TOPOLOGY_VERSION: return readAffinityTopologyVersion(); @@ -2307,104 +2317,292 @@ private void readUuidRaw() { /** */ public void writeIgniteProductVersion(IgniteProductVersion ver) { if (ver == null) { - lastFinished = buf.remaining() >= 1; - - if (!lastFinished) - return; - - buf.put((byte)0); + writeByte((byte)0); return; } - if (!msgTypeDone) { - if (buf.remaining() < 4) { - lastFinished = false; + switch (uuidState) { + case 0: + writeByte((byte)1); - return; - } + if (!lastFinished) + return; - buf.put((byte)1); - buf.put(ver.major()); - buf.put(ver.minor()); - buf.put(ver.maintenance()); + uuidState++; + case 1: + writeByte(ver.major()); - msgTypeDone = true; - } + if (!lastFinished) + return; - if (!keyDone) { - writeLong(ver.revisionTimestamp()); + uuidState++; - if (!lastFinished) - return; + case 2: + writeByte(ver.minor()); - keyDone = true; - } + if (!lastFinished) + return; - writeByteArray(ver.revisionHash()); + uuidState++; + case 3: + writeByte(ver.maintenance()); - if (!lastFinished) - return; + if (!lastFinished) + return; + + uuidState++; + case 4: + writeLong(ver.revisionTimestamp()); + + if (!lastFinished) + return; - msgTypeDone = false; - keyDone = false; + uuidState++; + case 5: + writeByteArray(ver.revisionHash()); + + if (!lastFinished) + return; + + uuidState = 0; + + return; + default: + throw new IllegalStateException("Unexpected state: " + uuidState); + } } /** */ public IgniteProductVersion readIgniteProductVersion() { - if (buf.remaining() < 1) { - lastFinished = false; + switch (uuidState) { + case 0: + byte notNull = readByte(); - return null; - } + if (!lastFinished) + return null; - if (cur == NULL || cur == null) { - if (buf.get() == (byte)0) { - lastFinished = true; + if (notNull == 0) + return null; - return null; - } + cur = new IgniteProductVersionEx(); - cur = new IgniteProductVersionEx(); - } + uuidState++; + case 1: + ((IgniteProductVersionEx)cur).major(readByte()); - if (!msgTypeDone) { - if (buf.remaining() < 3) { - lastFinished = false; + if (!lastFinished) + return null; - return null; - } + uuidState++; + case 2: + ((IgniteProductVersionEx)cur).minor(readByte()); - ((IgniteProductVersionEx)cur).version(buf.get(), buf.get(), buf.get()); + if (!lastFinished) + return null; - msgTypeDone = true; + uuidState++; + case 3: + ((IgniteProductVersionEx)cur).maintenance(readByte()); + + if (!lastFinished) + return null; + + uuidState++; + case 4: + ((IgniteProductVersionEx)cur).revisionTimestamp(readLong()); + + if (!lastFinished) + return null; + + uuidState++; + + case 5: + ((IgniteProductVersionEx)cur).revisionHash(readByteArray()); + + if (!lastFinished) + return null; + + IgniteProductVersionEx res = (IgniteProductVersionEx)cur; + + cur = NULL; + uuidState = 0; + + return res; + default: + throw new IllegalStateException("Unexpected state: " + uuidState); } + } - if (!keyDone) { - long revTs = readLong(); + /** */ + public void writeGridCacheVersion(GridCacheVersion ver) { + if (ver == null) { + writeByte((byte)0); - if (!lastFinished) - return null; + return; + } - keyDone = true; + switch (uuidState) { + case 0: + byte type; - ((IgniteProductVersionEx)cur).revisionTimestamp(revTs); + if (ver.conflictVersion() == ver) + type = (byte)1; + else if (ver instanceof GridCacheVersionEx) + type = (byte)2; + else + throw new IllegalArgumentException("Unknown GridCacheVersion child: " + ver); + + writeByte(type); + + if (!lastFinished) + return; + + uuidState++; + case 1: + writeInt(ver.topologyVersion()); + + if (!lastFinished) + return; + + uuidState++; + + case 2: + writeInt(ver.nodeOrderAndDrIdRaw()); + + if (!lastFinished) + return; + + uuidState++; + case 3: + writeLong(ver.order()); + + if (!lastFinished) + return; + + uuidState++; + case 4: + if (ver.conflictVersion() == ver) { + lastFinished = true; + + uuidState = 0; + + return; + } + + writeInt(ver.conflictVersion().topologyVersion()); + + if (!lastFinished) + return; + + uuidState++; + case 5: + writeInt(ver.conflictVersion().nodeOrderAndDrIdRaw()); + + if (!lastFinished) + return; + + uuidState++; + case 6: + writeLong(ver.conflictVersion().order()); + + if (!lastFinished) + return; + + uuidState = 0; + + return; + + default: + throw new IllegalStateException("Unexpected state: " + uuidState); } + } + + /** */ + public GridCacheVersion readGridCacheVersion() { + GridCacheVersion ver = cur != NULL ? (GridCacheVersion)cur : null; - byte[] revHash = readByteArray(); + switch (uuidState) { + case 0: + byte type = readByte(); - if (!lastFinished) - return null; + if (!lastFinished) + return null; + + // 0 -> NULL + // 1 -> GridCacheVersion + // 2 -> GridCacheVersionEx + if (type == 0) + return null; + else if (type == 1) + ver = new GridCacheVersion(); + else if (type == 2) { + ver = new GridCacheVersionEx(); + + ((GridCacheVersionEx)ver).conflictVersion(new GridCacheVersion()); + } + else + throw new IllegalArgumentException("Unknown GridCacheVersion type: " + type); + + cur = ver; + + uuidState++; + + case 1: + ver.topologyVersion(readInt()); + + if (!lastFinished) + return null; + + uuidState++; + case 2: + ver.nodeOrderAndDrIdRaw(readInt()); + + if (!lastFinished) + return null; - IgniteProductVersionEx res = (IgniteProductVersionEx)cur; + uuidState++; + case 3: + ver.order(readLong()); + + if (!lastFinished) + return null; + + uuidState++; + case 4: + if (ver.conflictVersion() == ver) { + cur = NULL; + uuidState = 0; + + return ver; + } + + ver.conflictVersion().topologyVersion(readInt()); + + if (!lastFinished) + return null; - res.revisionHash(revHash); + uuidState++; + case 5: + ver.conflictVersion().nodeOrderAndDrIdRaw(readInt()); - cur = NULL; - msgTypeDone = false; - keyDone = false; + if (!lastFinished) + return null; - return res; + uuidState++; + case 6: + ver.conflictVersion().order(readLong()); + + if (!lastFinished) + return null; + + cur = NULL; + uuidState = 0; + + return ver; + default: + throw new IllegalStateException("Unexpected state: " + uuidState); + } } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/IgniteProductVersionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/IgniteProductVersionEx.java index 5037ce51dd7ec..7da9f6597da4d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/IgniteProductVersionEx.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/IgniteProductVersionEx.java @@ -29,9 +29,17 @@ public class IgniteProductVersionEx extends IgniteProductVersion { private static final long serialVersionUID = 0L; /** */ - public void version(byte major, byte minor, byte maintenance) { + public void major(byte major) { this.major = major; + } + + /** */ + public void minor(byte minor) { this.minor = minor; + } + + /** */ + public void maintenance(byte maintenance) { this.maintenance = maintenance; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java index 619057cd6ce9d..64e1fb2f45c03 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java @@ -2427,7 +2427,7 @@ private class JdbcMarshallerContext extends BlockingJdbcChannel implements Marsh */ public JdbcMarshallerContext() { try { - processSystemClasses(U.gridClassLoader(), null, sysTypes::add); + processSystemClasses(U.gridClassLoader(), sysTypes::add); } catch (IOException e) { throw new IgniteException("Unable to initialize marshaller context", e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/tx/FetchNearXidVersionTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/tx/FetchNearXidVersionTask.java index 519dd55a7564d..7845fbf89982f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/tx/FetchNearXidVersionTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/tx/FetchNearXidVersionTask.java @@ -23,6 +23,7 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.compute.ComputeJobResult; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx; import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; @@ -78,7 +79,7 @@ public FetchNearXidVersionJob(TxInfoCommandArg arg, boolean debug) { for (IgniteInternalTx tx : transactions) { if (tx.xid().equals(arg.uuid()) || - tx.nearXidVersion().asIgniteUuid().equals(arg.uuid()) || + BinaryUtils.asIgniteUuid(tx.nearXidVersion()).equals(arg.uuid()) || tx.xidVersion().equals(arg.gridCacheVersion()) || tx.nearXidVersion().equals(arg.gridCacheVersion())) return tx.nearXidVersion(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxTask.java index ffd7a6a31ab98..4e07c6525f02c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxTask.java @@ -38,6 +38,7 @@ import org.apache.ignite.compute.ComputeJobResult; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.management.tx.TxCommand.AbstractTxCommandArg; import org.apache.ignite.internal.managers.discovery.DiscoCache; import org.apache.ignite.internal.processors.cache.GridCacheContext; @@ -351,7 +352,7 @@ else if (locTx instanceof GridDhtTxRemote) { infos.add(new TxInfo(locTx.xid(), locTx.startTime(), duration, locTx.isolation(), locTx.concurrency(), locTx.timeout(), lb, mappings, locTx.state(), size, - locTx.nearXidVersion().asIgniteUuid(), locTx.masterNodeIds(), locTx.topologyVersionSnapshot(), + BinaryUtils.asIgniteUuid(locTx.nearXidVersion()), locTx.masterNodeIds(), locTx.topologyVersionSnapshot(), verboseInfo)); if (arg.kill()) @@ -367,9 +368,9 @@ else if (locTx instanceof GridDhtTxRemote) { if (completed != null) { if (Boolean.TRUE.equals(completed)) - infos.add(new TxInfo(infoArg.gridCacheVersion().asIgniteUuid(), COMMITTED)); + infos.add(new TxInfo(BinaryUtils.asIgniteUuid(infoArg.gridCacheVersion()), COMMITTED)); else if (Boolean.FALSE.equals(completed)) - infos.add(new TxInfo(infoArg.gridCacheVersion().asIgniteUuid(), ROLLED_BACK)); + infos.add(new TxInfo(BinaryUtils.asIgniteUuid(infoArg.gridCacheVersion()), ROLLED_BACK)); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java index 3acf503561ad8..08befbe25008a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java @@ -137,7 +137,6 @@ import org.apache.ignite.spi.communication.tcp.internal.ConnectionRequestor; import org.apache.ignite.spi.communication.tcp.internal.TcpConnectionRequestDiscoveryMessage; import org.apache.ignite.spi.communication.tcp.internal.TcpInverseConnectionResponseMessage; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; @@ -455,10 +454,14 @@ public void resetMetrics() { ioMetric.register(RCVD_BYTES_CNT, spi::getReceivedBytesCount, "Received bytes count."); - getSpi().setListener(commLsnr = new CommunicationListenerEx() { + getSpi().setListener(commLsnr = new CommunicationListenerEx<>() { @Override public void onMessage(UUID nodeId, Object msg, IgniteRunnable msgC) { try { - onMessage0(nodeId, (GridIoMessage)msg, msgC); + GridIoMessage msg0 = (GridIoMessage)msg; + + try (Scope ignored = ctx.operationContextDispatcher().restoreDistributedAttributes(msg0.opCtxMsg)) { + onMessage0(nodeId, msg0, msgC); + } } catch (ClassCastException ignored) { U.error(log, "Communication manager received message of unknown type (will ignore): " + @@ -1313,7 +1316,7 @@ private void processP2PMessage( assert obj != null; - invokeListener(msg.policy(), lsnr, nodeId, obj, secSubjId(msg)); + invokeListener(msg.policy(), lsnr, nodeId, obj); } finally { threadProcessingMessage(false, null); @@ -1451,7 +1454,7 @@ private void processRegularMessage0(GridIoMessage msg, UUID nodeId) { assert obj != null; - invokeListener(msg.policy(), lsnr, nodeId, obj, secSubjId(msg)); + invokeListener(msg.policy(), lsnr, nodeId, obj); } /** @@ -1815,9 +1818,8 @@ private void unwindMessageSet(GridCommunicationMessageSet msgSet, GridMessageLis * @param lsnr Listener. * @param nodeId Node ID. * @param msg Message. - * @param secSubjId Security subject that will be used to open a security session. */ - private void invokeListener(Byte plc, GridMessageListener lsnr, UUID nodeId, Object msg, UUID secSubjId) { + private void invokeListener(Byte plc, GridMessageListener lsnr, UUID nodeId, Object msg) { MTC.span().addLog(() -> "Invoke listener"); Byte oldPlc = CUR_PLC.get(); @@ -1827,9 +1829,7 @@ private void invokeListener(Byte plc, GridMessageListener lsnr, UUID nodeId, Obj if (change) CUR_PLC.set(plc); - UUID newSecSubjId = secSubjId != null ? secSubjId : nodeId; - - try (Scope ignored = ctx.security().withContext(newSecSubjId)) { + try (Scope ignored = withRemoteSecurityContext(nodeId)) { lsnr.onMessage(nodeId, msg, plc); } finally { @@ -1838,6 +1838,19 @@ private void invokeListener(Byte plc, GridMessageListener lsnr, UUID nodeId, Obj } } + /** */ + private Scope withRemoteSecurityContext(UUID nodeId) { + // No remote Security Context has been attached to the message processing thread so far. + // This means that the message was sent as part of an operation initiated by the sender node. + if (ctx.security().isDefaultContext()) + return ctx.security().withContext(nodeId); + + // Verify that the Security Context currently attached to the thread is valid. + ctx.security().securityContext(); + + return Scope.NOOP_SCOPE; + } + /** * @return Current IO policy */ @@ -2025,11 +2038,8 @@ private long getInverseConnectionWaitTimeout() { return ctx.config().getFailureDetectionTimeout(); } - /** - * @return One of two message wrappers. The first is {@link GridIoMessage}, the second is secured version {@link - * GridIoSecurityAwareMessage}. - */ - private @NotNull GridIoMessage createGridIoMessage( + /** @return A {@link GridIoMessage} wrapper for {@code msg}. */ + public GridIoMessage createGridIoMessage( Object topic, Message msg, byte plc, @@ -2037,16 +2047,13 @@ private long getInverseConnectionWaitTimeout() { long timeout, boolean skipOnTimeout ) { - if (ctx.security().enabled()) { - UUID secSubjId = null; + GridIoMessage res; - if (!ctx.security().isDefaultContext()) - secSubjId = ctx.security().securityContext().subject().id(); + res = new GridIoMessage(plc, topic, msg, ordered, timeout, skipOnTimeout); - return new GridIoSecurityAwareMessage(secSubjId, plc, topic, msg, ordered, timeout, skipOnTimeout); - } + res.opCtxMsg = ctx.operationContextDispatcher().collectDistributedAttributes(); - return new GridIoMessage(plc, topic, msg, ordered, timeout, skipOnTimeout); + return res; } /** @@ -3802,7 +3809,7 @@ void unwind(GridMessageListener lsnr) { MTC.span().addTag(SpanTags.MESSAGE, () -> traceName(fmc.message)); - invokeListener(plc, lsnr, nodeId, mc.message.message(), secSubjId(mc.message)); + invokeListener(plc, lsnr, nodeId, mc.message.message()); } finally { if (mc.closure != null) @@ -4231,19 +4238,6 @@ public long binLatencyMcs() { } } - /** - * @return Security subject id. - */ - private UUID secSubjId(GridIoMessage msg) { - if (ctx.security().enabled()) { - assert msg instanceof GridIoSecurityAwareMessage; - - return ((GridIoSecurityAwareMessage)msg).securitySubjectId(); - } - - return null; - } - /** * Responsible for handling network situation where server cannot open connection to client and * has to ask client to establish a connection to specific server. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessage.java index 8cc6c106cf22e..8296b60f81e92 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessage.java @@ -19,10 +19,12 @@ import org.apache.ignite.internal.ExecutorAwareMessage; import org.apache.ignite.internal.GridTopicMessage; +import org.apache.ignite.internal.OperationContextMessage; import org.apache.ignite.internal.Order; import org.apache.ignite.internal.processors.cache.GridCacheMessage; import org.apache.ignite.internal.processors.datastreamer.DataStreamerRequest; import org.apache.ignite.internal.processors.tracing.messages.SpanTransport; +import org.apache.ignite.internal.util.nio.GridNioServer.MessageWrapper; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.plugin.extensions.communication.Message; @@ -31,7 +33,7 @@ /** * Wrapper for all grid messages. */ -public class GridIoMessage implements Message, SpanTransport { +public class GridIoMessage implements Message, SpanTransport, MessageWrapper { /** */ public static final Integer STRIPE_DISABLED_PART = Integer.MIN_VALUE; @@ -64,6 +66,11 @@ public class GridIoMessage implements Message, SpanTransport { @Order(6) byte[] span; + /** Effective operation context attributes to propagate. */ + @Order(7) + @GridToStringInclude + public @Nullable OperationContextMessage opCtxMsg; + /** * Default constructor. */ @@ -119,10 +126,8 @@ int topicOrdinal() { return GridTopicMessage.ordinal(topicMsg); } - /** - * @return Message. - */ - public Message message() { + /** {@inheritDoc} */ + @Override public Message message() { return msg; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoSecurityAwareMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoSecurityAwareMessage.java deleted file mode 100644 index d1a6040d3d682..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoSecurityAwareMessage.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.managers.communication; - -import java.util.UUID; -import org.apache.ignite.internal.Order; -import org.apache.ignite.plugin.extensions.communication.Message; - -/** - * - */ -public class GridIoSecurityAwareMessage extends GridIoMessage { - /** Security subject ID that will be used during message processing on a remote node. */ - @Order(0) - UUID secSubjId; - - /** - * Default constructor. - */ - public GridIoSecurityAwareMessage() { - // No-op. - } - - /** - * @param secSubjId Security subject ID. - * @param plc Policy. - * @param topic Communication topic. - * @param msg Message. - * @param ordered Message ordered flag. - * @param timeout Timeout. - * @param skipOnTimeout Whether message can be skipped on timeout. - */ - public GridIoSecurityAwareMessage( - UUID secSubjId, - byte plc, - Object topic, - Message msg, - boolean ordered, - long timeout, - boolean skipOnTimeout - ) { - super(plc, topic, msg, ordered, timeout, skipOnTimeout); - - this.secSubjId = secSubjId; - } - - /** - * @return Security subject ID. - */ - UUID securitySubjectId() { - return secSubjId; - } -} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentCommunication.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentCommunication.java index 422c15e119021..a36e98fcdeeb1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentCommunication.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentCommunication.java @@ -330,7 +330,6 @@ else if (log.isDebugEnabled()) "(node does not exist): " + nodeId); } - /** * @param rsrcName Resource to undeploy. * @param rmtNodes Nodes to send request to. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java index 0501b2d0772af..8d1e9dee16763 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java @@ -1206,7 +1206,6 @@ Collection getClassLoaderIds() { return classLoader().registeredClassLoaderIds(); } - /** * @return {@code True} if deployment has any node participants. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java index da9b54b2440f7..7411e501b3c51 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java @@ -226,7 +226,7 @@ public class GridDiscoveryManager extends GridManagerAdapter { }; /** Discovery cached history size. */ - private final int DISCOVERY_HISTORY_SIZE = getInteger(IGNITE_DISCOVERY_HISTORY_SIZE, DFLT_DISCOVERY_HISTORY_SIZE); + private final int discoHistSz = getInteger(IGNITE_DISCOVERY_HISTORY_SIZE, DFLT_DISCOVERY_HISTORY_SIZE); /** */ private final Object discoEvtMux = new Object(); @@ -254,7 +254,7 @@ public class GridDiscoveryManager extends GridManagerAdapter { /** Topology cache history. */ private final GridBoundedConcurrentLinkedHashMap discoCacheHist = - new GridBoundedConcurrentLinkedHashMap<>(DISCOVERY_HISTORY_SIZE); + new GridBoundedConcurrentLinkedHashMap<>(discoHistSz); /** Topology snapshots history. */ private volatile NavigableMap> topHist = Collections.emptyNavigableMap(); @@ -782,7 +782,12 @@ else if (customMsg instanceof ChangeGlobalStateMessage) { discoEvtHnd.discoCache = discoCache; if (!ctx.clientDisconnected()) { - // The security processor must be notified first, since {@link IgniteSecurity#onLocalJoin} + // The Rolling Upgrade Feature Manager must be notified first, as {@link IgniteFeatureManager#onLocalJoin} + // completes initialization of the local node's Active Feature Set based on data received from the cluster. + // The Active Feature Set, in turn, determines the node's overall behavior. + ctx.rollingUpgrade().features().onLocalJoin(); + + // The security processor must be notified second, since {@link IgniteSecurity#onLocalJoin} // finishes local node security context initialization that can be demanded by other Ignite // components. ctx.security().onLocalJoin(); @@ -1102,7 +1107,7 @@ private boolean skipMessage(int type, @Nullable DiscoveryCustomMessage customMsg rcvdCustomMsgs.addLast(customMsg.id()); - while (rcvdCustomMsgs.size() > DISCOVERY_HISTORY_SIZE) + while (rcvdCustomMsgs.size() > discoHistSz) rcvdCustomMsgs.pollFirst(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/InlineSizesData.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/EncryptionDataBagItem.java similarity index 75% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/query/InlineSizesData.java rename to modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/EncryptionDataBagItem.java index eb3813501f670..e4ea26f29148a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/InlineSizesData.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/EncryptionDataBagItem.java @@ -15,25 +15,23 @@ * limitations under the License. */ -package org.apache.ignite.internal.processors.query; +package org.apache.ignite.internal.managers.encryption; import java.util.Map; import org.apache.ignite.internal.Order; import org.apache.ignite.plugin.extensions.communication.Message; /** */ -public class InlineSizesData implements Message { +public class EncryptionDataBagItem implements Message { /** */ @Order(0) - Map sizes; + Map knownKeys; /** */ - public InlineSizesData() {} + public EncryptionDataBagItem() {} - /** - * @param sizes Inline sizes. - */ - public InlineSizesData(Map sizes) { - this.sizes = sizes; + /** */ + EncryptionDataBagItem(Map knownKeys) { + this.knownKeys = knownKeys; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java index 19c58d5d7b8cf..9989036b6104a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java @@ -563,7 +563,7 @@ public void onLocalJoin() { } } - dataBag.addGridCommonData(ENCRYPTION_MGR.ordinal(), knownEncKeys); + dataBag.addGridCommonData(ENCRYPTION_MGR.ordinal(), new EncryptionDataBagItem(knownEncKeys)); } /** {@inheritDoc} */ @@ -571,20 +571,15 @@ public void onLocalJoin() { if (ctx.clientNode()) return; - Map encKeysFromCluster = (Map)data.commonData(); + EncryptionDataBagItem encryptionItem = data.commonData(); - if (F.isEmpty(encKeysFromCluster)) + if (encryptionItem == null || F.isEmpty(encryptionItem.knownKeys)) return; - for (Map.Entry entry : encKeysFromCluster.entrySet()) { + for (Map.Entry entry : encryptionItem.knownKeys.entrySet()) { int grpId = entry.getKey(); - GroupKeyEncrypted rmtKey; - - if (entry.getValue() instanceof GroupKeyEncrypted) - rmtKey = (GroupKeyEncrypted)entry.getValue(); - else - rmtKey = new GroupKeyEncrypted(INITIAL_KEY_ID, (byte[])entry.getValue()); + GroupKeyEncrypted rmtKey = entry.getValue(); GroupKey locGrpKey = getActiveKey(grpId); @@ -1489,7 +1484,7 @@ public void applyReencryptionStartRecord(ReencryptionStartRecord rec) { * @param req Request. * @return Result future. */ - private IgniteInternalFuture prepareMasterKeyChange(MasterKeyChangeRequest req) { + private IgniteInternalFuture prepareMasterKeyChange(UUID ignored, MasterKeyChangeRequest req) { if (masterKeyChangeRequest != null) { return new GridFinishedFuture<>(new IgniteException("Master key change was rejected. " + "The previous change was not completed.")); @@ -1552,7 +1547,7 @@ else if (U.isLocalNodeCoordinator(ctx.discovery())) * @param req Request. * @return Result future. */ - private IgniteInternalFuture performMasterKeyChange(MasterKeyChangeRequest req) { + private IgniteInternalFuture performMasterKeyChange(UUID ignored, MasterKeyChangeRequest req) { if (masterKeyChangeRequest == null || !masterKeyChangeRequest.equals(req)) return new GridFinishedFuture<>(new IgniteException("Unknown master key change was rejected.")); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GroupKeyChangeProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GroupKeyChangeProcess.java index ac1fb0250d353..99a9ed1cdb5e7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GroupKeyChangeProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GroupKeyChangeProcess.java @@ -183,7 +183,7 @@ public IgniteFuture start(Collection cacheOrGrpNames) { * @param req Request. * @return Result future. */ - private IgniteInternalFuture prepare(ChangeCacheEncryptionRequest req) { + private IgniteInternalFuture prepare(UUID ignored, ChangeCacheEncryptionRequest req) { if (ctx.clientNode()) return new GridFinishedFuture<>(); @@ -285,7 +285,7 @@ else if (U.isLocalNodeCoordinator(ctx.discovery())) * @param req Request. * @return Result future. */ - private IgniteInternalFuture perform(ChangeCacheEncryptionRequest req) { + private IgniteInternalFuture perform(UUID ignored, ChangeCacheEncryptionRequest req) { if (this.req == null || !this.req.equals(req)) return new GridFinishedFuture<>(new IgniteException("Unknown cache group key change was rejected.")); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/EventsDataBagItem.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/EventsDataBagItem.java new file mode 100644 index 0000000000000..da409dc0d586a --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/EventsDataBagItem.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.managers.eventstorage; + +import org.apache.ignite.internal.Order; +import org.apache.ignite.plugin.extensions.communication.Message; + +/** */ +public class EventsDataBagItem implements Message { + /** */ + @Order(0) + int[] enabledEvts; + + /** */ + public EventsDataBagItem() { } + + /** @param enabledEvts Enabled events. */ + public EventsDataBagItem(int[] enabledEvts) { + this.enabledEvts = enabledEvts; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java index 1f96aa0a316d9..618ad6bb05eed 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java @@ -1173,13 +1173,15 @@ private int[] copy(int[] arr) { /** {@inheritDoc} */ @Override public void onGridDataReceived(DiscoveryDataBag.GridDiscoveryData data) { - if (data.commonData() == null) + EventsDataBagItem evtsItem = data.commonData(); + + if (evtsItem == null) return; if (ctx.clientNode()) return; - GridIntList clusterData = new GridIntList((int[])data.commonData()); + GridIntList clusterData = new GridIntList(evtsItem.enabledEvts); GridIntList nodeData = new GridIntList(enabledEvents()); GridIntList toEnable = new GridIntList(clusterData.size()); @@ -1207,9 +1209,7 @@ private int[] copy(int[] arr) { if (dataBag.isJoiningNodeClient() && dataBag.commonDataCollectedFor(EVENT_MGR.ordinal())) return; - int[] clusterData = enabledEvents(); - - dataBag.addGridCommonData(EVENT_MGR.ordinal(), clusterData); + dataBag.addGridCommonData(EVENT_MGR.ordinal(), new EventsDataBagItem(enabledEvents())); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/tracing/GridTracingManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/tracing/GridTracingManager.java index 4e5e66e692452..4e0871024881c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/tracing/GridTracingManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/tracing/GridTracingManager.java @@ -34,8 +34,10 @@ import org.apache.ignite.internal.processors.tracing.Tracing; import org.apache.ignite.internal.processors.tracing.configuration.GridTracingConfigurationManager; import org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesHandler; +import org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable; import org.apache.ignite.internal.util.typedef.internal.LT; import org.apache.ignite.logger.NullLogger; +import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.spi.IgniteSpiException; import org.apache.ignite.spi.tracing.NoopTracingSpi; import org.apache.ignite.spi.tracing.Scope; @@ -507,6 +509,11 @@ private Span enrichWithLocalNodeParameters(@Nullable Span span) { } } + /** {@inheritDoc} */ + @Override public String traceName(Message msg) { + return TraceableMessagesTable.traceName(msg); + } + /** {@inheritDoc} */ @Override public TraceableMessagesHandler messages() { // Optimization for noop spi. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/AuthentificationDataBagItem.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/AuthentificationDataBagItem.java new file mode 100644 index 0000000000000..2ce6d24940b42 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/AuthentificationDataBagItem.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.authentication; + +import java.util.ArrayList; +import java.util.Collection; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.util.tostring.GridToStringInclude; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.plugin.extensions.communication.Message; + +/** Initial data is collected on coordinator to send to join node. */ +public class AuthentificationDataBagItem implements Message { + /** Users. */ + @GridToStringInclude + @Order(0) + ArrayList usrs; + + /** Active user operations. */ + @GridToStringInclude + @Order(1) + ArrayList activeOps; + + /** */ + public AuthentificationDataBagItem() { } + + /** + * @param usrs Users. + * @param ops Active operations on cluster. + */ + AuthentificationDataBagItem(Collection usrs, Collection ops) { + this.usrs = new ArrayList<>(usrs); + activeOps = new ArrayList<>(ops); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(AuthentificationDataBagItem.class, this); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java index af9baf67bf34c..74a7dca34a827 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java @@ -60,7 +60,6 @@ import org.apache.ignite.internal.thread.pool.IgniteThreadPoolExecutor; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.tostring.GridToStringExclude; -import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.S; @@ -141,7 +140,7 @@ public class IgniteAuthenticationProcessor extends GridProcessorAdapter implemen private UserManagementOperationFinishedMessage curOpFinishMsg; /** Initial users map and operations received from coordinator on the node joined to the cluster. */ - private InitialUsersData initUsrs; + private AuthentificationDataBagItem initUsrs; /** I/O message listener. */ private GridMessageListener ioLsnr; @@ -403,7 +402,7 @@ public static void validate(String login, char[] passwd) throws UserManagementEx synchronized (mux) { if (!dataBag.commonDataCollectedFor(AUTH_PROC.ordinal())) { - InitialUsersData d = new InitialUsersData(users.values(), activeOps.values()); + AuthentificationDataBagItem d = new AuthentificationDataBagItem(users.values(), activeOps.values()); if (log.isDebugEnabled()) log.debug("Collected initial users data: " + d); @@ -430,7 +429,7 @@ private boolean isLocalNodeCoordinator() { /** {@inheritDoc} */ @Override public void onGridDataReceived(DiscoveryDataBag.GridDiscoveryData data) { - initUsrs = (InitialUsersData)data.commonData(); + initUsrs = data.commonData(); } /** {@inheritDoc} */ @@ -999,36 +998,6 @@ public void checkUserOperation(UserManagementOperation op) throws IgniteAccessCo } /** - * Initial data is collected on coordinator to send to join node. - */ - private static final class InitialUsersData implements Serializable { - /** */ - private static final long serialVersionUID = 0L; - - /** Users. */ - @GridToStringInclude - private final ArrayList usrs; - - /** Active user operations. */ - @GridToStringInclude - private final ArrayList activeOps; - - /** - * @param usrs Users. - * @param ops Active operations on cluster. - */ - InitialUsersData(Collection usrs, Collection ops) { - this.usrs = new ArrayList<>(usrs); - activeOps = new ArrayList<>(ops); - } - - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(InitialUsersData.class, this); - } - } - - /**i * */ private final class UserProposedListener implements CustomEventListener { @@ -1333,7 +1302,7 @@ private RefreshUsersStorageWorker(ArrayList usrs) { } /** {@inheritDoc} */ - @Override protected void body() throws InterruptedException, IgniteInterruptedCheckedException { + @Override protected void body() { if (ctx.clientNode()) return; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserManagementOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserManagementOperation.java index 82d3b939bf58f..da6efb8ad9ee4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserManagementOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/UserManagementOperation.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.authentication; -import java.io.Serializable; import java.util.Objects; import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.typedef.internal.S; @@ -27,10 +26,7 @@ /** * The operation with users. Used to deliver the information about requested operation to all server nodes. */ -public class UserManagementOperation implements Serializable, Message { - /** */ - private static final long serialVersionUID = 0L; - +public class UserManagementOperation implements Message { /** User. */ @Order(0) User usr; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java index a67d265dbf79c..b483dd649043a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java @@ -19,16 +19,20 @@ import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.cache.CacheMetrics; +import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.processors.affinity.AffinityAssignment; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTopologyFuture; import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtLocalPartition; import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState; import org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore; +import org.apache.ignite.internal.processors.cluster.BaselineTopology; import org.apache.ignite.internal.processors.metric.MetricRegistryImpl; import org.apache.ignite.internal.processors.metric.impl.AtomicLongMetric; import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl; @@ -246,6 +250,15 @@ public class CacheMetricsImpl implements CacheMetrics { /** Conflict resolver merged entries count. */ private LongAdderMetric rslvrMergedCnt; + /** Affinity configuration MDC safe metric. */ + private volatile Boolean affCfgMdcSafe; + + /** Current partition distribution MDC safe metric. */ + private volatile Boolean mdcSafePartDistrib; + + /** Last affinity version when MdcSafe Partition Distribution metric was recalculated. */ + private final AtomicReference mdcSafeMetricLastVer = new AtomicReference<>(); + /** * Creates cache metrics. * @@ -1679,6 +1692,71 @@ public void onOffHeapEvict() { return fut != null && !fut.isDone(); } + /** + * Returns {@code true} if affinity configuration is aware of multiple data centers, and + * it is able to spread partitions' copies across data centers. + */ + private boolean isAffinityCfgMdcSafe() { + return affCfgMdcSafe != null && affCfgMdcSafe; + } + + /** + * Returns {@code true} if current cache partition distribution maintains guarantee 'at least one partition copy in each datacenter'. + */ + private boolean isMdcSafePartitionDistribution() { + return updateMdcSafeDistributionMetricIfNeeded(); + } + + /** + * Updates calculated value of Partition Distribution MDC safe metric if affinity has changed + * since last affinity change. + * + * @return Updated value of Partition Distribution MDC safe metric or cached value if affinity has not changed. + */ + private boolean updateMdcSafeDistributionMetricIfNeeded() { + GridCacheAffinityManager aff = cctx.affinity(); + + try { + AffinityTopologyVersion currVer = aff.affinityTopologyVersion(); + AffinityTopologyVersion lastVer = mdcSafeMetricLastVer.get(); + + // Skip expensive recalculation if the aff topology has not changed. + if (!currVer.equals(lastVer)) { + if (mdcSafeMetricLastVer.compareAndSet(lastVer, currVer)) + mdcSafePartDistrib = recalculateMdcSafeMetric(aff.assignment(currVer)); + } + } + catch (Exception ignored) { + // Affinity manager could throw an exception if aff not found for the cache. + // This should not break any code calling this method, so we just ignore it. + } + + return mdcSafePartDistrib == null || mdcSafePartDistrib; + } + + /** + * Recalcalculates Partition Distribution MDC safe metric based on provided assignment. + * + * @param assignment New assignment for the cache. + */ + private Boolean recalculateMdcSafeMetric(AffinityAssignment assignment) { + BaselineTopology top = cctx.discovery().discoCache().state().baselineTopology(); + if (top != null && top.numberOfDatacenters() > 1) { + int numberOfDataCenters = top.numberOfDatacenters(); + + for (List nodes : assignment.assignment()) { + int dcsCnt = (int)nodes.stream().map(ClusterNode::dataCenterId).distinct().count(); + + if (dcsCnt < numberOfDataCenters) + return false; + } + + return true; + } + + return mdcSafePartDistrib; + } + /** {@inheritDoc} */ @Override public long getIndexRebuildKeysProcessed() { return idxRebuildKeyProcessed.value(); @@ -1745,6 +1823,20 @@ public void registerResolverMetrics() { "Conflict resolver merged entries count"); } + /** Registers metric for partition distribution. */ + public void registerPartitionDistributionSafeMetric() { + mreg.register("IsCachePartitionDistributionSafe", this::isMdcSafePartitionDistribution, + "True if current cache partition distribution maintains guarantee 'one partition copy in each datacenter'."); + } + + /** Registers metric for cache configuration related to distributing partitions across DCs. */ + public void registerAffinityConfigurationSafeMetric(boolean affCfgMdcSafe) { + mreg.register("IsCacheAffinityConfigurationMdcSafe", this::isAffinityCfgMdcSafe, + "True if cache affinity guarantees having a copy of each partition in each data center."); + + this.affCfgMdcSafe = affCfgMdcSafe; + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(CacheMetricsImpl.class, this); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOperationContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOperationContext.java index eab8e8472fa7e..d4aba5d39f7b0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOperationContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOperationContext.java @@ -17,13 +17,12 @@ package org.apache.ignite.internal.processors.cache; +import java.io.Serial; import java.io.Serializable; -import java.util.Collections; -import java.util.HashMap; import java.util.Map; +import java.util.Objects; import javax.cache.expiry.ExpiryPolicy; import org.apache.ignite.cache.ReadRepairStrategy; -import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.jetbrains.annotations.Nullable; @@ -32,68 +31,52 @@ */ public class CacheOperationContext implements Serializable { /** */ - private static final long serialVersionUID = 0L; + @Serial private static final long serialVersionUID = 0L; - /** Skip store. */ - @GridToStringInclude + /** */ + private static final CacheOperationContext INSTANCE = new Builder().build(); + + /** Skip store flag. */ private final boolean skipStore; - /** Skip store. */ - @GridToStringInclude + /** Skip read through flag. */ private final boolean skipReadThrough; /** No retries flag. */ - @GridToStringInclude private final boolean noRetries; - /** */ + /** Recovery flag. */ private final boolean recovery; /** Read-repair strategy. */ - private final ReadRepairStrategy readRepairStrategy; + private final @Nullable ReadRepairStrategy readRepairStrategy; /** Keep binary flag. */ private final boolean keepBinary; /** Expiry policy. */ - private final ExpiryPolicy expiryPlc; + private final @Nullable ExpiryPolicy expiryPlc; /** Data center Id. */ - private final Byte dataCenterId; + private final @Nullable Byte dataCenterId; /** Application attributes. */ - private final Map appAttrs; + private final @Nullable Map appAttrs; /** Handle binary in interceptor operation flag. */ private final boolean keepBinaryInInterceptor; /** - * Constructor with default values. - */ - public CacheOperationContext() { - skipStore = false; - skipReadThrough = false; - keepBinary = false; - expiryPlc = null; - noRetries = false; - recovery = false; - readRepairStrategy = null; - dataCenterId = null; - appAttrs = null; - keepBinaryInInterceptor = false; - } - - /** - * @param skipStore Skip store flag. - * @param skipReadThrough Skip read-through cache store flag. - * @param keepBinary Keep binary flag. - * @param expiryPlc Expiry policy. - * @param dataCenterId Data center id. - * @param readRepairStrategy Read-repair strategy. - * @param appAttrs Application attributes. - * @param keepBinaryInInterceptor Handle binary in interceptor operation flag. + * @param skipStore Skip store flag. + * @param skipReadThrough Skip read-through cache store flag. + * @param keepBinary Keep binary flag. + * @param expiryPlc Expiry policy. + * @param dataCenterId Data center id. + * @param readRepairStrategy Read-repair strategy. + * @param appAttrs Application attributes. + * @param keepBinaryInInterceptor Handle binary in interceptor operation flag. */ - public CacheOperationContext( + private CacheOperationContext( boolean skipStore, boolean skipReadThrough, boolean keepBinary, @@ -118,60 +101,30 @@ public CacheOperationContext( } /** - * @return Keep binary flag. + * Helper. */ - public boolean isKeepBinary() { - return keepBinary; + public static CacheOperationContext instance() { + return INSTANCE; } - /** Return handle binary in interceptor operation flag. */ - public boolean isKeepBinaryInInterceptor() { - return keepBinaryInInterceptor; + /** Helper. */ + public static CacheOperationContext of(CacheOperationContext opCtx) { + return opCtx == null ? INSTANCE : opCtx; } /** - * @return {@code True} if data center id is set otherwise {@code false}. + * @return keepBinary flag. */ - public boolean hasDataCenterId() { - return dataCenterId != null; + public boolean isKeepBinary() { + return keepBinary; } - /** - * See {@link IgniteInternalCache#keepBinary()}. - * - * @return New instance of CacheOperationContext with keep binary flag. - */ - public CacheOperationContext keepBinary() { - return new CacheOperationContext( - skipStore, - skipReadThrough, - true, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - true); - } + /** Context with keepBinary flag. */ + public CacheOperationContext withKeepBinary() { + if (isKeepBinary()) + return this; - /** - * See {@link IgniteInternalCache#withKeepBinaryInInterceptor()}. - * - * @return New instance of CacheOperationContext with handle binary in interceptor flag. - */ - public CacheOperationContext withKeepBinaryInInterceptor() { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - true); + return builder(this).keepBinary(true).build(); } /** @@ -183,223 +136,311 @@ public CacheOperationContext withKeepBinaryInInterceptor() { return dataCenterId; } - /** - * @return Skip store. - */ - public boolean skipStore() { - return skipStore; + /** Context with dataCenterId. */ + public CacheOperationContext withDataCenterId(Byte dataCenterId) { + if (Objects.equals(this.dataCenterId, dataCenterId)) + return this; + + return builder(this).dataCenterId(dataCenterId).build(); } /** - * See {@link IgniteInternalCache#setSkipStore(boolean)}. - * - * @param skipStore Skip store flag. - * @return New instance of CacheOperationContext with skip store flag. + * @return Partition recover flag. */ - public CacheOperationContext setSkipStore(boolean skipStore) { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - keepBinaryInInterceptor); + public boolean recovery() { + return recovery; } - /** @return Skip read-through cache store. */ - public boolean skipReadThrough() { - return skipReadThrough; + /** Context with recovery flag. */ + public CacheOperationContext withRecovery() { + if (recovery()) + return this; + + return builder(this).recovery(true).build(); } /** - * See {@link IgniteInternalCache#withApplicationAttributes(Map)}. - * - * @return New instance of CacheOperationContext with new application attributes. + * @return Read Repair strategy. */ - public CacheOperationContext withApplicationAttributes(Map attrs) { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - Collections.unmodifiableMap(attrs), - keepBinaryInInterceptor); + @Nullable public ReadRepairStrategy readRepairStrategy() { + return readRepairStrategy; } - /** - * See {@link IgniteInternalCache#withSkipReadThrough()}. - * - * @return New instance of CacheOperationContext with skip store flag. - */ - public CacheOperationContext withSkipReadThrough() { - return new CacheOperationContext( - skipStore, - true, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - keepBinaryInInterceptor); + /** Context with read repair strategy. */ + public CacheOperationContext withReadRepairStrategy(ReadRepairStrategy strategy) { + if (readRepairStrategy() == strategy) + return this; + + return builder(this).readRepairStrategy(strategy).build(); } /** - * @return {@link ExpiryPolicy} associated with this projection. + * @return No retries flag. */ - @Nullable public ExpiryPolicy expiry() { - return expiryPlc; + public boolean noRetries() { + return noRetries; } - /** - * See {@link IgniteInternalCache#withExpiryPolicy(ExpiryPolicy)}. - * - * @param plc {@link ExpiryPolicy} to associate with this projection. - * @return New instance of CacheOperationContext with skip store flag. - */ - public CacheOperationContext withExpiryPolicy(ExpiryPolicy plc) { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - plc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - keepBinaryInInterceptor); + /** Context with noRetries flag. */ + public CacheOperationContext withNoRetries() { + if (noRetries()) + return this; + + return builder(this).noRetries(true).build(); } /** - * @param noRetries No retries flag. - * @return Operation context. + * @return Application attributes. */ - public CacheOperationContext setNoRetries(boolean noRetries) { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - keepBinaryInInterceptor); + @Nullable public Map applicationAttributes() { + return appAttrs; } - /** - * @param dataCenterId Data center id. - * @return Operation context. - */ - public CacheOperationContext setDataCenterId(byte dataCenterId) { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - keepBinaryInInterceptor); + /** Context with application attributes. */ + public CacheOperationContext withApplicationAttributes(Map attrs) { + return builder(this).applicationAttributes(attrs).build(); } /** - * @param recovery Recovery flag. - * @return New instance of CacheOperationContext with recovery flag. + * @return Skip store. */ - public CacheOperationContext setRecovery(boolean recovery) { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - keepBinaryInInterceptor); + public boolean skipStore() { + return skipStore; } - /** - * @param readRepairStrategy Read Repair strategy. - * @return New instance of CacheOperationContext with Read Repair flag. - */ - public CacheOperationContext setReadRepairStrategy(ReadRepairStrategy readRepairStrategy) { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - appAttrs, - keepBinaryInInterceptor); + /** Context with skipStore flag. */ + public CacheOperationContext withSkipStore() { + if (skipStore()) + return this; + + return builder(this).skipStore(true).build(); } /** - * @param appAttrs Application attributes. - * @return New instance of CacheOperationContext with application attributes. + * @return Skip read-through cache store. */ - public CacheOperationContext setApplicationAttributes(Map appAttrs) { - return new CacheOperationContext( - skipStore, - skipReadThrough, - keepBinary, - expiryPlc, - noRetries, - dataCenterId, - recovery, - readRepairStrategy, - new HashMap<>(appAttrs), - keepBinaryInInterceptor); + public boolean skipReadThrough() { + return skipReadThrough; } - /** - * @return Partition recover flag. - */ - public boolean recovery() { - return recovery; + /** Context with {@link CacheOperationContext#skipReadThrough} flag. */ + public CacheOperationContext withSkipReadThrough() { + if (skipReadThrough()) + return this; + + return builder(this).skipReadThrough(true).build(); + } + + /** @return Whether to handle binary in interceptor. */ + public boolean keepBinaryInInterceptor() { + return keepBinaryInInterceptor; + } + + /** Context with {@link CacheOperationContext#keepBinaryInInterceptor} flag. */ + public CacheOperationContext withKeepBinaryInInterceptor() { + if (keepBinaryInInterceptor()) + return this; + + return builder(this).keepBinaryInInterceptor(true).build(); } /** - * @return Read Repair strategy. + * @return {@link ExpiryPolicy} associated with this projection. */ - public ReadRepairStrategy readRepairStrategy() { - return readRepairStrategy; + @Nullable public ExpiryPolicy expiry() { + return expiryPlc; + } + + /** Context with {@link CacheOperationContext#expiryPlc}. */ + public CacheOperationContext withExpiryPolicy(ExpiryPolicy plc) { + return builder(this).expiryPolicy(plc).build(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(CacheOperationContext.class, this); } /** - * @return No retries flag. + * Creates the builder from existing context. + * + * @return Builder for cache operations context. */ - public boolean noRetries() { - return noRetries; + public static Builder builder(CacheOperationContext ctx) { + return new Builder(ctx); } /** - * @return Application attributes. + * Creates the builder for cache operations context. + * + * @return Builder for cache operations context. */ - public Map applicationAttributes() { - return appAttrs; + public static Builder builder() { + return new Builder(); } - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(CacheOperationContext.class, this); + /** Cache operations context builder. */ + public static class Builder { + /** Skip store. */ + private boolean skipStore; + + /** Skip read through. */ + private boolean skipReadThrough; + + /** No retries flag. */ + private boolean noRetries; + + /** Recovery flag. */ + private boolean recovery; + + /** Read-repair strategy. */ + private ReadRepairStrategy readRepairStrategy; + + /** Keep binary flag. */ + private boolean keepBinary; + + /** Expiry policy. */ + private ExpiryPolicy expiryPlc; + + /** Data center Id. */ + private Byte dataCenterId; + + /** Application attributes. */ + private Map appAttrs; + + /** Flag indicating whether to handle binary in interceptor. */ + private boolean keepBinaryInInterceptor; + + /** */ + Builder() { + // No context. + } + + /** */ + Builder(CacheOperationContext ctx) { + skipStore = ctx.skipStore; + skipReadThrough = ctx.skipReadThrough; + noRetries = ctx.noRetries; + recovery = ctx.recovery; + readRepairStrategy = ctx.readRepairStrategy; + keepBinary = ctx.keepBinary; + expiryPlc = ctx.expiryPlc; + dataCenterId = ctx.dataCenterId; + appAttrs = ctx.appAttrs; + keepBinaryInInterceptor = ctx.keepBinaryInInterceptor; + } + + /** + * CacheOperationContext with keepBinary and keepBinaryInInterceptor flags. + * + * @see IgniteInternalCache#keepBinary() + * @see IgniteInternalCache#withKeepBinaryInInterceptor() + */ + public Builder keepBinary(boolean keepBinary) { + this.keepBinary = keepBinary; + keepBinaryInInterceptor = keepBinary; + return this; + } + + /** + * CacheOperationContext with skipStore flag. + * + * @see IgniteInternalCache#withSkipStore() + */ + public Builder skipStore(boolean skipStore) { + this.skipStore = skipStore; + return this; + } + + /** + * CacheOperationContext with attributes. + * + * @see IgniteInternalCache#withApplicationAttributes(Map) + */ + public Builder applicationAttributes(Map attrs) { + appAttrs = Map.copyOf(attrs); + return this; + } + + /** + * CacheOperationContext with skip read through flag. + * + * @see IgniteInternalCache#withSkipReadThrough() + */ + public Builder skipReadThrough(boolean skipReadThrough) { + this.skipReadThrough = skipReadThrough; + return this; + } + + /** + * CacheOperationContext with handle binary in interceptor execution flag. + * + * @see IgniteInternalCache#withKeepBinaryInInterceptor() + */ + public Builder keepBinaryInInterceptor(boolean keepBinaryInInterceptor) { + this.keepBinaryInInterceptor = keepBinaryInInterceptor; + return this; + } + + /** + * CacheOperationContext with expiry policy. + * + * @see IgniteInternalCache#withExpiryPolicy(ExpiryPolicy) + */ + public Builder expiryPolicy(ExpiryPolicy expiryPlc) { + this.expiryPlc = expiryPlc; + return this; + } + + /** + * CacheOperationContext with no retries flag. + */ + public Builder noRetries(boolean noRetries) { + this.noRetries = noRetries; + return this; + } + + /** + * CacheOperationContext with Data center id. + */ + public Builder dataCenterId(Byte dataCenterId) { + this.dataCenterId = dataCenterId; + return this; + } + + /** + * CacheOperationContext with recovery flag. + */ + public Builder recovery(boolean recovery) { + this.recovery = recovery; + return this; + } + + /** + * CacheOperationContext with read repair strategy. + */ + public Builder readRepairStrategy(ReadRepairStrategy readRepairStrategy) { + this.readRepairStrategy = readRepairStrategy; + return this; + } + + /** + * Builds cache operations context. + * + * @return Cache operations context. + */ + public CacheOperationContext build() { + return new CacheOperationContext( + skipStore, + skipReadThrough, + keepBinary, + expiryPlc, + noRetries, + dataCenterId, + recovery, + readRepairStrategy, + appAttrs, + keepBinaryInInterceptor); + } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java index 987be04ea2fe8..d5c7d8dce2536 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java @@ -1504,10 +1504,9 @@ public void onGridDataReceived(DiscoveryDataBag.GridDiscoveryData data) { if (data.commonData() == null) return; - assert joinDiscoData != null || disconnectedState(); - assert data.commonData() instanceof CacheNodeCommonDiscoveryData : data; + CacheNodeCommonDiscoveryData cachesData = data.commonData(); - CacheNodeCommonDiscoveryData cachesData = (CacheNodeCommonDiscoveryData)data.commonData(); + assert joinDiscoData != null || disconnectedState(); // CacheGroup configurations that were created from local node configuration. Map locCacheGrps = new HashMap<>(registeredCacheGroups()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GatewayProtectedCacheProxy.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GatewayProtectedCacheProxy.java index fba0e990c5e97..205af51e47f46 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GatewayProtectedCacheProxy.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GatewayProtectedCacheProxy.java @@ -166,7 +166,7 @@ public void setCacheManager(org.apache.ignite.cache.CacheManager cacheMgr) { if (skip) return this; - return new GatewayProtectedCacheProxy<>(delegate, opCtx.setSkipStore(true), lock); + return new GatewayProtectedCacheProxy<>(delegate, opCtx.withSkipStore(), lock); } finally { onLeave(opGate); @@ -180,7 +180,7 @@ public void setCacheManager(org.apache.ignite.cache.CacheManager cacheMgr) { CacheOperationGate opGate = onEnter(); try { - return new GatewayProtectedCacheProxy<>(delegate, opCtx.setApplicationAttributes(appAttrs), lock); + return new GatewayProtectedCacheProxy<>(delegate, opCtx.withApplicationAttributes(appAttrs), lock); } finally { onLeave(opGate); @@ -197,7 +197,7 @@ public void setCacheManager(org.apache.ignite.cache.CacheManager cacheMgr) { if (noRetries) return this; - return new GatewayProtectedCacheProxy<>(delegate, opCtx.setNoRetries(true), lock); + return new GatewayProtectedCacheProxy<>(delegate, opCtx.withNoRetries(), lock); } finally { onLeave(opGate); @@ -214,7 +214,7 @@ public void setCacheManager(org.apache.ignite.cache.CacheManager cacheMgr) { if (recovery) return this; - return new GatewayProtectedCacheProxy<>(delegate, opCtx.setRecovery(true), lock); + return new GatewayProtectedCacheProxy<>(delegate, opCtx.withRecovery(), lock); } finally { onLeave(opGate); @@ -244,7 +244,7 @@ public void setCacheManager(org.apache.ignite.cache.CacheManager cacheMgr) { if (opCtx.readRepairStrategy() == strategy) return this; - return new GatewayProtectedCacheProxy<>(delegate, opCtx.setReadRepairStrategy(strategy), lock); + return new GatewayProtectedCacheProxy<>(delegate, opCtx.withReadRepairStrategy(strategy), lock); } finally { onLeave(opGate); @@ -261,7 +261,7 @@ public void setCacheManager(org.apache.ignite.cache.CacheManager cacheMgr) { CacheOperationGate opGate = onEnter(); try { - return new GatewayProtectedCacheProxy<>((IgniteCacheProxy)delegate, opCtx.keepBinary(), lock); + return new GatewayProtectedCacheProxy<>((IgniteCacheProxy)delegate, opCtx.withKeepBinary(), lock); } finally { onLeave(opGate); @@ -278,7 +278,7 @@ public void setCacheManager(org.apache.ignite.cache.CacheManager cacheMgr) { if (prevDataCenterId != null && dataCenterId == prevDataCenterId) return this; - return new GatewayProtectedCacheProxy<>(delegate, opCtx.setDataCenterId(dataCenterId), lock); + return new GatewayProtectedCacheProxy<>(delegate, opCtx.withDataCenterId(dataCenterId), lock); } finally { onLeave(opGate); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java index d494e5df0dfb1..2fe29746e7a7e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java @@ -98,6 +98,7 @@ import org.apache.ignite.internal.processors.cache.dr.GridCacheDrInfo; import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow; import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx; +import org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry; import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey; import org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter; import org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalEx; @@ -159,6 +160,7 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_CACHE_RETRIES_COUNT; import static org.apache.ignite.internal.GridClosureCallMode.BROADCAST; +import static org.apache.ignite.internal.processors.cache.GridCacheOperation.READ; import static org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState.OWNING; import static org.apache.ignite.internal.processors.dr.GridDrType.DR_LOAD; import static org.apache.ignite.internal.processors.dr.GridDrType.DR_NONE; @@ -466,108 +468,48 @@ public void active(boolean active) { } /** {@inheritDoc} */ - @Override public final GridCacheProxyImpl setSkipStore(boolean skipStore) { - CacheOperationContext opCtx = new CacheOperationContext( - true, - false, - false, - null, - false, - null, - false, - null, - null, - false); + @Override public IgniteInternalCache withSkipStore() { + CacheOperationContext opCtx = ctx.operationContextPerCall(); + + opCtx = CacheOperationContext.of(opCtx).withSkipStore(); return new GridCacheProxyImpl<>(ctx, this, opCtx); } /** {@inheritDoc} */ @Override public IgniteInternalCache withSkipReadThrough() { - CacheOperationContext opCtx = this.ctx.operationContextPerCall(); + CacheOperationContext opCtx = ctx.operationContextPerCall(); - if (opCtx == null) { - opCtx = new CacheOperationContext( - false, - true, - false, - null, - false, - null, - false, - null, - null, - false); - } - else - opCtx = opCtx.withSkipReadThrough(); + opCtx = CacheOperationContext.of(opCtx).withSkipReadThrough(); + + return new GridCacheProxyImpl<>(ctx, this, opCtx); + } - return new GridCacheProxyImpl<>(this.ctx, this, opCtx); + /** {@inheritDoc} */ + @Override public IgniteInternalCache withKeepBinaryInInterceptor() { + CacheOperationContext opCtx = ctx.operationContextPerCall(); + + opCtx = CacheOperationContext.of(opCtx).withKeepBinaryInInterceptor(); + + return new GridCacheProxyImpl<>(ctx, this, opCtx); } /** @return New internal cache instance based on this one, but with application attributes. */ @Override public GridCacheProxyImpl withApplicationAttributes(Map attrs) { CacheOperationContext opCtx = ctx.operationContextPerCall(); - if (opCtx == null) { - opCtx = new CacheOperationContext( - false, - false, - false, - null, - false, - null, - false, - null, - new HashMap<>(attrs), - false); - } - else - opCtx = opCtx.withApplicationAttributes(attrs); + opCtx = CacheOperationContext.of(opCtx).withApplicationAttributes(attrs); return new GridCacheProxyImpl<>(ctx, this, opCtx); } /** {@inheritDoc} */ @Override public final GridCacheProxyImpl keepBinary() { - CacheOperationContext opCtx = new CacheOperationContext( - false, - false, - true, - null, - false, - null, - false, - null, - null, - false); + CacheOperationContext opCtx = CacheOperationContext.builder().keepBinary(true).keepBinaryInInterceptor(false).build(); return new GridCacheProxyImpl<>((GridCacheContext)ctx, (GridCacheAdapter)this, opCtx); } - /** {@inheritDoc} */ - @Override public GridCacheProxyImpl withKeepBinaryInInterceptor() { - CacheOperationContext opCtx = this.ctx.operationContextPerCall(); - - if (opCtx == null) { - opCtx = new CacheOperationContext( - false, - false, - false, - null, - false, - null, - false, - null, - null, - true); - } - else - opCtx = opCtx.withKeepBinaryInInterceptor(); - - return new GridCacheProxyImpl<>(this.ctx, this, opCtx); - } - /** {@inheritDoc} */ @Nullable @Override public final ExpiryPolicy expiry() { return null; @@ -577,34 +519,16 @@ public void active(boolean active) { @Override public final GridCacheProxyImpl withExpiryPolicy(ExpiryPolicy plc) { assert !CU.isUtilityCache(ctx.name()); - CacheOperationContext opCtx = new CacheOperationContext( - false, - false, - false, - plc, - false, - null, - false, - null, - null, - false); + CacheOperationContext opCtx = CacheOperationContext.builder().expiryPolicy(plc).build(); return new GridCacheProxyImpl<>(ctx, this, opCtx); } /** {@inheritDoc} */ @Override public final IgniteInternalCache withNoRetries() { - CacheOperationContext opCtx = new CacheOperationContext( - false, - false, - false, - null, - true, - null, - false, - null, - null, - false); + CacheOperationContext opCtx = ctx.operationContextPerCall(); + + opCtx = CacheOperationContext.of(opCtx).withNoRetries(); return new GridCacheProxyImpl<>(ctx, this, opCtx); } @@ -616,7 +540,8 @@ public void active(boolean active) { /** * @param keys Keys to lock. - * @param timeout Lock timeout. + * @param timeout Transaction timeout. + * @param waitTimeout Lock wait timeout. * @param tx Transaction. * @param isRead {@code True} for read operations. * @param retval Flag to return value. @@ -629,6 +554,7 @@ public void active(boolean active) { public abstract IgniteInternalFuture txLockAsync( Collection keys, long timeout, + long waitTimeout, IgniteTxLocalEx tx, boolean isRead, boolean retval, @@ -3106,6 +3032,196 @@ public CacheMetricsImpl metrics0() { } } + /** {@inheritDoc} */ + @Override public boolean lockTxEntry(CacheEntry entry, long waitTimeout) throws IgniteCheckedException { + A.notNull(entry, "entry"); + + return lockTxEntryAsync(entry, waitTimeout).get(); + } + + /** {@inheritDoc} */ + @Override public boolean lockTxEntries(Collection> entries, long waitTimeout) + throws IgniteCheckedException { + A.notNull(entries, "entries"); + + return lockTxEntriesAsync(entries, waitTimeout).get(); + } + + /** {@inheritDoc} */ + @Override public IgniteInternalFuture lockTxEntryAsync(CacheEntry entry, long waitTimeout) { + A.notNull(entry, "entry"); + + return lockTxEntriesAsync(Collections.singleton(entry), waitTimeout); + } + + /** {@inheritDoc} */ + @Override public IgniteInternalFuture lockTxEntriesAsync( + Collection> entries, + long waitTimeout + ) { + A.notNull(entries, "entries"); + + GridNearTxLocal tx = tx(); + + if (tx == null) + return new GridFinishedFuture<>( + new IgniteCheckedException("Failed to acquire transactional lock without transaction.")); + + if (!tx.pessimistic()) + return new GridFinishedFuture<>( + new IgniteCheckedException("Failed to acquire transactional lock in optimistic transaction.")); + + // Wait for previous per-transaction async operations to finish. + tx.txState().awaitLastFuture(); + + if (!tx.init()) + return new GridFinishedFuture<>(new IgniteTxRollbackCheckedException( + "Failed to acquire transactional lock because transaction has been completed: " + tx)); + + if (entries.isEmpty()) + return new GridFinishedFuture<>(true); + + try { + tx.addActiveCache(ctx, false); + } + catch (IgniteCheckedException e) { + return new GridFinishedFuture<>(e); + } + + Collection keys = new ArrayList<>(entries.size()); + List txEntries = new ArrayList<>(entries.size()); + List expVers = new ArrayList<>(entries.size()); + Set txKeys = new HashSet<>(entries.size()); + + CacheOperationContext opCtx = ctx.operationContextPerCall(); + + for (CacheEntry entry : entries) { + A.notNull(entry, "entry"); + + KeyCacheObject key = ctx.toCacheKeyObject(entry.getKey()); + IgniteTxKey txKey = ctx.txKey(key); + + if (!txKeys.add(txKey)) + continue; + + IgniteTxEntry lockedTxEntry = tx.entry(txKey); + + if (lockedTxEntry != null && (lockedTxEntry.op() != READ || lockedTxEntry.locked())) + continue; + + if (!(entry.version() instanceof GridCacheVersion)) { + tx.removeAndUnlockTxEntries(txEntries); + + return new GridFinishedFuture<>(new IgniteCheckedException("Failed to acquire transactional lock for entry with " + + "unsupported version type [entry=" + entry + ", version=" + entry.version() + ']')); + } + + CacheObject val = ctx.toCacheObject(entry.getValue()); + GridCacheEntryEx entryEx = ctx.isColocated() ? ctx.colocated().entryExx(key, tx.topologyVersion(), true) : entryEx(key); + + IgniteTxEntry txEntry = tx.addEntry( + READ, + val, + null, + null, + entryEx, + null, + null, + true, + -1L, + -1L, + null, + opCtx != null && opCtx.skipStore(), + opCtx != null && opCtx.skipReadThrough(), + opCtx != null && opCtx.keepBinaryInInterceptor(), + opCtx != null && opCtx.isKeepBinary(), + CU.isNearEnabled(ctx) + ); + + keys.add(key); + txEntries.add(txEntry); + expVers.add((GridCacheVersion)entry.version()); + } + + if (keys.isEmpty()) + return new GridFinishedFuture<>(true); + + // Acquire transactional lock future from concrete cache implementation. Use txLockAsync which + // delegates to cache-specific lockAllAsync implementations for distributed caches. + long timeout = tx.remainingTime(); + + IgniteInternalFuture lockFut = txLockAsync(keys, + timeout, + waitTimeout, + tx, + /*isRead*/true, + /*retval*/false, + tx.isolation(), + /*invalidate*/false, + /*createTtl*/0L, + /*accessTtl*/0L); + + IgniteInternalFuture res = new GridEmbeddedFuture<>( + lockFut, + (locked, ex) -> { + if (ex != null) + return new GridFinishedFuture<>(ex); + + if (!locked) { + tx.removeAndUnlockTxEntries(txEntries); + + return new GridFinishedFuture<>(false); + } + + try { + for (int i = 0; i < txEntries.size(); i++) { + GridCacheEntryEx cached = txEntries.get(i).cached(); + EntryGetResult getRes = cached.innerGetVersioned( + null, + tx, + /*update-metrics*/false, + /*event*/false, + null, + tx.resolveTaskName(), + null, + false, + null); + + if (getRes == null || !expVers.get(i).equals(getRes.version())) { + tx.removeAndUnlockTxEntries(txEntries); + + return new GridFinishedFuture<>(false); + } + } + + return new GridFinishedFuture<>(true); + } + catch (IgniteCheckedException | GridCacheEntryRemovedException e) { + tx.removeAndUnlockTxEntries(txEntries); + + return new GridFinishedFuture<>(e); + } + } + ); + + // Register this future in transaction's async-holder so that subsequent operations + // that call tx.txState().awaitLastFuture() will wait for it. + GridCacheAdapter.FutureHolder holder = tx.txState().lastAsyncFuture(); + + if (holder != null) { + holder.lock(); + + try { + holder.saveFuture(res); + } + finally { + holder.unlock(); + } + } + + return res; + } + /** {@inheritDoc} */ @Override public boolean isLockedByThread(K key) { A.notNull(key, "key"); @@ -4507,7 +4623,7 @@ private IgniteInternalFuture repairAtomicAsync( @Override public Boolean call() throws IgniteCheckedException { CacheOperationContext prevOpCtx = ctx.operationContextPerCall(); - ctx.operationContextPerCall(opCtx.keepBinary()); + ctx.operationContextPerCall(opCtx.withKeepBinary()); try { return invoke((K)key, new AtomicReadRepairEntryProcessor<>(correctedVal, primVer)).get(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index a82a8a9179c5a..d38fc3db41799 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -217,6 +217,7 @@ import static org.apache.ignite.internal.IgniteComponentType.JTA; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isNearEnabled; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isPersistentCache; +import static org.apache.ignite.internal.processors.cache.ValidationOnNodeJoinUtils.isAffinityConfigurationMdcSafe; import static org.apache.ignite.internal.processors.cache.ValidationOnNodeJoinUtils.validateHashIdResolvers; import static org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtLocalPartition.DFLT_CACHE_REMOVE_ENTRIES_TTL; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; @@ -1136,6 +1137,8 @@ private void onKernalStart(GridCacheAdapter cache) throws IgniteCheckedExc cache.onKernalStart(); + registerMdcMetricsIfNeeded(cache); + if (ctx.events().isRecordable(EventType.EVT_CACHE_STARTED)) ctx.events().addEvent(EventType.EVT_CACHE_STARTED); @@ -1144,6 +1147,19 @@ private void onKernalStart(GridCacheAdapter cache) throws IgniteCheckedExc cache.configuration().getCacheMode() + ']'); } + /** */ + private void registerMdcMetricsIfNeeded(GridCacheAdapter cache) { + if (ctx.clientNode()) + return; + + if (ctx.discovery().localNode() == null || ctx.discovery().localNode().dataCenterId() == null) + return; + + cache.metrics0().registerAffinityConfigurationSafeMetric(isAffinityConfigurationMdcSafe(cache.configuration())); + + cache.metrics0().registerPartitionDistributionSafeMetric(); + } + /** * @param cache Cache to stop. * @param cancel Cancel flag. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java index 82ac5cf606e9c..21c1fa361fe4a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java @@ -31,7 +31,6 @@ import javax.cache.processor.EntryProcessorResult; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.CacheEntry; -import org.apache.ignite.cache.CacheInterceptor; import org.apache.ignite.cache.CacheMetrics; import org.apache.ignite.cache.CachePeekMode; import org.apache.ignite.cache.affinity.Affinity; @@ -252,26 +251,13 @@ public IgniteInternalCache delegate() { } /** {@inheritDoc} */ - @Override public GridCacheProxyImpl setSkipStore(boolean skipStore) { + @Override public GridCacheProxyImpl withSkipStore() { CacheOperationContext prev = gate.enter(opCtx); try { - if (opCtx != null && opCtx.skipStore() == skipStore) - return this; + CacheOperationContext newOpCtx = CacheOperationContext.of(opCtx).withSkipStore(); - return new GridCacheProxyImpl<>(ctx, delegate, - opCtx != null ? opCtx.setSkipStore(skipStore) : - new CacheOperationContext( - skipStore, - false, - false, - null, - false, - null, - false, - null, - null, - false)); + return newOpCtx == opCtx ? this : new GridCacheProxyImpl<>(ctx, delegate, newOpCtx); } finally { gate.leave(prev); @@ -283,22 +269,9 @@ public IgniteInternalCache delegate() { CacheOperationContext prev = gate.enter(opCtx); try { - if (opCtx != null && opCtx.skipReadThrough()) - return this; + CacheOperationContext newOpCtx = CacheOperationContext.of(opCtx).withSkipReadThrough(); - return new GridCacheProxyImpl<>(ctx, delegate, - opCtx != null ? opCtx.withSkipReadThrough() : - new CacheOperationContext( - false, - true, - false, - null, - false, - null, - false, - null, - null, - false)); + return newOpCtx == opCtx ? this : new GridCacheProxyImpl<>(ctx, delegate, newOpCtx); } finally { gate.leave(prev); @@ -309,20 +282,15 @@ public IgniteInternalCache delegate() { @Override public GridCacheProxyImpl withApplicationAttributes(Map attrs) { CacheOperationContext prev = gate.enter(opCtx); + CacheOperationContext newOpCtx; + try { - return new GridCacheProxyImpl<>(ctx, delegate, - opCtx != null ? opCtx.setApplicationAttributes(attrs) : - new CacheOperationContext( - false, - false, - false, - null, - false, - null, - false, - null, - attrs, - false)); + if (opCtx != null) + newOpCtx = opCtx.withApplicationAttributes(attrs); + else + newOpCtx = CacheOperationContext.builder().applicationAttributes(attrs).build(); + + return new GridCacheProxyImpl<>(ctx, delegate, newOpCtx); } finally { gate.leave(prev); @@ -331,22 +299,17 @@ public IgniteInternalCache delegate() { /** {@inheritDoc} */ @Override public GridCacheProxyImpl keepBinary() { - if (opCtx != null && opCtx.isKeepBinary()) - return (GridCacheProxyImpl)this; + CacheOperationContext prev = gate.enter(opCtx); + + try { + CacheOperationContext newOpCtx = CacheOperationContext.of(opCtx).withKeepBinary(); - return new GridCacheProxyImpl<>((GridCacheContext)ctx, - (GridCacheAdapter)delegate, - opCtx != null ? opCtx.keepBinary() : - new CacheOperationContext(false, - false, - true, - null, - false, - null, - false, - null, - null, - false)); + return newOpCtx == opCtx ? (GridCacheProxyImpl)this : new GridCacheProxyImpl<>((GridCacheContext)ctx, + (GridCacheAdapter)delegate, newOpCtx); + } + finally { + gate.leave(prev); + } } /** {@inheritDoc} */ @@ -1348,6 +1311,58 @@ public IgniteInternalCache delegate() { } } + /** {@inheritDoc} */ + @Override public boolean lockTxEntry(CacheEntry entry, long waitTimeout) throws IgniteCheckedException { + CacheOperationContext prev = gate.enter(opCtx); + + try { + return delegate.lockTxEntry(entry, waitTimeout); + } + finally { + gate.leave(prev); + } + } + + /** {@inheritDoc} */ + @Override public IgniteInternalFuture lockTxEntryAsync(CacheEntry entry, long waitTimeout) { + CacheOperationContext prev = gate.enter(opCtx); + + try { + return delegate.lockTxEntryAsync(entry, waitTimeout); + } + finally { + gate.leave(prev); + } + } + + /** {@inheritDoc} */ + @Override public boolean lockTxEntries(Collection> entries, long waitTimeout) + throws IgniteCheckedException { + CacheOperationContext prev = gate.enter(opCtx); + + try { + return delegate.lockTxEntries(entries, waitTimeout); + } + finally { + gate.leave(prev); + } + } + + /** {@inheritDoc} */ + @Override public IgniteInternalFuture lockTxEntriesAsync( + Collection> entries, + long waitTimeout + ) { + CacheOperationContext prev = gate.enter(opCtx); + + try { + return delegate.lockTxEntriesAsync(entries, waitTimeout); + } + finally { + gate.leave(prev); + } + } + /** {@inheritDoc} */ @Override public boolean isLockedByThread(K key) { CacheOperationContext prev = gate.enter(opCtx); @@ -1585,46 +1600,29 @@ public IgniteInternalCache delegate() { @Override public GridCacheProxyImpl withExpiryPolicy(ExpiryPolicy plc) { CacheOperationContext prev = gate.enter(opCtx); + CacheOperationContext newOpCtx; + try { - return new GridCacheProxyImpl<>(ctx, delegate, - opCtx != null ? opCtx.withExpiryPolicy(plc) : - new CacheOperationContext( - false, - false, - false, - plc, - false, - null, - false, - null, - null, - false)); + if (opCtx != null) + newOpCtx = opCtx.withExpiryPolicy(plc); + else + newOpCtx = CacheOperationContext.builder().expiryPolicy(plc).build(); + + return new GridCacheProxyImpl<>(ctx, delegate, newOpCtx); } finally { gate.leave(prev); } } - /** - * @return Cache with handle binary values during {@link CacheInterceptor} execution flag. - */ - @Override public IgniteInternalCache withKeepBinaryInInterceptor() { + /** {@inheritDoc} */ + @Override public IgniteInternalCache withNoRetries() { CacheOperationContext prev = gate.enter(opCtx); try { - return new GridCacheProxyImpl<>(ctx, delegate, - opCtx != null ? opCtx.withKeepBinaryInInterceptor() : - new CacheOperationContext( - false, - false, - false, - null, - false, - null, - false, - null, - null, - true)); + CacheOperationContext newOpCtx = CacheOperationContext.of(opCtx).withNoRetries(); + + return newOpCtx == opCtx ? this : new GridCacheProxyImpl<>(ctx, delegate, newOpCtx); } finally { gate.leave(prev); @@ -1632,22 +1630,13 @@ public IgniteInternalCache delegate() { } /** {@inheritDoc} */ - @Override public IgniteInternalCache withNoRetries() { + @Override public IgniteInternalCache withKeepBinaryInInterceptor() { CacheOperationContext prev = gate.enter(opCtx); try { - return new GridCacheProxyImpl<>(ctx, delegate, - new CacheOperationContext( - false, - false, - false, - null, - true, - null, - false, - null, - null, - false)); + CacheOperationContext newOpCtx = CacheOperationContext.of(opCtx).withKeepBinaryInInterceptor(); + + return newOpCtx == opCtx ? this : new GridCacheProxyImpl<>(ctx, delegate, newOpCtx); } finally { gate.leave(prev); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java index 7c78a10a5cf48..b18f4ddef15b7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java @@ -259,7 +259,8 @@ else if (err instanceof UnregisteredBinaryTypeException) throw (UnregisteredBinaryTypeException)err; } - CacheInvokeResult res0 = err == null ? CacheInvokeResult.fromResult(res) : CacheInvokeResult.fromError(err); + CacheInvokeResult res0 = err == null ? CacheInvokeResult.fromResult(res) + : CacheInvokeResult.fromError(CU.prepareEntryProcessorError(err)); Object resKey = key0 != null ? key0 : ((keepBinary && key instanceof BinaryObject) ? key : CU.value(key, cctx, true)); @@ -367,7 +368,7 @@ public void finishUnmarshal(GridCacheContext ctx, ClassLoader ldr) throws Ignite for (CacheInvokeDirectResult res : invokeResCol) { CacheInvokeResult res0 = res.error() == null ? CacheInvokeResult.fromResult(ctx.cacheObjectContext().unwrapBinaryIfNeeded(res.result(), true, false, null)) : - CacheInvokeResult.fromError(res.error()); + CacheInvokeResult.fromError(CU.prepareEntryProcessorError(res.error())); map0.put(ctx.cacheObjectContext().unwrapBinaryIfNeeded(res.key(), true, false, null), res0); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java index 9437762372485..7f0b4d36bd11a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.cache; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -42,6 +41,7 @@ import javax.cache.integration.CacheLoader; import javax.cache.integration.CacheWriter; import javax.cache.integration.CacheWriterException; +import javax.cache.processor.EntryProcessorException; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; @@ -53,7 +53,6 @@ import org.apache.ignite.cache.CacheServerNotFoundException; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.affinity.AffinityFunction; -import org.apache.ignite.cache.affinity.AffinityKeyMapped; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.cache.store.CacheStoreSessionListener; import org.apache.ignite.cluster.ClusterNode; @@ -67,6 +66,8 @@ import org.apache.ignite.internal.IgniteClientDisconnectedCheckedException; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.IgniteNodeAttributes; +import org.apache.ignite.internal.UnregisteredBinaryTypeException; +import org.apache.ignite.internal.UnregisteredClassException; import org.apache.ignite.internal.cluster.ClusterGroupEmptyCheckedException; import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; import org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundException; @@ -178,6 +179,17 @@ public static boolean cheatCache(int id) { return cheatCacheId != 0 && id == cheatCacheId; } + /** + * Checks whether the separate lock wait timeout expires before the transaction timeout. + * + * @param waitTimeout Lock wait timeout. {@code 0} means that there is no separate lock wait timeout. + * @param timeout Transaction timeout. {@code 0} means that the transaction timeout is infinite. + * @return {@code True} if the separate lock wait timeout expires before the transaction timeout. + */ + public static boolean isWaitTimeoutExpiresFirst(long waitTimeout, long timeout) { + return timeout >= 0 && waitTimeout != 0 && (timeout == 0 || timeout > waitTimeout); + } + /** System cache name. */ public static final String UTILITY_CACHE_NAME = "ignite-sys-cache"; @@ -2206,18 +2218,23 @@ public static Map affinityFields(@Nullable IgniteConfiguration c } /** - * @param cls Class to get affinity field for. - * @return Affinity field name or {@code null} if field name was not found. + * Prepares an entry processor error so it can be stored in a {@link CacheInvokeResult} and rethrown + * as-is by {@link CacheInvokeResult#get()}: an {@link UnregisteredClassException} or + * {@link UnregisteredBinaryTypeException} (which must propagate unwrapped) and an existing + * {@link EntryProcessorException} are returned unchanged; any other error is wrapped in an + * {@link EntryProcessorException}. + * + * @param err Error thrown by the entry processor. + * @return Prepared error to store in the cache invoke result. */ - public static String affinityFieldName(Class cls) { - for (; cls != Object.class && cls != null; cls = cls.getSuperclass()) { - for (Field f : cls.getDeclaredFields()) { - if (f.getAnnotation(AffinityKeyMapped.class) != null) - return f.getName(); - } - } + public static Throwable prepareEntryProcessorError(Throwable err) { + if (err instanceof UnregisteredClassException || err instanceof UnregisteredBinaryTypeException) + return err; - return null; + if (err instanceof EntryProcessorException) + return err; + + return new EntryProcessorException(err); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java index 629bb9433cbd8..2ab4e3d990a7c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java @@ -272,7 +272,7 @@ public GridCacheContext context0() { /** {@inheritDoc} */ @Override public IgniteCacheProxy cacheNoGate() { - return new GatewayProtectedCacheProxy<>(this, new CacheOperationContext(), false); + return new GatewayProtectedCacheProxy<>(this, CacheOperationContext.instance(), false); } /** @@ -282,7 +282,7 @@ public IgniteCacheProxy gatewayWrapper() { if (cachedProxy != null) return cachedProxy; - cachedProxy = new GatewayProtectedCacheProxy<>(this, new CacheOperationContext(), true); + cachedProxy = new GatewayProtectedCacheProxy<>(this, CacheOperationContext.instance(), true); return cachedProxy; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java index 678a8227f41d5..f98849c6761fa 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java @@ -223,10 +223,9 @@ public interface IgniteInternalCache extends Iterable> { public boolean skipStore(); /** - * @param skipStore Skip store flag. * @return New internal cache instance based on this one, but with skip store flag enabled. */ - public IgniteInternalCache setSkipStore(boolean skipStore); + public IgniteInternalCache withSkipStore(); /** @return New internal cache instance based on this one, but with skip read-through cache store flag enabled. */ public IgniteInternalCache withSkipReadThrough(); @@ -1346,6 +1345,65 @@ public boolean lock(K key, long timeout) */ public boolean isLocked(K key); + /** + * Acquires a transactional lock for the cached object represented by the given entry if the current cached version + * matches the entry version. This method works only in a {@link TransactionConcurrency#PESSIMISTIC} transaction. + * + * @param entry Entry whose key, value and version should be used. + * @param waitTimeout Timeout in milliseconds to wait for lock to be acquired + * ({@code 0} to use the transaction timeout, {@code -1} for immediate failure if + * lock cannot be acquired immediately). + * @return {@code True} if lock was acquired with the same entry version. + * @throws IgniteCheckedException If lock acquisition resulted in an error. + * @throws NullPointerException If entry is {@code null}. + */ + public boolean lockTxEntry(CacheEntry entry, long waitTimeout) throws IgniteCheckedException; + + /** + * Acquires transactional locks for the cached objects represented by the given entries if all current cached + * versions match the corresponding entry versions. This method works only in a + * {@link TransactionConcurrency#PESSIMISTIC} transaction. + * + * @param entries Entries whose keys, values and versions should be used. + * @param waitTimeout Timeout in milliseconds to wait for locks to be acquired + * ({@code 0} to use the transaction timeout, {@code -1} for immediate failure if + * locks cannot be acquired immediately). + * @return {@code True} if all locks were acquired with the same entry versions. + * @throws IgniteCheckedException If lock acquisition resulted in an error. + * @throws NullPointerException If entries is {@code null}. + */ + public boolean lockTxEntries(Collection> entries, long waitTimeout) throws IgniteCheckedException; + + /** + * Asynchronously acquires a transactional lock for the cached object represented by the given entry if the current + * cached version matches the entry version. This method works only in a + * {@link TransactionConcurrency#PESSIMISTIC} transaction. + * + * @param entry Entry whose key, value and version should be used. + * @param waitTimeout Timeout in milliseconds to wait for lock to be acquired + * ({@code 0} to use the transaction timeout, {@code -1} for immediate failure if + * lock cannot be acquired immediately). + * @return Future that resolves to {@code true} if the lock was acquired and the versions matched, or to + * {@code false} otherwise. + * @throws NullPointerException If entry is {@code null}. + */ + public IgniteInternalFuture lockTxEntryAsync(CacheEntry entry, long waitTimeout); + + /** + * Asynchronously acquires transactional locks for the cached objects represented by the given entries if all + * current cached versions match the corresponding entry versions. This method works only in a + * {@link TransactionConcurrency#PESSIMISTIC} transaction. + * + * @param entries Entries whose keys, values and versions should be used. + * @param waitTimeout Timeout in milliseconds to wait for locks to be acquired + * ({@code 0} to use the transaction timeout, {@code -1} for immediate failure if + * locks cannot be acquired immediately). + * @return Future that resolves to {@code true} if all locks were acquired and all versions matched, or to + * {@code false} otherwise. + * @throws NullPointerException If entries is {@code null}. + */ + public IgniteInternalFuture lockTxEntriesAsync(Collection> entries, long waitTimeout); + /** * Checks if current thread owns a lock on this key. *

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ValidationOnNodeJoinUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ValidationOnNodeJoinUtils.java index ac8d97b2a127c..16ea96c3cf40d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ValidationOnNodeJoinUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ValidationOnNodeJoinUtils.java @@ -35,6 +35,10 @@ import org.apache.ignite.IgniteLogger; import org.apache.ignite.cache.CacheRebalanceMode; import org.apache.ignite.cache.QueryEntity; +import org.apache.ignite.cache.affinity.AffinityFunction; +import org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeAffinityBackupFilter; +import org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeColocatedBackupFilter; +import org.apache.ignite.cache.affinity.rendezvous.MdcAffinityBackupFilter; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.cache.store.CacheStore; import org.apache.ignite.cluster.ClusterNode; @@ -56,6 +60,7 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteBiPredicate; import org.apache.ignite.marshaller.Marshaller; import org.apache.ignite.plugin.security.SecurityException; import org.apache.ignite.spi.IgniteNodeValidationResult; @@ -70,6 +75,7 @@ import static org.apache.ignite.cache.CacheRebalanceMode.SYNC; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_ASYNC; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_CONSISTENCY_CHECK_SKIPPED; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_DATA_CENTER_ID; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_TX_AWARE_QUERIES_ENABLED; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_TX_SERIALIZABLE_ENABLED; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isDefaultDataRegionPersistent; @@ -631,6 +637,34 @@ private static void checkMemoryConfiguration(ClusterNode rmt, GridKernalContext return null; } + /** + * Analyzes affinity settings of a provided {@link CacheConfiguration} to inspect if it provides guarantees + * that partitions of the cache will be spread across all datacenters presented in cluster. + * + * @return {@code true} if affinity settings guarantee spreading partitions across all datacenters and {@code false} otherwise. + */ + static boolean isAffinityConfigurationMdcSafe(CacheConfiguration cc) { + if (cc.getCacheMode() == REPLICATED) + return true; + + AffinityFunction affFunc = cc.getAffinity(); + + if (affFunc instanceof RendezvousAffinityFunction) { + IgniteBiPredicate> filter = ((RendezvousAffinityFunction)affFunc).getAffinityBackupFilter(); + + if (filter instanceof ClusterNodeAttributeAffinityBackupFilter attrFilter) { + if (!F.asList(attrFilter.getAttributeNames()).contains(ATTR_DATA_CENTER_ID)) + return false; + } + + return filter instanceof MdcAffinityBackupFilter + || filter instanceof ClusterNodeAttributeColocatedBackupFilter + || filter instanceof ClusterNodeAttributeAffinityBackupFilter; + } + + return true; + } + /** * @param rmtNode Remote node to check. * @param ctx Context. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataVersionsData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheBinaryDataBagItem.java similarity index 77% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataVersionsData.java rename to modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheBinaryDataBagItem.java index 706d2c26f1caa..5c70e5439b793 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataVersionsData.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheBinaryDataBagItem.java @@ -22,18 +22,18 @@ import org.apache.ignite.plugin.extensions.communication.Message; /** */ -public class BinaryMetadataVersionsData implements Message { +public class CacheBinaryDataBagItem implements Message { /** */ @Order(0) - Map data; + Map meta; /** */ - public BinaryMetadataVersionsData() {} + public CacheBinaryDataBagItem() {} /** - * @param data Data. + * @param meta Per-type binary metadata info. */ - public BinaryMetadataVersionsData(Map data) { - this.data = Map.copyOf(data); + public CacheBinaryDataBagItem(Map meta) { + this.meta = Map.copyOf(meta); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java index 8867e576ec8af..2e44c95fe2533 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.processors.cache.binary; import java.io.File; -import java.io.Serializable; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Collection; @@ -116,9 +115,9 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_WAIT_SCHEMA_UPDATE; import static org.apache.ignite.IgniteSystemProperties.getBoolean; import static org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.BINARY_PROC; +import static org.apache.ignite.internal.binary.BinaryUtils.affinityFieldName; import static org.apache.ignite.internal.binary.BinaryUtils.mergeMetadata; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; -import static org.apache.ignite.internal.util.typedef.internal.CU.affinityFieldName; /** * Binary processor implementation. @@ -1418,11 +1417,11 @@ private IgniteNodeValidationResult validateBinaryConfiguration(ClusterNode rmtNo } /** */ - private IgniteNodeValidationResult validateBinaryMetadata(UUID rmtNodeId, BinaryMetadataVersionsData newNodeMeta) { - if (newNodeMeta == null) + private IgniteNodeValidationResult validateBinaryMetadata(UUID rmtNodeId, CacheBinaryDataBagItem cacheBinaryItem) { + if (cacheBinaryItem == null) return null; - for (Map.Entry metaEntry : newNodeMeta.data.entrySet()) { + for (Map.Entry metaEntry : cacheBinaryItem.meta.entrySet()) { if (!metadataLocCache.containsKey(metaEntry.getKey())) continue; @@ -1464,25 +1463,25 @@ private IgniteNodeValidationResult validateBinaryMetadata(UUID rmtNodeId, Binary res.put(e.getKey(), e.getValue()); } - dataBag.addGridCommonData(BINARY_PROC.ordinal(), (Serializable)res); + dataBag.addGridCommonData(BINARY_PROC.ordinal(), new CacheBinaryDataBagItem(res)); } } /** {@inheritDoc} */ @Override public void collectJoiningNodeData(DiscoveryDataBag dataBag) { - dataBag.addJoiningNodeData(BINARY_PROC.ordinal(), new BinaryMetadataVersionsData(metadataLocCache)); + dataBag.addJoiningNodeData(BINARY_PROC.ordinal(), new CacheBinaryDataBagItem(metadataLocCache)); } /** {@inheritDoc} */ @Override public void onJoiningNodeDataReceived(DiscoveryDataBag.JoiningNodeDiscoveryData data) { - BinaryMetadataVersionsData newNodeMeta = data.joiningNodeData(); + CacheBinaryDataBagItem cacheBinaryItem = data.joiningNodeData(); - if (newNodeMeta == null) + if (cacheBinaryItem == null) return; UUID joiningNode = data.joiningNodeId(); - for (Map.Entry metaEntry : newNodeMeta.data.entrySet()) { + for (Map.Entry metaEntry : cacheBinaryItem.meta.entrySet()) { if (metadataLocCache.containsKey(metaEntry.getKey())) { BinaryMetadataVersionInfo locMetaVerInfo = metadataLocCache.get(metaEntry.getKey()); @@ -1530,10 +1529,10 @@ private IgniteNodeValidationResult validateBinaryMetadata(UUID rmtNodeId, Binary /** {@inheritDoc} */ @Override public void onGridDataReceived(GridDiscoveryData data) { - Map receivedData = (Map)data.commonData(); + CacheBinaryDataBagItem cacheBinaryItem = data.commonData(); - if (receivedData != null) { - for (Map.Entry e : receivedData.entrySet()) { + if (cacheBinaryItem != null && !F.isEmpty(cacheBinaryItem.meta)) { + for (Map.Entry e : cacheBinaryItem.meta.entrySet()) { BinaryMetadataVersionInfo metaVerInfo = e.getValue(); BinaryMetadataVersionInfo locMetaVerInfo = new BinaryMetadataVersionInfo(metaVerInfo.metadata(), diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java index 8d330906dd4f2..7586312d1bd06 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java @@ -102,6 +102,7 @@ protected GridDistributedCacheAdapter(GridCacheContext ctx, GridCacheConcu @Override public IgniteInternalFuture txLockAsync( Collection keys, long timeout, + long waitTimeout, IgniteTxLocalEx tx, boolean isRead, boolean retval, @@ -112,7 +113,7 @@ protected GridDistributedCacheAdapter(GridCacheContext ctx, GridCacheConcu ) { assert tx != null; - return lockAllAsync(keys, timeout, tx, isInvalidate, isRead, retval, isolation, createTtl, accessTtl); + return lockAllAsync(keys, timeout, waitTimeout, tx, isInvalidate, isRead, retval, isolation, createTtl, accessTtl); } /** {@inheritDoc} */ @@ -121,6 +122,7 @@ protected GridDistributedCacheAdapter(GridCacheContext ctx, GridCacheConcu // Return value flag is true because we choose to bring values for explicit locks. return lockAllAsync(ctx.cacheKeysView(keys), + timeout, timeout, tx, false, @@ -133,7 +135,8 @@ protected GridDistributedCacheAdapter(GridCacheContext ctx, GridCacheConcu /** * @param keys Keys to lock. - * @param timeout Timeout. + * @param timeout Transaction timeout. + * @param waitTimeout Lock wait timeout. * @param tx Transaction * @param isInvalidate Invalidation flag. * @param isRead Indicates whether value is read or written. @@ -145,6 +148,7 @@ protected GridDistributedCacheAdapter(GridCacheContext ctx, GridCacheConcu */ protected abstract IgniteInternalFuture lockAllAsync(Collection keys, long timeout, + long waitTimeout, @Nullable IgniteTxLocalEx tx, boolean isInvalidate, boolean isRead, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java index fef43785bef3a..10d87957edbac 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockFuture.java @@ -34,6 +34,7 @@ import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.NodeStoppingException; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheLockCandidates; @@ -154,9 +155,12 @@ public final class GridDhtLockFuture extends GridCacheCompoundIdentityFuture lockAllAsync( @Nullable Collection keys, long timeout, + long waitTimeout, IgniteTxLocalEx txx, boolean isInvalidate, boolean isRead, @@ -733,6 +734,7 @@ else if (txLockMsgLog.isDebugEnabled()) { return lockAllAsyncInternal( keys, timeout, + waitTimeout, txx, isInvalidate, isRead, @@ -742,7 +744,7 @@ else if (txLockMsgLog.isDebugEnabled()) { accessTtl, opCtx != null && opCtx.skipStore(), opCtx != null && opCtx.skipReadThrough(), - opCtx != null && opCtx.isKeepBinaryInInterceptor(), + opCtx != null && opCtx.keepBinaryInInterceptor(), opCtx != null && opCtx.isKeepBinary()); } @@ -750,7 +752,8 @@ else if (txLockMsgLog.isDebugEnabled()) { * Acquires locks in partitioned cache. * * @param keys Keys to lock. - * @param timeout Lock timeout. + * @param timeout Transaction timeout. + * @param waitTimeout Lock wait timeout. * @param txx Transaction. * @param isInvalidate Invalidate flag. * @param isRead Read flag. @@ -765,6 +768,7 @@ else if (txLockMsgLog.isDebugEnabled()) { */ public GridDhtFuture lockAllAsyncInternal(@Nullable Collection keys, long timeout, + long waitTimeout, IgniteTxLocalEx txx, boolean isInvalidate, boolean isRead, @@ -792,6 +796,7 @@ public GridDhtFuture lockAllAsyncInternal(@Nullable Collection lockAllAsync( req.txRead(), req.needReturnValue(), req.timeout(), + req.waitTimeout(), tx, req.threadId(), req.createTtl(), @@ -1058,6 +1064,7 @@ public IgniteInternalFuture lockAllAsync( req.skipReadThrough(), req.keepBinaryInInterceptor(), req.keepBinary(), + req.waitTimeout(), req.nearCache()); final GridDhtTxLocal t = tx; @@ -1071,7 +1078,7 @@ public IgniteInternalFuture lockAllAsync( e = U.unwrap(e); // Transaction can be emptied by asynchronous rollback. - assert e != null || !t.empty(); + boolean lockAcquired = e == null && o != null && o.success() && !t.empty(); // Create response while holding locks. final GridNearLockResponse resp = createLockReply(nearNode, @@ -1079,7 +1086,8 @@ public IgniteInternalFuture lockAllAsync( req, t, t.xidVersion(), - e); + e, + lockAcquired); assert !t.implicit() : t; assert !t.onePhaseCommit() : t; @@ -1104,15 +1112,18 @@ public IgniteInternalFuture lockAllAsync( @Override public GridNearLockResponse apply(Boolean b, Exception e) { if (e != null) e = U.unwrap(e); - else if (!b) + else if (!b && !CU.isWaitTimeoutExpiresFirst(req.waitTimeout(), req.timeout())) e = new GridCacheLockTimeoutException(req.version()); + boolean lockAcquired = e != null || b; + GridNearLockResponse res = createLockReply(nearNode, entries, req, null, mappedVer, - e); + e, + lockAcquired); sendLockReply(nearNode, null, req, res); @@ -1140,7 +1151,8 @@ else if (!b) req, tx, tx != null ? tx.xidVersion() : req.version(), - e); + e, + false); sendLockReply(nearNode, null, req, res); } @@ -1197,6 +1209,7 @@ private GridNearLockResponse sendClientLockRemapResponse(ClusterNode nearNode, * @param tx Transaction. * @param mappedVer Mapped version. * @param err Error. + * @param lockAcquired {@code True} if requested locks were acquired. * @return Response. */ private GridNearLockResponse createLockReply( @@ -1205,7 +1218,8 @@ private GridNearLockResponse createLockReply( GridNearLockRequest req, @Nullable GridDhtTxLocalAdapter tx, GridCacheVersion mappedVer, - Throwable err) { + Throwable err, + boolean lockAcquired) { assert mappedVer != null; assert tx == null || tx.xidVersion().equals(mappedVer); @@ -1227,9 +1241,14 @@ private GridNearLockResponse createLockReply( clienRemapVer, clienRemapVer != null); + res.lockAcquired(lockAcquired); + if (err == null) { res.pending(localDhtPendingVersions(entries, mappedVer)); + if (!lockAcquired) + return res; + // We have to add completed versions for cases when nearLocal and remote transactions // execute concurrently. IgnitePair> versPair = ctx.tm().versions(req.version()); @@ -1251,6 +1270,21 @@ private GridNearLockResponse createLockReply( GridCacheVersion ver = e.version(); + boolean ownsLock = e.lockedBy(mappedVer) || + ctx.mvcc().isRemoved(e.context(), mappedVer); + + if (!ownsLock && CU.isWaitTimeoutExpiresFirst(req.waitTimeout(), req.timeout())) { + res.lockAcquired(false); + + return res; + } + + assert ownsLock || tx != null && tx.isRollbackOnly() : + "Entry does not own lock for tx [locNodeId=" + ctx.localNodeId() + + ", entry=" + e + + ", mappedVer=" + mappedVer + ", ver=" + ver + + ", tx=" + CU.txString(tx) + ", req=" + req + ']'; + boolean ret = req.returnValue(i) || dhtVer == null || !dhtVer.equals(ver); CacheObject val = null; @@ -1268,14 +1302,6 @@ private GridNearLockResponse createLockReply( req.keepBinary()); } - assert e.lockedBy(mappedVer) || - ctx.mvcc().isRemoved(e.context(), mappedVer) || - tx != null && tx.isRollbackOnly() : - "Entry does not own lock for tx [locNodeId=" + ctx.localNodeId() + - ", entry=" + e + - ", mappedVer=" + mappedVer + ", ver=" + ver + - ", tx=" + CU.txString(tx) + ", req=" + req + ']'; - boolean filterPassed = false; if (tx != null && tx.onePhaseCommit()) { @@ -1631,11 +1657,14 @@ public void removeLocks( GridCacheMvccCandidate cand = null; if (dhtVer == null) { - cand = entry.localCandidateByNearVersion(ver, true); + cand = entry.localCandidateByNearVersion(ver, !forSavepoint); if (cand != null) dhtVer = cand.version(); else { + if (forSavepoint) + break; + if (log.isDebugEnabled()) log.debug("Failed to locate lock candidate based on dht or near versions [nodeId=" + nodeId + ", ver=" + ver + ", unmap=" + unmap + ", keys=" + keys + ']'); @@ -1669,7 +1698,7 @@ public void removeLocks( // Note that we don't reorder completed versions here, // as there is no point to reorder relative to the version // we are about to remove. - if (entry.removeLock(dhtVer)) { + if ((forSavepoint && cand == null) || entry.removeLock(dhtVer)) { if (forSavepoint) clearTxEntry(dhtVer, key); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java index 98c580203c210..a2befc5d99987 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java @@ -473,7 +473,7 @@ private boolean finish(boolean commit, if (isNull(cctx.discovery().getAlive(n.id()))) { log.error("Unable to send message (node left topology): " + n); - fut.onNodeLeft(); + fut.onNodeLeft(n.id()); } else { cctx.tm().sendTransactionMessage(n, req, tx, tx.ioPolicy()); @@ -493,7 +493,7 @@ private boolean finish(boolean commit, catch (IgniteCheckedException e) { // Fail the whole thing. if (e instanceof ClusterTopologyCheckedException) - fut.onNodeLeft(); + fut.onNodeLeft(n.id()); else { if (msgLog.isDebugEnabled()) { msgLog.debug("DHT finish fut, failed to send request dht [txId=" + tx.nearXidVersion() + @@ -687,6 +687,40 @@ void onResult(Throwable e) { onDone(e); } + /** */ + private void onNodeLeft(UUID nodeId) { + // Cause in common case #onNodeLeft() completes with no error it`s necessary to send salvage message. + if (tx.storeWriteThrough()) { + Map> txNodes = tx.transactionNodes(); + + if (txNodes != null) { + Collection backups = txNodes.get(nodeId); + + if (!F.isEmpty(backups)) { + GridDhtTxSalvageMessage salvageReq = null; + + for (UUID backupId : backups) { + ClusterNode backup = cctx.discovery().node(backupId); + + if (backup != null && !backup.isLocal()) { + if (salvageReq == null) + salvageReq = new GridDhtTxSalvageMessage(tx.nearXidVersion()); + + try { + cctx.io().send(backup, salvageReq, tx.ioPolicy()); + } + catch (IgniteCheckedException e) { + U.error(log, "Failed to send " + GridDhtTxSalvageMessage.class.getName() + " message.", e); + } + } + } + } + } + } + + onNodeLeft(); + } + /** */ void onNodeLeft() { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java index 93ec7a05543e4..67b32d38f86b9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java @@ -460,8 +460,12 @@ else if (!lockFut.isDone()) { logTxFinishErrorSafe(log, commit, e); // Treat heuristic exception as critical. - if (X.hasCause(e, IgniteTxHeuristicCheckedException.class)) + if (X.hasCause(e, IgniteTxHeuristicCheckedException.class)) { + if (storeWriteThrough() && local()) + salvageTx(); + cctx.kernalContext().failure().process(new FailureContext(FailureType.CRITICAL_ERROR, e)); + } err = e; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocalAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocalAdapter.java index 625d59bb27977..4c7e9313f5e16 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocalAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocalAdapter.java @@ -580,6 +580,7 @@ IgniteInternalFuture lockAllAsync( boolean skipReadThrough, boolean keepBinaryInInterceptor, boolean keepBinary, + long waitTimeout, boolean nearCache ) { try { @@ -698,7 +699,8 @@ IgniteInternalFuture lockAllAsync( skipStore, skipReadThrough, keepBinaryInInterceptor, - keepBinary); + keepBinary, + waitTimeout); } catch (IgniteCheckedException e) { setRollbackOnly(); @@ -731,7 +733,8 @@ private IgniteInternalFuture obtainLockAsync( boolean skipStore, boolean skipReadThrough, boolean keepBinaryInInterceptor, - boolean keepBinary) { + boolean keepBinary, + long waitTimeout) { if (log.isDebugEnabled()) log.debug("Before acquiring transaction lock on keys [keys=" + passedKeys + ']'); @@ -753,6 +756,7 @@ private IgniteInternalFuture obtainLockAsync( IgniteInternalFuture fut = dhtCache.lockAllAsyncInternal(passedKeys, timeout, + waitTimeout, this, isInvalidate(), read, @@ -767,20 +771,33 @@ private IgniteInternalFuture obtainLockAsync( return new GridEmbeddedFuture<>( fut, - new PLC1(ret) { + new PLC1(ret, true, !CU.isWaitTimeoutExpiresFirst(waitTimeout, timeout)) { @Override protected GridCacheReturn postLock(GridCacheReturn ret) throws IgniteCheckedException { - if (log.isDebugEnabled()) - log.debug("Acquired transaction lock on keys: " + passedKeys); - - postLockWrite(cacheCtx, - passedKeys, - ret, - /*remove*/false, - /*retval*/false, - /*read*/read, - accessTtl, - CU.empty0(), - /*computeInvoke*/false); + assert fut.error() == null : "Lock future completed with an error: " + fut.error(); + + boolean success = Boolean.TRUE.equals(fut.get()); + + ret.success(success); + + if (log.isDebugEnabled()) { + if (ret.success()) + log.debug("Successfully acquired transaction lock on keys: " + passedKeys); + else + log.debug("Failed to acquire transaction lock on keys: " + passedKeys); + } + + if (ret.success()) { + postLockWrite(cacheCtx, + passedKeys, + ret, + /*remove*/false, + /*retval*/false, + /*read*/read, + accessTtl, + CU.empty0(), + /*computeInvoke*/false, + /*skipIfLockLost*/CU.isWaitTimeoutExpiresFirst(waitTimeout, timeout)); + } return ret; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxRemote.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxRemote.java index e60041e34ed06..c2ad54b41b910 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxRemote.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxRemote.java @@ -17,9 +17,9 @@ package org.apache.ignite.internal.processors.cache.distributed.dht; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.UUID; import javax.cache.processor.EntryProcessor; @@ -226,12 +226,7 @@ public GridDhtTxRemote( /** {@inheritDoc} */ @Override public Collection masterNodeIds() { - Collection res = new ArrayList<>(2); - - res.add(nearNodeId); - res.add(nodeId); - - return res; + return List.of(nearNodeId, nodeId); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxSalvageMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxSalvageMessage.java new file mode 100644 index 0000000000000..ae2d0715cb829 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxSalvageMessage.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache.distributed.dht; + +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.processors.cache.GridCacheMessage; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; + +/** Salvage tx. */ +public class GridDhtTxSalvageMessage extends GridCacheMessage { + /** */ + @Order(0) + GridCacheVersion ver; + + /** Empty constructor. */ + public GridDhtTxSalvageMessage() { + // No-op. + } + + /** + * @param ver Global transaction identifier within cluster, assigned by transaction coordinator. + */ + public GridDhtTxSalvageMessage(GridCacheVersion ver) { + this.ver = ver; + } + + /** Tx version. */ + public GridCacheVersion version() { + return ver; + } + + /** {@inheritDoc} */ + @Override public boolean addDeploymentInfo() { + return addDepInfo; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java index 0bc9007092581..4de175ded7d33 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java @@ -288,7 +288,8 @@ else if (res.error() != null) { AtomicApplicationAttributesAwareRequest req ) { if (req.applicationAttributes() != null) - ctx.operationContextPerCall(new CacheOperationContext().setApplicationAttributes(req.applicationAttributes())); + ctx.operationContextPerCall(CacheOperationContext.builder().applicationAttributes(req.applicationAttributes()) + .build()); try { processNearAtomicUpdateRequest(nodeId, req.payload()); @@ -815,6 +816,7 @@ private IgniteInternalFuture asyncOp(final CO> op /** {@inheritDoc} */ @Override protected IgniteInternalFuture lockAllAsync(Collection keys, long timeout, + long waitTimeout, @Nullable IgniteTxLocalEx tx, boolean isInvalidate, boolean isRead, @@ -1062,7 +1064,7 @@ private IgniteInternalFuture updateAll0( final CacheOperationContext opCtx = ctx.operationContextPerCall(); - if (opCtx != null && opCtx.hasDataCenterId()) { + if (opCtx != null && opCtx.dataCenterId() != null) { assert conflictPutVals == null : conflictPutVals; assert conflictRmvVals == null : conflictRmvVals; @@ -1112,7 +1114,7 @@ else if (op == GridCacheOperation.DELETE) { opCtx != null && opCtx.recovery(), opCtx != null && opCtx.noRetries() ? 1 : MAX_RETRIES, opCtx != null ? opCtx.applicationAttributes() : null, - opCtx != null && opCtx.isKeepBinaryInInterceptor()); + opCtx != null && opCtx.keepBinaryInInterceptor()); if (async) { return asyncOp(new CO>() { @@ -1255,7 +1257,7 @@ else if (proc != null) { GridCacheDrInfo conflictPutVal = null; GridCacheVersion conflictRmvVer = null; - if (opCtx != null && opCtx.hasDataCenterId()) { + if (opCtx != null && opCtx.dataCenterId() != null) { Byte dcId = opCtx.dataCenterId(); assert dcId != null; @@ -1301,7 +1303,7 @@ else if (op == GridCacheOperation.TRANSFORM) { opCtx != null && opCtx.recovery(), opCtx != null && opCtx.noRetries() ? 1 : MAX_RETRIES, opCtx != null ? opCtx.applicationAttributes() : null, - opCtx != null && opCtx.isKeepBinaryInInterceptor() + opCtx != null && opCtx.keepBinaryInInterceptor() ); } else { @@ -1325,7 +1327,7 @@ else if (op == GridCacheOperation.TRANSFORM) { opCtx != null && opCtx.recovery(), opCtx != null && opCtx.noRetries() ? 1 : MAX_RETRIES, opCtx != null ? opCtx.applicationAttributes() : null, - opCtx != null && opCtx.isKeepBinaryInInterceptor()); + opCtx != null && opCtx.keepBinaryInInterceptor()); } } @@ -1355,7 +1357,7 @@ private IgniteInternalFuture removeAllAsync0( Collection drVers = null; - if (opCtx != null && keys != null && opCtx.hasDataCenterId()) { + if (opCtx != null && keys != null && opCtx.dataCenterId() != null) { assert conflictMap == null : conflictMap; drVers = F.transform(keys, new C1() { @@ -1385,7 +1387,7 @@ private IgniteInternalFuture removeAllAsync0( opCtx != null && opCtx.recovery(), opCtx != null && opCtx.noRetries() ? 1 : MAX_RETRIES, opCtx != null ? opCtx.applicationAttributes() : null, - opCtx != null && opCtx.isKeepBinaryInInterceptor()); + opCtx != null && opCtx.keepBinaryInInterceptor()); if (async) { return asyncOp(new CO>() { @@ -2235,7 +2237,7 @@ private void updateWithBatch( throw e; } catch (Exception e) { - curInvokeRes = CacheInvokeResult.fromError(e); + curInvokeRes = CacheInvokeResult.fromError(CU.prepareEntryProcessorError(e)); updated = old; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java index 47fa5e70a412b..21aa24e160865 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java @@ -917,7 +917,7 @@ protected abstract class UpdateReplyClosureContextAware implements GridDhtAtomic CacheOperationContext prevOpCtx = cctx.operationContextPerCall(); if (appAttrs != null) - cctx.operationContextPerCall(new CacheOperationContext().setApplicationAttributes(appAttrs)); + cctx.operationContextPerCall(CacheOperationContext.builder().applicationAttributes(appAttrs).build()); try { apply0(req, res); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java index af7f997899e40..6c4217a21197f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java @@ -205,7 +205,7 @@ public GridDistributedCacheEntry entryExx( false, opCtx != null && opCtx.skipStore(), opCtx != null && opCtx.skipReadThrough(), - opCtx != null && opCtx.isKeepBinaryInInterceptor(), + opCtx != null && opCtx.keepBinaryInInterceptor(), recovery, readRepairStrategy, needVer); @@ -309,7 +309,7 @@ public GridDistributedCacheEntry entryExx( false, opCtx != null && opCtx.skipStore(), opCtx != null && opCtx.skipReadThrough(), - opCtx != null && opCtx.isKeepBinaryInInterceptor(), + opCtx != null && opCtx.keepBinaryInInterceptor(), recovery, readRepairStrategy, needVer); @@ -639,6 +639,7 @@ else if (!skipVals && ctx.statisticsEnabled()) @Override public IgniteInternalFuture lockAllAsync( Collection keys, long timeout, + long waitTimeout, @Nullable IgniteTxLocalEx tx, boolean isInvalidate, boolean isRead, @@ -659,11 +660,12 @@ else if (!skipVals && ctx.statisticsEnabled()) isRead, retval, timeout, + waitTimeout, createTtl, accessTtl, opCtx != null && opCtx.skipStore(), opCtx != null && opCtx.skipReadThrough(), - opCtx != null && opCtx.isKeepBinaryInInterceptor(), + opCtx != null && opCtx.keepBinaryInInterceptor(), opCtx != null && opCtx.isKeepBinary(), opCtx != null && opCtx.recovery()); @@ -902,6 +904,7 @@ public void removeLocks(long threadId, GridCacheVersion ver, Collection lockAllAsync( final boolean txRead, final boolean retval, final long timeout, + final long waitTimeout, final long createTtl, final long accessTtl, final boolean skipStore, @@ -945,6 +949,7 @@ IgniteInternalFuture lockAllAsync( txRead, retval, timeout, + waitTimeout, createTtl, accessTtl, skipStore, @@ -968,6 +973,7 @@ IgniteInternalFuture lockAllAsync( txRead, retval, timeout, + waitTimeout, createTtl, accessTtl, skipStore, @@ -990,6 +996,7 @@ IgniteInternalFuture lockAllAsync( * @param txRead Tx read. * @param retval Return value flag. * @param timeout Lock timeout. + * @param waitTimeout Lock wait timeout. * @param createTtl TTL for create operation. * @param accessTtl TTL for read operation. * @param skipStore Skip store flag. @@ -1007,6 +1014,7 @@ private IgniteInternalFuture lockAllAsync0( final boolean txRead, boolean retval, final long timeout, + long waitTimeout, final long createTtl, final long accessTtl, boolean skipStore, @@ -1024,6 +1032,7 @@ private IgniteInternalFuture lockAllAsync0( txRead, retval, timeout, + waitTimeout, tx, threadId, createTtl, @@ -1077,7 +1086,7 @@ private IgniteInternalFuture lockAllAsync0( @Override public Exception apply(Boolean b, Exception e) { if (e != null) e = U.unwrap(e); - else if (!b) + else if (!b && !CU.isWaitTimeoutExpiresFirst(waitTimeout, timeout)) e = new GridCacheLockTimeoutException(ver); return e; @@ -1101,7 +1110,8 @@ else if (!b) skipStore, skipReadThrough, keepBinaryInInterceptor, - keepBinary); + keepBinary, + waitTimeout); return new GridDhtEmbeddedFuture<>( new C2() { @@ -1109,8 +1119,8 @@ else if (!b) Exception e) { if (e != null) e = U.unwrap(e); - - assert !tx.empty(); + else if (ret != null && !ret.success()) + e = new GridCacheLockTimeoutException(ver); return e; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java index 1e322d8cb56d6..e27d53a0b85a5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedLockFuture.java @@ -142,9 +142,12 @@ public final class GridDhtColocatedLockFuture extends GridCacheCompoundIdentityF @GridToStringExclude private volatile LockTimeoutObject timeoutObj; - /** Lock timeout. */ + /** Transaction timeout. */ private final long timeout; + /** Lock wait timeout. */ + private final long waitTimeout; + /** Transaction. */ @GridToStringExclude private final GridNearTxLocal tx; @@ -197,7 +200,8 @@ public final class GridDhtColocatedLockFuture extends GridCacheCompoundIdentityF * @param tx Transaction. * @param read Read flag. * @param retval Flag to return value or not. - * @param timeout Lock acquisition timeout. + * @param timeout Transaction timeout. + * @param waitTimeout Lock wait timeout. * @param createTtl TTL for create operation. * @param accessTtl TTL for read operation. * @param skipStore Skip store flag. @@ -211,6 +215,7 @@ public GridDhtColocatedLockFuture( boolean read, boolean retval, long timeout, + long waitTimeout, long createTtl, long accessTtl, boolean skipStore, @@ -229,6 +234,7 @@ public GridDhtColocatedLockFuture( this.read = read; this.retval = retval; this.timeout = timeout; + this.waitTimeout = waitTimeout; this.createTtl = createTtl; this.accessTtl = accessTtl; this.skipStore = skipStore; @@ -626,6 +632,9 @@ private synchronized void onError(Throwable t) { if (err != null) success = false; + if (!success && err == null && CU.isWaitTimeoutExpiresFirst(waitTimeout, timeout)) + return onComplete(false, true, false); + return onComplete(success, true); } } @@ -638,6 +647,18 @@ private synchronized void onError(Throwable t) { * @return {@code True} if complete by this operation. */ private boolean onComplete(boolean success, boolean distribute) { + return onComplete(success, distribute, !success); + } + + /** + * Completeness callback. + * + * @param success {@code True} if lock was acquired. + * @param distribute {@code True} if need to distribute lock removal in case of failure. + * @param rollback {@code True} if should rollback tx on failure. + * @return {@code True} if complete by this operation. + */ + private boolean onComplete(boolean success, boolean distribute, boolean rollback) { if (log.isDebugEnabled()) { log.debug("Received onComplete(..) callback [success=" + success + ", distribute=" + distribute + ", fut=" + this + ']'); @@ -646,13 +667,13 @@ private boolean onComplete(boolean success, boolean distribute) { if (!DONE_UPD.compareAndSet(this, 0, 1)) return false; - if (!success) + if (!success && rollback) undoLocks(distribute, true); if (tx != null) { cctx.tm().txContext(tx); - if (success) + if (!rollback) tx.clearLockFuture(this); } @@ -768,7 +789,7 @@ void map() { if (isDone()) // Possible due to async rollback. return; - if (timeout > 0) { + if (lockTimeout() > 0) { timeoutObj = new LockTimeoutObject(); cctx.time().addTimeoutObject(timeoutObj); @@ -1083,6 +1104,7 @@ private synchronized void map0( isolation(), isInvalidate(), timeout, + waitTimeout, mappedKeys.size(), inTx() ? tx.size() : mappedKeys.size(), inTx() && tx.syncMode() == FULL_SYNC, @@ -1258,6 +1280,7 @@ private void lockLocally( read, retval, timeout, + waitTimeout, createTtl, accessTtl, skipStore, @@ -1477,6 +1500,13 @@ private boolean errorOrTimeoutOnTopologyVersion(IgniteCheckedException e, boolea return false; } + /** + * @return Timeout value for this lock future. + */ + private long lockTimeout() { + return CU.isWaitTimeoutExpiresFirst(waitTimeout, timeout) ? waitTimeout : timeout; + } + /** * Lock request timeout object. */ @@ -1485,7 +1515,7 @@ private class LockTimeoutObject extends GridTimeoutObjectAdapter { * Default constructor. */ LockTimeoutObject() { - super(timeout); + super(lockTimeout()); } /** Requested keys. */ @@ -1496,6 +1526,20 @@ private class LockTimeoutObject extends GridTimeoutObjectAdapter { if (log.isDebugEnabled()) log.debug("Timed out waiting for lock response: " + this); + if (CU.isWaitTimeoutExpiresFirst(waitTimeout, timeout)) { + synchronized (GridDhtColocatedLockFuture.this) { + requestedKeys = requestedKeys0(); + + clear(); // Stop response processing. + } + + synchronized (this) { + onComplete(false, true, false); + } + + return; + } + if (inTx()) { if (cctx.tm().deadlockDetectionEnabled()) { synchronized (GridDhtColocatedLockFuture.this) { @@ -1660,6 +1704,12 @@ void onResult(GridNearLockResponse res) { return; } + if (!res.lockAcquired()) { + onDone(false); + + return; + } + if (res.clientRemapVersion() != null) { assert cctx.kernalContext().clientNode(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java index 5c0dc84875a7f..e3c7b42dc7f6e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java @@ -270,6 +270,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte private final Map fullMsgs = new ConcurrentHashMap<>(); /** */ + @SuppressWarnings("unused") @GridToStringInclude private volatile IgniteInternalFuture partReleaseFut; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtLocalPartition.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtLocalPartition.java index 1c565177cbd51..34ab379e525ab 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtLocalPartition.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtLocalPartition.java @@ -1194,7 +1194,9 @@ public void clearDeferredDeletes() { while (true) { long state = this.state.get(); - assert getPartState(state) != EVICTED; + GridDhtPartitionState partState = getPartState(state); + + assert partState != EVICTED : partState; if (this.state.compareAndSet(state, setSize(state, getSize(state) - 1))) return; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java index 0a9b5a7c658b6..366f937e3801f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java @@ -594,6 +594,7 @@ private void processNearAtomicUpdateResponse( /** {@inheritDoc} */ @Override protected IgniteInternalFuture lockAllAsync(Collection keys, long timeout, + long waitTimeout, @Nullable IgniteTxLocalEx tx, boolean isInvalidate, boolean isRead, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java index a5db4ea3e61de..20923899b3201 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearLockFuture.java @@ -124,13 +124,19 @@ public final class GridNearLockFuture extends GridCacheCompoundIdentityFuture fut = cacheCtx.cache().txLockAsync(enlisted, + timeout, timeout, this, /*read*/entryProc != null, // Needed to force load from store. @@ -751,7 +752,7 @@ private IgniteInternalFuture putAllAsync0( final Byte dataCenterId; - if (opCtx != null && opCtx.hasDataCenterId()) { + if (opCtx != null && opCtx.dataCenterId() != null) { assert drMap == null : drMap; dataCenterId = opCtx.dataCenterId(); @@ -800,7 +801,7 @@ private IgniteInternalFuture putAllAsync0( null, opCtx != null && opCtx.skipStore(), opCtx != null && opCtx.skipReadThrough(), - opCtx != null && opCtx.isKeepBinaryInInterceptor(), + opCtx != null && opCtx.keepBinaryInInterceptor(), false, keepBinary, opCtx != null && opCtx.recovery(), @@ -826,6 +827,7 @@ private IgniteInternalFuture putAllAsync0( log.debug("Before acquiring transaction lock for put on keys: " + enlisted); IgniteInternalFuture fut = cacheCtx.cache().txLockAsync(enlisted, + timeout, timeout, this, /*read*/invokeVals != null, // Needed to force load from store. @@ -1633,7 +1635,7 @@ private IgniteInternalFuture removeAllAsync0( final Byte dataCenterId; - if (opCtx != null && opCtx.hasDataCenterId()) { + if (opCtx != null && opCtx.dataCenterId() != null) { assert drMap == null : drMap; dataCenterId = opCtx.dataCenterId(); @@ -1703,7 +1705,7 @@ private IgniteInternalFuture removeAllAsync0( drMap, opCtx != null && opCtx.skipStore(), opCtx != null && opCtx.skipReadThrough(), - opCtx != null && opCtx.isKeepBinaryInInterceptor(), + opCtx != null && opCtx.keepBinaryInInterceptor(), singleRmv, keepBinary, opCtx != null && opCtx.recovery(), @@ -1736,6 +1738,7 @@ private IgniteInternalFuture removeAllAsync0( log.debug("Before acquiring transaction lock for remove on keys: " + enlisted); IgniteInternalFuture fut = cacheCtx.cache().txLockAsync(enlisted, + timeout, timeout, this, false, @@ -1930,6 +1933,7 @@ public IgniteInternalFuture> getAllAsync( return new GridFinishedFuture<>(timeoutException()); IgniteInternalFuture fut = cacheCtx.cache().txLockAsync(lockKeys, + timeout, timeout, this, true, @@ -3233,6 +3237,23 @@ private void removeEntryMappings(IgniteTxEntry entry) { removeEntryFromMappings(entry, nearMap); } + /** + * Removes transaction entries and releases their acquired transactional locks. + * + * @param entries Entries to remove and unlock. + */ + public void removeAndUnlockTxEntries(Collection entries) { + if (F.isEmpty(entries)) + return; + + for (IgniteTxEntry entry : entries) { + txState().removeEntry(entry.txKey()); + removeEntryMappings(entry); + } + + unlockTxEntries(entries); + } + /** * @param entry Entry. */ @@ -3294,7 +3315,16 @@ private void unlockTxEntries(Collection entries) { else if (cacheCtx.cache().isColocated()) { UUID nodeId = entry.nodeId(); - if (nodeId == null || cctx.localNodeId().equals(nodeId)) + if (nodeId == null) { + ClusterNode primary = cacheCtx.affinity().primaryByKey(entry.key(), topologyVersion()); + + if (primary == null) + continue; + + nodeId = primary.id(); + } + + if (cctx.localNodeId().equals(nodeId)) colocatedLocKeys.computeIfAbsent(cacheCtx, k -> new ArrayList<>()).add(entry.key()); else { colocatedRmtKeys @@ -4223,6 +4253,7 @@ public IgniteInternalFuture rollbackAsyncLocal() { * @param skipReadThrough Skip read-through cache store flag. * @param keepBinaryInInterceptor Handle binary in interceptor operation flag. * @param keepBinary Keep binary flag. + * @param waitTimeout Lock wait timeout. * @return Future with respond. */ public IgniteInternalFuture lockAllAsync(GridCacheContext cacheCtx, @@ -4234,7 +4265,8 @@ public IgniteInternalFuture lockAllAsync(GridCacheContext c boolean skipStore, boolean skipReadThrough, boolean keepBinaryInInterceptor, - boolean keepBinary) { + boolean keepBinary, + long waitTimeout) { assert pessimistic(); try { @@ -4261,6 +4293,7 @@ public IgniteInternalFuture lockAllAsync(GridCacheContext c IgniteInternalFuture fut = cacheCtx.colocated().lockAllAsyncInternal(keys, timeout, + waitTimeout, this, isInvalidate(), read, @@ -4275,10 +4308,20 @@ public IgniteInternalFuture lockAllAsync(GridCacheContext c return new GridEmbeddedFuture<>( fut, - new PLC1(ret, false) { - @Override protected GridCacheReturn postLock(GridCacheReturn ret) { - if (log.isDebugEnabled()) - log.debug("Acquired transaction lock on keys: " + keys); + new PLC1(ret, false, !CU.isWaitTimeoutExpiresFirst(waitTimeout, timeout)) { + @Override protected GridCacheReturn postLock(GridCacheReturn ret) throws IgniteCheckedException { + assert fut.error() == null : "Lock future completed with an error: " + fut.error(); + + boolean success = Boolean.TRUE.equals(fut.get()); + + ret.success(success); + + if (log.isDebugEnabled()) { + if (ret.success()) + log.debug("Successfully acquired transaction lock on keys: " + keys); + else + log.debug("Failed to acquire transaction lock on keys: " + keys); + } return ret; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/consistency/IgniteConsistencyViolationException.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/consistency/IgniteConsistencyViolationException.java index 95c1a1ea4e1f8..de79781e07660 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/consistency/IgniteConsistencyViolationException.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/consistency/IgniteConsistencyViolationException.java @@ -20,11 +20,12 @@ import java.util.Set; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.processors.cache.KeyCacheObject; +import org.apache.ignite.internal.util.future.GridCompoundFuture.SkipLoggingException; /** * Consistency violation exception. */ -public abstract class IgniteConsistencyViolationException extends IgniteCheckedException { +public abstract class IgniteConsistencyViolationException extends IgniteCheckedException implements SkipLoggingException { /** * Inconsistent entries keys. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java index 849e87175e346..c6e25c2baa3ca 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java @@ -765,7 +765,7 @@ private void deleteDirectory(File dir) throws IOException { * @param req Request on snapshot creation. * @return Future which will be completed when a snapshot has been started. */ - private IgniteInternalFuture initLocalSnapshotStartStage(SnapshotOperationRequest req) { + private IgniteInternalFuture initLocalSnapshotStartStage(UUID ignored, SnapshotOperationRequest req) { // Executed inside discovery notifier thread, prior to firing discovery custom event, // so it is safe to set new snapshot task inside this method without synchronization. if (curSnpOp != null) { @@ -773,6 +773,14 @@ private IgniteInternalFuture initLocalSnapshotStartSt "Another snapshot operation in progress [req=" + req + ", curr=" + curSnpOp + ']')); } + // Keeps the metrics on each server node. + if (!cctx.localNode().isClient()) { + if (clusterSnpFut == null) + clusterSnpFut = new ClusterSnapshotFuture(req.reqId, req.snpName, req.incremental() ? req.incrementIndex() : null); + + lastFuture(req.incremental(), clusterSnpFut); + } + SnapshotOperation snpOp = new SnapshotOperation(req, new SnapshotFileTree(cctx.kernalContext(), req.snapshotName(), req.snapshotPath())); @@ -1253,7 +1261,7 @@ private IgniteInternalFuture completeHandlersAsyncIfNeeded( * @param endReq Snapshot creation end request. * @return Future which will be completed when the snapshot will be finalized. */ - private IgniteInternalFuture initLocalSnapshotEndStage(SnapshotOperationEndRequest endReq) { + private IgniteInternalFuture initLocalSnapshotEndStage(UUID ignored, SnapshotOperationEndRequest endReq) { SnapshotOperation snpOp = curSnpOp; if (snpOp == null || !Objects.equals(endReq.requestId(), snpOp.request().requestId())) @@ -2050,11 +2058,6 @@ public IgniteFutureImpl createSnapshot( snpFut0 = new ClusterSnapshotFuture(UUID.randomUUID(), name, incIdx); clusterSnpFut = snpFut0; - - if (incremental) - lastSeenIncSnpFut = snpFut0; - else - lastSeenSnpFut = snpFut0; } Set cacheGrpNames0 = cacheGrpNames == null ? null : new HashSet<>(cacheGrpNames); @@ -2131,17 +2134,18 @@ else if (grps.isEmpty()) U.error(log, SNAPSHOT_FAILED_MSG, e); - ClusterSnapshotFuture errSnpFut = new ClusterSnapshotFuture(name, e); - - if (incremental) - lastSeenIncSnpFut = errSnpFut; - else - lastSeenSnpFut = errSnpFut; - return new IgniteFinishedFutureImpl<>(e); } } + /** Sets last seen snapshot future. */ + private void lastFuture(boolean incremental, ClusterSnapshotFuture futToSet) { + if (incremental) + lastSeenIncSnpFut = futToSet; + else + lastSeenSnpFut = futToSet; + } + /** Writes a warning message if an incremental snapshot contains atomic caches. */ void warnAtomicCachesInIncrementalSnapshot(String snpName, int incIdx, Collection cacheGrps) { List warnCaches = new ArrayList<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java index b612861517afe..2f19878617a15 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java @@ -311,7 +311,7 @@ private void reducePartitionsHashesResults( } /** Phase 2 beginning. */ - private IgniteInternalFuture validateParts(SnapshotCheckProcessRequest req) { + private IgniteInternalFuture validateParts(UUID ignored, SnapshotCheckProcessRequest req) { if (!req.nodes().contains(kctx.localNodeId())) return new GridFinishedFuture<>(); @@ -477,7 +477,7 @@ private static Exception asException(Throwable th) { } /** Phase 1 beginning: prepare, collect and check local metas. */ - private IgniteInternalFuture prepareAndCheckMetas(SnapshotCheckProcessRequest req) { + private IgniteInternalFuture prepareAndCheckMetas(UUID ignored, SnapshotCheckProcessRequest req) { if (!req.nodes().contains(kctx.localNodeId()) && clusterOpFuts.get(req.requestId()) == null) return new GridFinishedFuture<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotRestoreProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotRestoreProcess.java index 531971a00fe37..77f56f4d4cc7f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotRestoreProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotRestoreProcess.java @@ -629,7 +629,7 @@ private void ensureCacheAbsent(String name) { * @param req Request to prepare cache group restore from the snapshot. * @return Result future. */ - private IgniteInternalFuture prepare(SnapshotOperationRequest req) { + private IgniteInternalFuture prepare(UUID ignored, SnapshotOperationRequest req) { if (ctx.clientNode()) return new GridFinishedFuture<>(); @@ -912,7 +912,7 @@ private static GridAffinityAssignmentCache calculateAffinity( * @param req Request. * @return Future which will be completed when the preload ends. */ - private IgniteInternalFuture preload(SnapshotRestoreStartRequest req) { + private IgniteInternalFuture preload(UUID ignored, SnapshotRestoreStartRequest req) { if (ctx.clientNode()) return new GridFinishedFuture<>(); @@ -1263,7 +1263,7 @@ private void finishPreload(UUID reqId, Map res, Map cacheStart(SnapshotRestoreStartRequest req) { + private IgniteInternalFuture cacheStart(UUID ignored, SnapshotRestoreStartRequest req) { if (ctx.clientNode()) return new GridFinishedFuture<>(); @@ -1333,7 +1333,7 @@ private void finishCacheStart(UUID reqId, Map res, Map cacheStop(SnapshotRestoreStartRequest req) { + private IgniteInternalFuture cacheStop(UUID ignored, SnapshotRestoreStartRequest req) { if (!U.isLocalNodeCoordinator(ctx.discovery())) return new GridFinishedFuture<>(); @@ -1384,7 +1384,7 @@ private void finishCacheStop(UUID reqId, Map res, Map incrementalSnapshotRestore(Message req) { + private IgniteInternalFuture incrementalSnapshotRestore(UUID ignored, Message req) { SnapshotRestoreContext opCtx0 = opCtx; if (ctx.clientNode() || opCtx0 == null || !opCtx0.nodes().contains(ctx.localNodeId())) @@ -1652,7 +1652,7 @@ private static ClusterTopologyCheckedException checkNodeLeft(Collection re * @param req Request. * @return Result future. */ - private IgniteInternalFuture rollback(SnapshotRestoreStartRequest req) { + private IgniteInternalFuture rollback(UUID ignored, SnapshotRestoreStartRequest req) { if (ctx.clientNode()) return new GridFinishedFuture<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/dump/CreateDumpFutureTask.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/dump/CreateDumpFutureTask.java index 674b664f169e6..39186910d4e8a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/dump/CreateDumpFutureTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/dump/CreateDumpFutureTask.java @@ -72,6 +72,8 @@ import org.apache.ignite.internal.util.GridConcurrentHashSet; import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.internal.util.lang.GridCloseableIterator; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.pagemem.PageIdAllocator.INDEX_PARTITION; @@ -225,8 +227,10 @@ private void prepare() throws IOException, IgniteCheckedException { int grp = e.getKey(); for (File grpDumpDir : sft.cacheStorages(cctx.cache().cacheGroup(grp).config())) { - if (!grpDumpDir.mkdirs()) - throw new IgniteCheckedException("Dump directory can't be created: " + grpDumpDir); + U.ensureDirectory(grpDumpDir, "directory for dump cache group", log); + + if (!F.isEmpty(grpDumpDir.listFiles())) + throw new IgniteCheckedException("Dump directory not empty: " + grpDumpDir); } CacheGroupContext gctx = cctx.cache().cacheGroup(grp); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java index 48525f5d697d4..dd0d90b416719 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java @@ -103,6 +103,7 @@ import org.apache.ignite.internal.processors.tracing.NoopTracing; import org.apache.ignite.internal.processors.tracing.Tracing; import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions; +import org.apache.ignite.internal.thread.context.OperationContextDispatcher; import org.apache.ignite.internal.util.IgniteExceptionRegistry; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.U; @@ -176,6 +177,9 @@ public class StandaloneGridKernalContext implements GridKernalContext { /** Marshaller. */ private final BinaryMarshaller marsh; + /** Operation context dispacther. */ + private final OperationContextDispatcher opCtxDispatcher = new OperationContextDispatcher(); + /** * @param log Logger. * @param ft Node file tree. @@ -454,6 +458,11 @@ private void setField(IgniteEx kernal, String name, Object val) throws NoSuchFie return null; } + /** {@inheritDoc} */ + @Override public OperationContextDispatcher operationContextDispatcher() { + return opCtxDispatcher; + } + /** {@inheritDoc} */ @Override public CacheObjectTransformerProcessor transformer() { return transProc; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java index b175df09a09bc..115fc73f4c42f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java @@ -964,6 +964,11 @@ private void notifyCacheStoreSessionListeners(SessionData ses, @Nullable StoreOp lsnr.onSessionStart(locSes); } } + catch (RuntimeException e) { + U.error(log, "Exception raised during the notification of cache store session listeners: ", e); + + throw e; + } catch (Exception e) { throw new IgniteCheckedException("Failed to start store session: " + e, e); } @@ -984,6 +989,14 @@ private void sessionEnd0(@Nullable IgniteInternalTx tx, boolean threwEx) throws store.sessionEnd(!threwEx); } } + catch (RuntimeException e) { + U.error(log, "Exception raised during the notification of cache store session listeners: ", e); + + if (!threwEx) + throw U.cast(e); + else + throw e; + } catch (Exception e) { if (!threwEx) throw U.cast(e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java index 193eb2a4e8ae0..9eb50bc0c654d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java @@ -41,6 +41,7 @@ import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.events.TransactionStateChangedEvent; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.managers.discovery.ConsistentIdMapper; import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; @@ -628,7 +629,7 @@ protected void uncommit() { /** * @return Finalization status. */ - @Override @Nullable public FinalizationStatus finalizationStatus() { + @Override public FinalizationStatus finalizationStatus() { return finalizing; } @@ -693,7 +694,7 @@ public boolean remote() { /** {@inheritDoc} */ @Override public IgniteUuid xid() { - return xidVer.asIgniteUuid(); + return BinaryUtils.asIgniteUuid(xidVer); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java index 392f37d32b060..40dae253a43f6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java @@ -59,6 +59,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxRemote; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxSalvageMessage; import org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessage; import org.apache.ignite.internal.processors.cache.distributed.dht.TransactionAttributesAwareRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtInvalidPartitionException; @@ -223,6 +224,9 @@ public IgniteTxHandler(GridCacheSharedContext ctx) { ctx.io().addCacheHandler(GridDhtTxFinishRequest.class, (UUID nodeId, GridCacheMessage msg) -> processDhtTxFinishRequest(nodeId, (GridDhtTxFinishRequest)msg)); + ctx.io().addCacheHandler(GridDhtTxSalvageMessage.class, (UUID nodeId, GridCacheMessage msg) -> + processDhtTxSalvageRequest((GridDhtTxSalvageMessage)msg)); + ctx.io().addCacheHandler(GridDhtTxOnePhaseCommitAckRequest.class, (UUID nodeId, GridCacheMessage msg) -> processDhtTxOnePhaseCommitAckRequest(nodeId, (GridDhtTxOnePhaseCommitAckRequest)msg)); @@ -1341,6 +1345,16 @@ private void processDhtTxOnePhaseCommitAckRequest(final UUID nodeId, } } + /** + * @param req Request. + */ + private void processDhtTxSalvageRequest(GridDhtTxSalvageMessage req) { + for (IgniteInternalTx active : ctx.tm().activeTransactions()) { + if (active.nearXidVersion().equals(req.version()) && active instanceof GridDhtTxRemote) + ctx.tm().salvageTx(active); + } + } + /** * @param nodeId Node ID. * @param req Request. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java index cbb73652e033c..bbc6e282fd5f0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java @@ -1089,6 +1089,36 @@ protected final void postLockWrite( long accessTtl, CacheEntryPredicate[] filter, boolean computeInvoke + ) throws IgniteCheckedException { + postLockWrite(cacheCtx, keys, ret, rmv, retval, read, accessTtl, filter, computeInvoke, false); + } + + /** + * Post lock processing for put or remove. + * + * @param cacheCtx Context. + * @param keys Keys. + * @param ret Return value. + * @param rmv {@code True} if remove. + * @param retval Flag to return value or not. + * @param read {@code True} if read. + * @param accessTtl TTL for read operation. + * @param filter Filter to check entries. + * @param computeInvoke If {@code true} computes return value for invoke operation. + * @param skipIfLockLost Return unsuccessful result if a separate lock wait timeout has removed the lock. + * @throws IgniteCheckedException If error. + */ + protected final void postLockWrite( + GridCacheContext cacheCtx, + Iterable keys, + GridCacheReturn ret, + boolean rmv, + boolean retval, + boolean read, + long accessTtl, + CacheEntryPredicate[] filter, + boolean computeInvoke, + boolean skipIfLockLost ) throws IgniteCheckedException { for (KeyCacheObject k : keys) { IgniteTxEntry txEntry = entry(cacheCtx.txKey(k)); @@ -1101,7 +1131,15 @@ protected final void postLockWrite( GridCacheEntryEx cached = txEntry.cached(); try { - assert cached.detached() || cached.lockedLocally(xidVersion()) || isRollbackOnly() : + boolean ownsLock = cached.detached() || cached.lockedLocally(xidVersion()); + + if (!ownsLock && skipIfLockLost) { + ret.success(false); + + return; + } + + assert ownsLock || isRollbackOnly() : "Transaction lock is not acquired [entry=" + cached + ", tx=" + this + ", nodeId=" + cctx.localNodeId() + ", threadId=" + threadId + ']'; @@ -1602,9 +1640,10 @@ protected PLC1(T arg) { /** * @param arg Argument. * @param commit Commit flag. + * @param rollback Rollback flag. */ - protected PLC1(T arg, boolean commit) { - super(arg, commit); + protected PLC1(T arg, boolean commit, boolean rollback) { + super(arg, commit, rollback); } } @@ -1635,13 +1674,16 @@ protected abstract class PostLockClosure1 implements IgniteBiClosure entries, GridCacheVe * @return {@code True} if transaction read entries should be unlocked. */ private boolean unlockReadEntries(IgniteInternalTx tx) { - if (tx.pessimistic()) - return !tx.readCommitted(); - else - return tx.serializable(); + return tx.pessimistic() || tx.serializable(); } /** @@ -3123,8 +3122,38 @@ private TxRecoveryInitRunnable(ClusterNode node) { ", failedNodeId=" + evtNodeId + ']'); for (final IgniteInternalTx tx : activeTransactions()) { - if ((tx.near() && !tx.local() && tx.originatingNodeId().equals(evtNodeId)) - || (tx.storeWriteThrough() && tx.masterNodeIds().contains(evtNodeId))) { + Map> txNodes = tx.transactionNodes(); + + if (tx.storeWriteThrough() && txNodes != null + && tx.near() && txNodes.containsKey(evtNodeId) + && (tx.state() == PREPARING || tx.state() == PREPARED + || tx.state() == COMMITTING || tx.state() == COMMITTED)) { + // Send a message, tx is applied on near node and can be processed on backup if postponed. + sendTxSalvage(tx, evtNodeId); + } + + if (tx.storeWriteThrough() && tx.masterNodeIds().contains(evtNodeId) && tx.eventNodeId().equals(evtNodeId)) + salvageTx(tx, RECOVERY_FINISH); + else if (tx.storeWriteThrough() && !tx.masterNodeIds().contains(cctx.localNodeId()) + && tx.nodeId().equals(evtNodeId) && tx.state() == PREPARED) { + // Delay a commit, on backup. It will be raised further after near or coord. node will confirm it. + // In modes different from FULL_SYNC, appropriate recovery message can never be raized. + // Approach with {@code IgniteTxImplicitSingleStateImpl.syncMode} can`t be used here because + // {@code IgniteTxRemoteStateAdapter#cacheIds} can be empty. + boolean fullSyncedOp = false; + for (IgniteTxEntry ent : tx.writeEntries()) { + if (cctx.cacheContext(ent.cacheId()).syncCommit()) { + fullSyncedOp = true; + break; + } + } + + if (!fullSyncedOp) + cctx.time().schedule(() -> salvageTx(tx, RECOVERY_FINISH), 1000, -1); + } + else if ((tx.near() && !tx.local() && tx.originatingNodeId().equals(evtNodeId)) + || (tx.storeWriteThrough() && tx.masterNodeIds().contains(evtNodeId)) && + !tx.eventNodeId().equals(cctx.localNodeId())) { // Invalidate transactions. salvageTx(tx, RECOVERY_FINISH); } @@ -3166,6 +3195,41 @@ else if (tx.state() == MARKED_ROLLBACK || tx.setRollbackOnly()) } } + /** + * Salvage progress can be postponed in special case when {@link CacheConfiguration#setWriteThrough} is enabled + * and current node is backup. It required for eliminate situaltions when backup node read data before primary will + * continue with transaction commit. + * + * @see CacheConfiguration#setWriteThrough + */ + private void sendTxSalvage(IgniteInternalTx tx, UUID evtNodeId) { + Collection involvedNodes = tx.transactionNodes().get(evtNodeId); + + if (involvedNodes != null) { + GridDhtTxSalvageMessage salvageReq = null; + + for (UUID nodeId : involvedNodes) { + if (tx.masterNodeIds().contains(nodeId)) + continue; + + ClusterNode backupNode = cctx.discovery().node(nodeId); + + if (backupNode != null && !backupNode.isLocal()) { + if (salvageReq == null) + salvageReq = new GridDhtTxSalvageMessage(tx.nearXidVersion()); + + try { + cctx.io().send(nodeId, salvageReq, tx.ioPolicy()); + } + catch (IgniteCheckedException e) { + log.warning("Failed to send salvage message [failedNodeId=" + evtNodeId + + ", nodeId=" + nodeId + ']', e); + } + } + } + } + } + /** * @param tx Tx. * @param failedNode Failed node. @@ -3271,11 +3335,6 @@ private CommittedVersion(GridCacheVersion ver, GridCacheVersion nearVer) { originVer = ver; this.nearVer = nearVer; } - - /** {@inheritDoc} */ - @Override public short directType() { - throw new UnsupportedOperationException("Near committed version container is not a message to send or serialize."); - } } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java index 60248017ee116..d1826f7cc5a64 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java @@ -33,7 +33,7 @@ */ public abstract class IgniteTxRemoteStateAdapter implements IgniteTxRemoteState { /** Active cache IDs. */ - private GridIntList activeCacheIds = new GridIntList(); + private final GridIntList activeCacheIds = new GridIntList(); /** {@inheritDoc} */ @Override public boolean implicitSingle() { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateImpl.java index 409cffab11aef..7556efe6fafa4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateImpl.java @@ -40,11 +40,11 @@ public class IgniteTxRemoteStateImpl extends IgniteTxRemoteStateAdapter { /** Read set. */ @GridToStringInclude - protected Map readMap; + protected final Map readMap; /** Write map. */ @GridToStringInclude - protected Map writeMap; + protected final Map writeMap; /** * @param readMap Read map. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java index 3577c114add18..0ae820a82e009 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java @@ -167,10 +167,19 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter { /** {@inheritDoc} */ @Override public CacheWriteSynchronizationMode syncMode(GridCacheSharedContext cctx) { + return deriveSyncMode(cctx, activeCacheIds); + } + + /** + * @param cctx Context. + * @param cacheIds Processed caches. + * @return Write synchronization mode. + */ + public static CacheWriteSynchronizationMode deriveSyncMode(GridCacheSharedContext cctx, GridIntList cacheIds) { CacheWriteSynchronizationMode syncMode = CacheWriteSynchronizationMode.FULL_ASYNC; - for (int i = 0; i < activeCacheIds.size(); i++) { - int cacheId = activeCacheIds.get(i); + for (int i = 0; i < cacheIds.size(); i++) { + int cacheId = cacheIds.get(i); CacheWriteSynchronizationMode cacheSyncMode = cctx.cacheContext(cacheId).config().getWriteSynchronizationMode(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionEx.java index 9d1fe99ffe791..12a284a7c38e1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionEx.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionEx.java @@ -22,7 +22,6 @@ import java.io.ObjectInput; import java.io.ObjectOutput; import org.apache.ignite.cache.CacheEntryVersion; -import org.apache.ignite.internal.Order; /** * Extended cache version which also has additional DR version. @@ -32,7 +31,6 @@ public class GridCacheVersionEx extends GridCacheVersion { private static final long serialVersionUID = 0L; /** DR version. */ - @Order(0) GridCacheVersion drVer; /** @@ -86,6 +84,10 @@ public GridCacheVersionEx(int topVer, int nodeOrderDrId, long order, GridCacheVe return conflictVersion(); } + /** */ + public void conflictVersion(GridCacheVersion drVer) { + this.drVer = drVer; + } /** {@inheritDoc} */ @Override public void readExternal(ObjectInput in) throws IOException { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/BaselineTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/BaselineTopology.java index 1f71cb192a2f5..0a573ff3cc91a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/BaselineTopology.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/BaselineTopology.java @@ -39,10 +39,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_DATA_CENTER_ID; + /** * BaselineTopology represents a set of "database nodes" - nodes responsible for holding persistent-enabled caches * and persisting their information to durable storage. - * + *

* Two major features BaselineTopology allows are: *

    *
  1. Protection from conflicting updates.
  2. @@ -61,10 +63,10 @@ * [A,B] [C] * | | * (2)updates to both parts - * + *

    * After independent updates applied to both parts of cluster at point(2) node C should not be allowed to join * [A,B] part. - * + *

    * The following algorithm makes sure node C will never join [A,B] part back: *

      *
    1. @@ -95,10 +97,10 @@ *
    2. * When BaselineTopology is set (e.g. on first activation) or recreated (e.g. with set-baseline command) * its ID on all nodes is incremented by one. - * + *

      * So when cluster receives a join request with BaselineTopology it firstly compares joining node BlT ID with * local BlT ID. - * + *

      * If joining node has a BaselineTopology with ID greater than one in cluster it means that BlT was changed * more times there; therefore new node is not allowed to join the cluster. *

    3. @@ -107,27 +109,27 @@ * Instead current set of online nodes from BaselineTopology is used to update {@link BaselineTopology#branchingPntHash} * property of current BaselineTopology. * Old value of the property is moved to {@link BaselineTopology#branchingHist} list. - * + *

      * If joining node and local BlT IDs are the same then cluster takes branchingPntHash of joining node * and verifies that its local branchingHist contains that hash. - * + *

      * If joining node hash is not presented in cluster branching history list * it means that joining node was activated independently of currently running cluster; * therefore new node is not allowed to join the cluster. - * + *

      * If joining node hash is presented in the history, that it is safe to let the node join the cluster. * *

    4. * When BaselineTopology is recreated (e.g. with set-baseline command) previous BaselineTopology is moved * to BaselineHistory (consult source code of {@link GridClusterStateProcessor} for more details). - * + *

      * If cluster sees that joining node BlT ID is less than cluster BlT ID it looks up for BaselineHistory item * for new node ID. * Having this BaselineHistory item cluster verifies that branching history of the item contains * branching point hash of joining node * (similar check as in the case above with only difference that joining node BlT is compared against * BaselineHistory item instead of BaselineTopology). - * + *

      * If new node branching point hash is found in the history than node is allowed to join; * otherwise it is rejected. *

    5. @@ -172,7 +174,7 @@ public class BaselineTopology implements Serializable { private final List branchingHist; /** - * @param nodeMap Map of node consistent ID to it's attributes. + * @param nodeMap Map of node consistent ID to its attributes. */ private BaselineTopology(Map> nodeMap, int id) { this.id = id; @@ -274,6 +276,20 @@ public Map attributes(Object consId) { return nodeMap.get(consId); } + /** + * Calculates number of datacenters presented in current baseline. + * + * @return Number of datacenters presented in the baseline or {@code -1} if unknown. + */ + public int numberOfDatacenters() { + Collection> allNodesAttrs = nodeMap.values(); + + if (!allNodesAttrs.isEmpty() && allNodesAttrs.iterator().next().get(ATTR_DATA_CENTER_ID) != null) + return (int)allNodesAttrs.stream().map(m -> m.get(ATTR_DATA_CENTER_ID)).distinct().count(); + + return -1; + } + /** * */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterIdAndTag.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterIdAndTag.java index 2b03f36377d60..17c49f2f07e85 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterIdAndTag.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterIdAndTag.java @@ -20,20 +20,27 @@ import java.io.Serializable; import java.util.Objects; import java.util.UUID; +import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.plugin.extensions.communication.Message; /** * Container class to send cluster ID and tag in disco data and to write them atomically to metastorage. */ -public class ClusterIdAndTag implements Serializable { +public class ClusterIdAndTag implements Serializable, Message { /** */ private static final long serialVersionUID = 0L; /** */ - private final UUID id; + @Order(0) + UUID id; /** */ - private final String tag; + @Order(1) + String tag; + + /** */ + public ClusterIdAndTag() { } /** * @param id Cluster ID. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterProcessor.java index b7d78a906a5b7..3b75f2baf09fb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterProcessor.java @@ -19,7 +19,6 @@ import java.io.Serializable; import java.util.Collection; -import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.Timer; @@ -76,6 +75,7 @@ import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.metric.MetricRegistry; import org.apache.ignite.mxbean.IgniteClusterMXBean; +import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.spi.discovery.DiscoveryDataBag; import org.apache.ignite.spi.discovery.DiscoveryDataBag.GridDiscoveryData; import org.apache.ignite.spi.discovery.DiscoveryMetricsProvider; @@ -100,9 +100,6 @@ * */ public class ClusterProcessor extends GridProcessorAdapter implements DistributedMetastorageLifecycleListener { - /** */ - private static final String ATTR_UPDATE_NOTIFIER_STATUS = "UPDATE_NOTIFIER_STATUS"; - /** */ private static final String CLUSTER_ID_TAG_KEY = DistributedMetaStorage.IGNITE_INTERNAL_KEY_PREFIX + "cluster.id.tag"; @@ -465,42 +462,31 @@ public IgniteFuture clientReconnectFuture() { /** {@inheritDoc} */ @Override public void collectJoiningNodeData(DiscoveryDataBag dataBag) { - dataBag.addJoiningNodeData(CLUSTER_PROC.ordinal(), getDiscoveryData()); + dataBag.addJoiningNodeData(CLUSTER_PROC.ordinal(), new ClusterUpdateNotifierDataBagItem(notifyEnabled.get())); } /** {@inheritDoc} */ @Override public void collectGridNodeData(DiscoveryDataBag dataBag) { - dataBag.addNodeSpecificData(CLUSTER_PROC.ordinal(), getDiscoveryData()); - - dataBag.addGridCommonData(CLUSTER_PROC.ordinal(), new ClusterIdAndTag(cluster.id(), cluster.tag())); - } - - /** - * @return Discovery data. - */ - private Serializable getDiscoveryData() { - HashMap map = new HashMap<>(2); - - map.put(ATTR_UPDATE_NOTIFIER_STATUS, notifyEnabled.get()); + dataBag.addNodeSpecificData(CLUSTER_PROC.ordinal(), new ClusterUpdateNotifierDataBagItem(notifyEnabled.get())); - return map; + dataBag.addGridCommonData(CLUSTER_PROC.ordinal(), (Message)new ClusterIdAndTag(cluster.id(), cluster.tag())); } /** {@inheritDoc} */ @Override public void onGridDataReceived(GridDiscoveryData data) { - Map nodeSpecData = data.nodeSpecificData(); + Map updateNotifierData = data.nodeSpecificData(); - if (nodeSpecData != null) { - Boolean lstFlag = findLastFlag(nodeSpecData.values()); + if (updateNotifierData != null) { + Boolean updateNotifierEnabled = findLastUpdateNotifierStatus(updateNotifierData.values()); - if (lstFlag != null) - notifyEnabled.set(lstFlag); + if (updateNotifierEnabled != null) + notifyEnabled.set(updateNotifierEnabled); } - ClusterIdAndTag commonData = (ClusterIdAndTag)data.commonData(); + ClusterIdAndTag idAndTag = data.commonData(); - if (commonData != null) { - Serializable remoteClusterId = commonData.id(); + if (idAndTag != null) { + UUID remoteClusterId = idAndTag.id(); if (remoteClusterId != null) { if (locClusterId != null && !locClusterId.equals(remoteClusterId)) { @@ -510,10 +496,10 @@ private Serializable getDiscoveryData() { ", local cluster ID: " + locClusterId); } - locClusterId = (UUID)remoteClusterId; + locClusterId = remoteClusterId; } - String remoteClusterTag = commonData.tag(); + String remoteClusterTag = idAndTag.tag(); if (remoteClusterTag != null) locClusterTag = remoteClusterTag; @@ -521,21 +507,17 @@ private Serializable getDiscoveryData() { } /** - * @param vals collection to seek through. + * @param notifierItems Collection of update notifiers statuses to seek through. */ - private Boolean findLastFlag(Collection vals) { - Boolean flag = null; - - for (Serializable ser : vals) { - if (ser != null) { - Map map = (Map)ser; + private Boolean findLastUpdateNotifierStatus(Collection notifierItems) { + Boolean updateNotifierEnabled = null; - if (map.containsKey(ATTR_UPDATE_NOTIFIER_STATUS)) - flag = (Boolean)map.get(ATTR_UPDATE_NOTIFIER_STATUS); - } + for (ClusterUpdateNotifierDataBagItem notifierItem : notifierItems) { + if (notifierItem != null) + updateNotifierEnabled = notifierItem.notifierEnabled; } - return flag; + return updateNotifierEnabled; } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterUpdateNotifierDataBagItem.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterUpdateNotifierDataBagItem.java new file mode 100644 index 0000000000000..a33ff48ba4e28 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ClusterUpdateNotifierDataBagItem.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cluster; + +import org.apache.ignite.internal.Order; +import org.apache.ignite.plugin.extensions.communication.Message; + +/** */ +public class ClusterUpdateNotifierDataBagItem implements Message { + /** Update notifier enabled status. */ + @Order(0) + boolean notifierEnabled; + + /** */ + public ClusterUpdateNotifierDataBagItem() { } + + /** @param notifierEnabled Update notifier enabled status. */ + public ClusterUpdateNotifierDataBagItem(boolean notifierEnabled) { + this.notifierEnabled = notifierEnabled; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java index 337b4f51a70c3..3d9d20faf535e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java @@ -965,14 +965,16 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, /** {@inheritDoc} */ @Override public void onGridDataReceived(DiscoveryDataBag.GridDiscoveryData data) { - if (data.commonData() instanceof DiscoveryDataClusterState) { + Serializable commonData = data.commonData(); + + if (commonData instanceof DiscoveryDataClusterState) { if (globalState != null && globalState.baselineTopology() != null) //node with BaselineTopology is not allowed to join mixed cluster // (where some nodes don't support BaselineTopology) throw new IgniteException("Node with BaselineTopology cannot join" + " mixed cluster running in compatibility mode"); - globalState = (DiscoveryDataClusterState)data.commonData(); + globalState = (DiscoveryDataClusterState)commonData; compatibilityMode = true; @@ -981,7 +983,7 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, return; } - BaselineStateAndHistoryData stateDiscoData = (BaselineStateAndHistoryData)data.commonData(); + BaselineStateAndHistoryData stateDiscoData = (BaselineStateAndHistoryData)commonData; if (stateDiscoData != null) { DiscoveryDataClusterState state = stateDiscoData.globalState; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java index 489f13e71fee8..7291e631c2f31 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java @@ -528,8 +528,7 @@ private Map copyLocalInfos(Map l @Override public void onGridDataReceived(GridDiscoveryData data) { if (immutableDiscoCustomMsg) { if (data.commonData() != null) { - ContinuousRoutinesCommonDiscoveryData commonData = - (ContinuousRoutinesCommonDiscoveryData)data.commonData(); + ContinuousRoutinesCommonDiscoveryData commonData = data.commonData(); for (ContinuousRoutineInfo routineInfo : commonData.startedRoutines) { if (routinesInfo.routineExists(routineInfo.routineId)) @@ -542,11 +541,11 @@ private Map copyLocalInfos(Map l } } else { - Map nodeSpecData = data.nodeSpecificData(); + Map nodeSpecData = data.nodeSpecificData(); if (nodeSpecData != null) { - for (Map.Entry e : nodeSpecData.entrySet()) - onDiscoveryDataReceivedMutable((DiscoveryData)e.getValue()); + for (DiscoveryData val : nodeSpecData.values()) + onDiscoveryDataReceivedMutable(val); } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java index 5f81792151696..6900102982072 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java @@ -75,6 +75,7 @@ import org.apache.ignite.internal.systemview.ReentrantLockViewWalker; import org.apache.ignite.internal.systemview.SemaphoreViewWalker; import org.apache.ignite.internal.systemview.SetViewWalker; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.lang.GridPlainCallable; import org.apache.ignite.internal.util.lang.IgniteClosureX; import org.apache.ignite.internal.util.lang.IgniteInClosureX; @@ -137,13 +138,13 @@ public final class DataStructuresProcessor extends GridProcessorAdapter implemen public static final String VOLATILE_GRP_NAME = DEFAULT_VOLATILE_DS_GROUP_NAME + "@" + VOLATILE_DATA_REGION_NAME; /** */ - public static final String DEFAULT_DS_GROUP_NAME = "default-ds-group"; + public static final String DEFAULT_DS_GROUP_NAME = CommonUtils.DEFAULT_DS_GROUP_NAME; /** */ private static final String DS_CACHE_NAME_PREFIX = "datastructures_"; /** Atomics system cache name. */ - public static final String ATOMICS_CACHE_NAME = "ignite-sys-atomic-cache"; + public static final String ATOMICS_CACHE_NAME = CommonUtils.ATOMICS_CACHE_NAME; /** */ public static final String QUEUES_VIEW = metricName("ds", "queues"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheQueueAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheQueueAdapter.java index 0ca9467fbdb58..3f1456e2155e1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheQueueAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheQueueAdapter.java @@ -433,18 +433,10 @@ protected GridCacheQueueAdapter(String queueName, GridCacheQueueHeader hdr, Grid if (opCtx != null && opCtx.isKeepBinary()) return (GridCacheQueueAdapter)this; - opCtx = opCtx == null ? new CacheOperationContext( - false, - false, - true, - null, - false, - null, - false, - null, - null, - false) - : opCtx.keepBinary(); + if (opCtx == null) + opCtx = CacheOperationContext.builder().keepBinary(true).build(); + else + opCtx = opCtx.withKeepBinary(); cctx.operationContextPerCall(opCtx); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/GridMarshallerMappingProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/GridMarshallerMappingProcessor.java index 8946672364edb..374ea7fe51834 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/GridMarshallerMappingProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/GridMarshallerMappingProcessor.java @@ -326,34 +326,32 @@ private final class MappingAcceptedListener implements CustomEventListener> mappings = (List>)data.commonData(); - - processIncomingMappings(mappings); + processIncomingMappings(data.commonData()); } /** - * @param mappings Incoming marshaller mappings. + * @param marshallerItem Incoming marshaller mappings wrapper. */ - private void processIncomingMappings(List> mappings) { - marshallerCtx.onMappingDataReceived(log, mappings); + private void processIncomingMappings(@Nullable MarshallerDataBagItem marshallerItem) { + if (marshallerItem != null) + marshallerCtx.onMappingDataReceived(log, marshallerItem.mappings()); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MarshallerMappingsData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MarshallerDataBagItem.java similarity index 78% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MarshallerMappingsData.java rename to modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MarshallerDataBagItem.java index 2207b1c21f47c..9b9a0d8b21ccb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MarshallerMappingsData.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MarshallerDataBagItem.java @@ -23,18 +23,21 @@ import org.apache.ignite.plugin.extensions.communication.Message; /** */ -public class MarshallerMappingsData implements Message { +public class MarshallerDataBagItem implements Message { /** */ @Order(0) List> mappings; /** */ - public MarshallerMappingsData() {} + public MarshallerDataBagItem() {} - /** - * @param mappings Mappings. - */ - public MarshallerMappingsData(List> mappings) { + /** @param mappings Mappings. */ + public MarshallerDataBagItem(List> mappings) { this.mappings = mappings; } + + /** @return Mappings. */ + public List> mappings() { + return mappings; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java index 1362fec2e7f5b..ad9022f2e9747 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java @@ -958,7 +958,7 @@ private DistributedMetaStorageKeyValuePair[] localFullData() { lock.writeLock().lock(); try { - DistributedMetaStorageClusterNodeData nodeData = (DistributedMetaStorageClusterNodeData)data.commonData(); + DistributedMetaStorageClusterNodeData nodeData = data.commonData(); if (nodeData != null) { if (nodeData.fullData != null) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java index 3d6f6ab75c3be..4e1f32ba1eeba 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java @@ -40,6 +40,7 @@ import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext; import org.apache.ignite.internal.processors.platform.client.ClientStatus; import org.apache.ignite.internal.thread.context.Scope; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridSpinBusyLock; import org.apache.ignite.internal.util.nio.GridNioServerListenerAdapter; import org.apache.ignite.internal.util.nio.GridNioSession; @@ -63,7 +64,7 @@ public class ClientListenerNioListener extends GridNioServerListenerAdapterbuilder() + GridNioServer.Builder builder = GridNioServer.builder() .address(hostAddr) .port(port) .listener(new ClientListenerNioListener(ctx, busyLock, cliConnCfg, metrics, newConnEnabled)) @@ -210,9 +210,11 @@ public ClientListenerProcessor(GridKernalContext ctx) { .filters(filters) .directMode(true) .idleTimeout(idleTimeout > 0 ? idleTimeout : Long.MAX_VALUE) - .metricRegistry(mreg) - .messageQueueSizeListener(msgQueueSizeLsnr) - .build(); + .messageQueueSizeListener(msgQueueSizeLsnr); + + srv = U.setNioServerMetrics(builder, mreg).build(); + + U.registerNioServerMetrics(srv, filters, mreg); ctx.ports().registerPort(port, IgnitePortProtocol.TCP, getClass()); @@ -492,7 +494,7 @@ else if (connCtx.managementClient()) { throw new IgniteCheckedException("Failed to create client listener " + "(SSL is enabled but factory is null). Check the ClientConnectorConfiguration"); - GridNioSslFilter sslFilter = new GridNioSslFilter(sslCtxFactory.create(), + GridNioSslFilter sslFilter = U.sslFilter(sslCtxFactory.create(), true, ByteOrder.nativeOrder(), log, ctx.metric().registry(CLIENT_CONNECTOR_METRICS)); sslFilter.directMode(true); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequest.java index d7006f70a617f..2ee25e4aab614 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequest.java @@ -17,12 +17,14 @@ package org.apache.ignite.internal.processors.odbc; +import org.apache.ignite.internal.util.CommonUtils; + /** * Client listener command request. */ public interface ClientListenerRequest { /** Handshake request. */ - public static final int HANDSHAKE = 1; + public static final int HANDSHAKE = CommonUtils.HANDSHAKE; /** * @return Request ID. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequestHandler.java index 6e08e5f7dde02..62783177149cc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerRequestHandler.java @@ -47,7 +47,6 @@ public interface ClientListenerRequestHandler { */ void writeHandshake(BinaryWriterEx writer); - /** * Checks whether query cancellation is supported within given version of protocol. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/performancestatistics/PerformanceStatisticsProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/performancestatistics/PerformanceStatisticsProcessor.java index 994670837127b..d488bd6bc77f8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/performancestatistics/PerformanceStatisticsProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/performancestatistics/PerformanceStatisticsProcessor.java @@ -124,7 +124,7 @@ public PerformanceStatisticsProcessor(GridKernalContext ctx) { }); rotateProc = new DistributedProcess<>(ctx, PERFORMANCE_STATISTICS_ROTATE, - req -> ctx.closure().callLocalSafe(() -> { + (id, req) -> ctx.closure().callLocalSafe(() -> { rotateWriter(); return null; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequestHandler.java index bd15a26ff0a6a..85298183728e5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequestHandler.java @@ -115,7 +115,7 @@ public class ClientRequestHandler implements ClientListenerRequestHandler { return handle0(req); } catch (SecurityException ex) { - throw IgniteClientException.wrapAuthorizationExeption(ex); + throw wrapAuthorizationExeption(ex); } } @@ -229,4 +229,13 @@ private int getStatus(Throwable e) { return ClientStatus.FAILED; } + + /** */ + public static IgniteClientException wrapAuthorizationExeption(SecurityException e) { + return new IgniteClientException( + ClientStatus.SECURITY_VIOLATION, + "Client is not authorized to perform this operation [errMsg=" + e.getMessage() + ']', + e + ); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java index 972184f9791bd..abc7ed4da0c8d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java @@ -29,8 +29,8 @@ import org.apache.ignite.internal.processors.platform.client.ClientBitmaskFeature; import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext; import org.apache.ignite.internal.processors.platform.client.ClientProtocolContext; +import org.apache.ignite.internal.processors.platform.client.ClientRequestHandler; import org.apache.ignite.internal.processors.platform.client.ClientResponse; -import org.apache.ignite.internal.processors.platform.client.IgniteClientException; import org.apache.ignite.internal.processors.platform.client.tx.ClientTxAwareRequest; import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.typedef.X; @@ -174,7 +174,7 @@ public ClientCacheSqlFieldsQueryRequest(BinaryReaderEx reader, SecurityException securityEx = X.cause(e, SecurityException.class); if (securityEx != null) - throw IgniteClientException.wrapAuthorizationExeption(securityEx); + throw ClientRequestHandler.wrapAuthorizationExeption(securityEx); throw e; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java index 804f5bf743a54..993db181dbc68 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java @@ -166,24 +166,24 @@ public T createComponent(Class cls) { /** {@inheritDoc} */ @Override public void collectJoiningNodeData(DiscoveryDataBag dataBag) { - Serializable pluginsData = getDiscoveryData(dataBag.joiningNodeId()); + PluginsDataBagItem pluginsItem = itemForDataBag(dataBag.joiningNodeId()); - if (pluginsData != null) - dataBag.addJoiningNodeData(PLUGIN.ordinal(), pluginsData); + if (!F.isEmpty(pluginsItem.data)) + dataBag.addJoiningNodeData(PLUGIN.ordinal(), pluginsItem); } /** {@inheritDoc} */ @Override public void collectGridNodeData(DiscoveryDataBag dataBag) { - Serializable pluginsData = getDiscoveryData(dataBag.joiningNodeId()); + PluginsDataBagItem pluginsItem = itemForDataBag(dataBag.joiningNodeId()); - if (pluginsData != null) - dataBag.addNodeSpecificData(PLUGIN.ordinal(), pluginsData); + if (!F.isEmpty(pluginsItem.data)) + dataBag.addNodeSpecificData(PLUGIN.ordinal(), pluginsItem); } /** * @param joiningNodeId Joining node id. */ - private Serializable getDiscoveryData(UUID joiningNodeId) { + private PluginsDataBagItem itemForDataBag(UUID joiningNodeId) { HashMap pluginsData = null; for (Map.Entry e : plugins.entrySet()) { @@ -197,31 +197,27 @@ private Serializable getDiscoveryData(UUID joiningNodeId) { } } - return pluginsData; + return new PluginsDataBagItem(pluginsData); } /** {@inheritDoc} */ @Override public void onJoiningNodeDataReceived(JoiningNodeDiscoveryData data) { - if (data.hasJoiningNodeData()) { - Map pluginsData = data.joiningNodeData(); + PluginsDataBagItem pluginsItem = data.joiningNodeData(); - applyPluginsData(data.joiningNodeId(), pluginsData); - } + if (pluginsItem != null && !F.isEmpty(pluginsItem.data)) + applyPluginsData(data.joiningNodeId(), pluginsItem.data); } /** {@inheritDoc} */ @Override public void onGridDataReceived(GridDiscoveryData data) { - Map nodeSpecificData = data.nodeSpecificData(); + Map nodeSpecificData = data.nodeSpecificData(); if (nodeSpecificData != null) { UUID joiningNodeId = data.joiningNodeId(); - for (Serializable v : nodeSpecificData.values()) { - if (v != null) { - Map pluginsData = (Map)v; - - applyPluginsData(joiningNodeId, pluginsData); - } + for (PluginsDataBagItem pluginsItem : nodeSpecificData.values()) { + if (pluginsItem != null && !F.isEmpty(pluginsItem.data)) + applyPluginsData(joiningNodeId, pluginsItem.data); } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/PluginsDataBagItem.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/PluginsDataBagItem.java new file mode 100644 index 0000000000000..9b70e42223788 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/PluginsDataBagItem.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.plugin; + +import java.io.Serializable; +import java.util.Map; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.MarshallableMessage; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.marshaller.Marshaller; +import org.jetbrains.annotations.Nullable; + +/** */ +public class PluginsDataBagItem implements MarshallableMessage { + /** Original plugins data. */ + @Nullable Map data; + + /** Serialized plugins data. */ + @Order(0) + @Nullable byte[] dataBytes; + + /** */ + public PluginsDataBagItem() { } + + /** @param data Plugins data. */ + public PluginsDataBagItem(@Nullable Map data) { + this.data = data; + } + + /** {@inheritDoc} */ + @Override public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { + if (!F.isEmpty(data)) + dataBytes = U.marshal(marsh, data); + } + + /** {@inheritDoc} */ + @Override public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { + if (dataBytes != null) + data = U.unmarshal(marsh, dataBytes, clsLdr); + } + + /** @return Original plugins data. */ + public @Nullable Map data() { + return data; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index 854e8a17e5880..3008503660c5e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.query; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -118,6 +117,8 @@ import org.apache.ignite.internal.processors.query.schema.SchemaOperationWorker; import org.apache.ignite.internal.processors.query.schema.SchemaSqlViewManager; import org.apache.ignite.internal.processors.query.schema.management.SchemaManager; +import org.apache.ignite.internal.processors.query.schema.message.QueryInlineSizesDataBagItem; +import org.apache.ignite.internal.processors.query.schema.message.QueryProposalsDataBagItem; import org.apache.ignite.internal.processors.query.schema.message.SchemaAbstractDiscoveryMessage; import org.apache.ignite.internal.processors.query.schema.message.SchemaFinishDiscoveryMessage; import org.apache.ignite.internal.processors.query.schema.message.SchemaOperationStatusMessage; @@ -181,9 +182,6 @@ */ @SuppressWarnings("rawtypes") public class GridQueryProcessor extends GridProcessorAdapter { - /** */ - private static final String INLINE_SIZES_DISCO_BAG_KEY = "inline_sizes"; - /** Warn message if some indexes have different inline sizes on the nodes. */ public static final String INLINE_SIZES_DIFFER_WARN_MSG_FORMAT = "Inline sizes on local node and node %s are different. " + "Please drop and create again these indexes to avoid performance problems with SQL queries. Problem indexes: %s"; @@ -473,71 +471,60 @@ public void onCacheReconnect() throws IgniteCheckedException { /** {@inheritDoc} */ @Override public void collectGridNodeData(DiscoveryDataBag dataBag) { - LinkedHashMap proposals; + QueryProposalsDataBagItem proposalsItem; // Collect active proposals. synchronized (stateMux) { - proposals = new LinkedHashMap<>(activeProposals); + proposalsItem = new QueryProposalsDataBagItem(new LinkedHashMap<>(activeProposals)); } - dataBag.addGridCommonData(DiscoveryDataExchangeType.QUERY_PROC.ordinal(), proposals); + dataBag.addGridCommonData(DiscoveryDataExchangeType.QUERY_PROC.ordinal(), proposalsItem); // We should send inline index sizes information only to server nodes. if (!dataBag.isJoiningNodeClient()) { - HashMap nodeSpecificMap = new HashMap<>(); - - Serializable oldVal = nodeSpecificMap.put(INLINE_SIZES_DISCO_BAG_KEY, collectSecondaryIndexesInlineSize()); - - assert oldVal == null : oldVal; - - dataBag.addNodeSpecificData(DiscoveryDataExchangeType.QUERY_PROC.ordinal(), nodeSpecificMap); + dataBag.addNodeSpecificData(DiscoveryDataExchangeType.QUERY_PROC.ordinal(), + new QueryInlineSizesDataBagItem(secondaryIndexesInlineSize())); } } /** {@inheritDoc} */ @Override public void onJoiningNodeDataReceived(DiscoveryDataBag.JoiningNodeDiscoveryData data) { - Object joiningNodeData = data.joiningNodeData(); - - if (joiningNodeData instanceof InlineSizesData) { - Map joiningNodeIndexesInlineSize = ((InlineSizesData)joiningNodeData).sizes; + QueryInlineSizesDataBagItem inlineSizesItem = data.joiningNodeData(); - checkInlineSizes(secondaryIndexesInlineSize(), joiningNodeIndexesInlineSize, data.joiningNodeId()); - } + if (inlineSizesItem != null) + checkInlineSizes(secondaryIndexesInlineSize(), inlineSizesItem.sizes(), data.joiningNodeId()); } /** {@inheritDoc} */ @Override public void collectJoiningNodeData(DiscoveryDataBag dataBag) { dataBag.addJoiningNodeData(DiscoveryDataExchangeType.QUERY_PROC.ordinal(), - new InlineSizesData(secondaryIndexesInlineSize())); + new QueryInlineSizesDataBagItem(secondaryIndexesInlineSize())); } /** {@inheritDoc} */ @Override public void onGridDataReceived(DiscoveryDataBag.GridDiscoveryData data) { // Preserve proposals. - LinkedHashMap activeProposals = - (LinkedHashMap)data.commonData(); + QueryProposalsDataBagItem proposalsItem = data.commonData(); // Process proposals as if they were received as regular discovery messages. - if (!F.isEmpty(activeProposals)) { + if (proposalsItem != null && !F.isEmpty(proposalsItem.activeProposals())) { synchronized (stateMux) { - for (SchemaProposeDiscoveryMessage activeProposal : activeProposals.values()) + for (SchemaProposeDiscoveryMessage activeProposal : proposalsItem.activeProposals().values()) onSchemaProposeDiscovery0(activeProposal); } } - if (!F.isEmpty(data.nodeSpecificData())) { + Map nodedSpecificData = data.nodeSpecificData(); + + if (!F.isEmpty(nodedSpecificData)) { Map indexesInlineSize = secondaryIndexesInlineSize(); if (!F.isEmpty(indexesInlineSize)) { - for (UUID nodeId : data.nodeSpecificData().keySet()) { - Serializable serializable = data.nodeSpecificData().get(nodeId); - - assert serializable instanceof Map : serializable; + for (UUID nodeId : nodedSpecificData.keySet()) { + QueryInlineSizesDataBagItem inlineSizesItem = nodedSpecificData.get(nodeId); - Map nodeSpecificData = (Map)serializable; - - if (nodeSpecificData.containsKey(INLINE_SIZES_DISCO_BAG_KEY)) - checkInlineSizes(indexesInlineSize, (Map)nodeSpecificData.get(INLINE_SIZES_DISCO_BAG_KEY), nodeId); + if (inlineSizesItem != null) + checkInlineSizes(indexesInlineSize, inlineSizesItem.sizes(), nodeId); } } } @@ -685,16 +672,6 @@ private void checkInlineSizes(Map local, Map r } } - /** - * @return Serializable information about secondary indexes inline size. - * @see #secondaryIndexesInlineSize() - */ - private Serializable collectSecondaryIndexesInlineSize() { - Map map = secondaryIndexesInlineSize(); - - return map instanceof Serializable ? (Serializable)map : new HashMap<>(map); - } - /** * Process schema propose message from discovery thread. * @@ -951,6 +928,7 @@ private void onSchemaFinishDiscovery(SchemaFinishDiscoveryMessage msg) { * * @param schemaOp Schema operation. */ + @SuppressWarnings("unchecked") private void startSchemaChange(SchemaOperation schemaOp) { assert Thread.holdsLock(stateMux); assert !schemaOp.started(); @@ -1009,6 +987,14 @@ private void startSchemaChange(SchemaOperation schemaOp) { mgr.start(); + worker.future().listen(new IgniteInClosure() { + @Override public void apply(IgniteInternalFuture fut) { + synchronized (stateMux) { + mgr.onLocalNodeFinished(fut); + } + } + }); + // Unwind pending IO messages. if (!ctx.clientNode() && coordinator().isLocal()) unwindPendingMessages(schemaOp.id(), mgr); @@ -4407,4 +4393,9 @@ public IgniteStatisticsManager statsManager() { public QueryEngine defaultQueryEngine() { return dfltQryEngine; } + + /** */ + public boolean isLockedByCurrentThread() { + return Thread.holdsLock(stateMux); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryContext.java index a9dbe02255ece..ac7dfc2eb90e0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryContext.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.List; import org.apache.ignite.internal.util.typedef.F; +import org.jetbrains.annotations.Nullable; /** */ public final class QueryContext { @@ -36,10 +37,10 @@ private QueryContext(Object[] params) { } /** - * Finds an instance of an interface implemented by this object, - * or returns null if this object does not support that interface. + * Finds an instance of an interface implemented by this object + * or returns {@code null} if this object does not support that interface. */ - public C unwrap(Class aClass) { + public @Nullable C unwrap(Class aClass) { if (Object[].class == aClass) return aClass.cast(params); @@ -50,12 +51,12 @@ public C unwrap(Class aClass) { * @param params Context parameters. * @return Query context. */ - public static QueryContext of(Object... params) { + public static QueryContext of(@Nullable Object... params) { return !F.isEmpty(params) ? new QueryContext(build(null, params).toArray()) : new QueryContext(EMPTY); } /** */ - private static List build(List dst, Object[] src) { + private static List build(List dst, @Nullable Object[] src) { if (dst == null) dst = new ArrayList<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryField.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryField.java index b24e523a2b785..29659e60da36f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryField.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryField.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.query; -import java.io.Serializable; import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.plugin.extensions.communication.Message; @@ -25,10 +24,7 @@ /** * Query field metadata. */ -public class QueryField implements Serializable, Message { - /** */ - private static final long serialVersionUID = 0L; - +public class QueryField implements Message { /** Field name. */ @Order(0) String name; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java index 332a7d1ab2780..21a16ba4d6151 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java @@ -1138,30 +1138,7 @@ public static boolean isSqlType(Class cls) { * @return Type name. */ public static String typeName(String clsName) { - int genericStart = clsName.indexOf('`'); // .NET generic, not valid for Java class name. - - if (genericStart >= 0) - clsName = clsName.substring(0, genericStart); - - int pkgEnd = clsName.lastIndexOf('.'); - - if (pkgEnd >= 0 && pkgEnd < clsName.length() - 1) - clsName = clsName.substring(pkgEnd + 1); - - if (clsName.endsWith("[]")) - clsName = clsName.substring(0, clsName.length() - 2) + "_array"; - - int parentEnd = clsName.lastIndexOf('$'); - - if (parentEnd >= 0) - clsName = clsName.substring(parentEnd + 1); - - parentEnd = clsName.lastIndexOf('+'); // .NET parent - - if (parentEnd >= 0) - clsName = clsName.substring(parentEnd + 1); - - return clsName; + return CommonUtils.typeName(clsName); } /** @@ -1171,22 +1148,7 @@ public static String typeName(String clsName) { * @return Type name. */ public static String typeName(Class cls) { - String typeName = cls.getSimpleName(); - - // To protect from failure on anonymous classes. - if (F.isEmpty(typeName)) { - String pkg = cls.getPackage().getName(); - - typeName = cls.getName().substring(pkg.length() + (pkg.isEmpty() ? 0 : 1)); - } - - if (cls.isArray()) { - assert typeName.endsWith("[]"); - - typeName = typeName.substring(0, typeName.length() - 2) + "_array"; - } - - return typeName; + return CommonUtils.typeName(cls); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationManager.java index 306c5caecf448..e4012cb52c605 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationManager.java @@ -30,7 +30,6 @@ import org.apache.ignite.internal.processors.query.GridQueryProcessor; import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.typedef.T2; -import org.apache.ignite.lang.IgniteInClosure; import org.jetbrains.annotations.Nullable; /** @@ -49,7 +48,10 @@ public class SchemaOperationManager { /** Operation handler. */ private final SchemaOperationWorker worker; - /** Mutex for concurrency control. */ + /** + * Mutex for concurrency control. It's crucial to maintain locks order to avoid deadlocks, + * query processor should be locked before locking this mutex. + */ private final Object mux = new Object(); /** Participants. */ @@ -86,6 +88,8 @@ public SchemaOperationManager(GridKernalContext ctx, GridQueryProcessor qryProc, this.qryProc = qryProc; this.worker = worker; + assertQueryProcessorLockedBeforeOperationLock(); + synchronized (mux) { this.crd = crd; @@ -96,17 +100,8 @@ public SchemaOperationManager(GridKernalContext ctx, GridQueryProcessor qryProc, /** * Map operation handling. */ - @SuppressWarnings("unchecked") public void start() { worker.start(); - - synchronized (mux) { - worker.future().listen(new IgniteInClosure() { - @Override public void apply(IgniteInternalFuture fut) { - onLocalNodeFinished(fut); - } - }); - } } /** @@ -114,7 +109,7 @@ public void start() { * * @param fut Future. */ - private void onLocalNodeFinished(IgniteInternalFuture fut) { + public void onLocalNodeFinished(IgniteInternalFuture fut) { assert fut.isDone(); if (ctx.clientNode()) @@ -131,6 +126,8 @@ private void onLocalNodeFinished(IgniteInternalFuture fut) { err = QueryUtils.wrapIfNeeded(e); } + assertQueryProcessorLockedBeforeOperationLock(); + synchronized (mux) { if (isLocalCoordinator()) onNodeFinished(ctx.localNodeId(), err, worker.nop()); @@ -146,6 +143,8 @@ private void onLocalNodeFinished(IgniteInternalFuture fut) { * @param err Error. */ public void onNodeFinished(UUID nodeId, @Nullable SchemaOperationException err, boolean nop) { + assertQueryProcessorLockedBeforeOperationLock(); + synchronized (mux) { assert isLocalCoordinator(); @@ -181,6 +180,8 @@ public void onNodeFinished(UUID nodeId, @Nullable SchemaOperationException err, * @param curCrd Current coordinator node. */ public void onNodeLeave(UUID nodeId, ClusterNode curCrd) { + assertQueryProcessorLockedBeforeOperationLock(); + synchronized (mux) { assert crd != null; @@ -206,6 +207,12 @@ else if (isLocalCoordinator()) { } } + /** */ + private void assertQueryProcessorLockedBeforeOperationLock() { + assert qryProc.isLockedByCurrentThread() : "Locks order violation, GridQueryProcessor.stateMux must be " + + "acquired before SchemaOperationManager.mux"; + } + /** * Check if operation finished. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityExMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityExMessage.java new file mode 100644 index 0000000000000..e080910dd818f --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityExMessage.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.schema.message; + +import org.apache.ignite.cache.QueryEntity; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.processors.query.QueryEntityEx; + +/** Message for {@link QueryEntityEx} transfer. */ +public class QueryEntityExMessage extends QueryEntityMessage { + /** Whether to preserve order specified by 'keyFields' or not. */ + @Order(0) + boolean preserveKeysOrder; + + /** Whether a primary key should be autocreated or not. */ + @Order(1) + boolean implicitPk; + + /** Whether absent PK parts should be filled with defaults or not. */ + @Order(2) + boolean fillAbsentPKsWithDefaults; + + /** INLINE_SIZE for PK index. */ + @Order(3) + int pkInlineSize; + + /** INLINE_SIZE for affinity field index. */ + @Order(4) + int affKeyInlineSize; + + /** Whether query entity was created by SQL. */ + @Order(5) + boolean sql; + + /** */ + public QueryEntityExMessage() { } + + /** + * @param qryEntity Original {@link QueryEntity}. + */ + public QueryEntityExMessage(QueryEntityEx qryEntity) { + super(qryEntity); + + preserveKeysOrder = qryEntity.isPreserveKeysOrder(); + implicitPk = qryEntity.implicitPk(); + fillAbsentPKsWithDefaults = qryEntity.fillAbsentPKsWithDefaults(); + + pkInlineSize = qryEntity.getPrimaryKeyInlineSize() != null ? qryEntity.getPrimaryKeyInlineSize() : -1; + + affKeyInlineSize = qryEntity.getAffinityKeyInlineSize() != null ? qryEntity.getAffinityKeyInlineSize() : -1; + + sql = qryEntity.sql(); + } + + /** {@inheritDoc} */ + @Override public QueryEntity toEntity() { + QueryEntityEx qryEntity = new QueryEntityEx(entityBase()); + + qryEntity.setNotNullFields(notNullFields); + qryEntity.setPreserveKeysOrder(preserveKeysOrder); + qryEntity.implicitPk(implicitPk); + qryEntity.fillAbsentPKsWithDefaults(fillAbsentPKsWithDefaults); + qryEntity.sql(sql); + + if (pkInlineSize != -1) + qryEntity.setPrimaryKeyInlineSize(pkInlineSize); + + if (affKeyInlineSize != -1) + qryEntity.setAffinityKeyInlineSize(affKeyInlineSize); + + return qryEntity; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessage.java new file mode 100644 index 0000000000000..8c6daf46cfd54 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessage.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.schema.message; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.cache.QueryEntity; +import org.apache.ignite.internal.MarshallableMessage; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.cache.query.QueryIndexMessage; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.marshaller.Marshaller; + +/** + * Message for {@link QueryEntity} transfer. + */ +public class QueryEntityMessage implements MarshallableMessage { + /** Key type. */ + @Order(0) + String keyType; + + /** Value type. */ + @Order(1) + String valType; + + /** Key name. */ + @Order(2) + String keyFieldName; + + /** Value name. */ + @Order(3) + String valFieldName; + + /** Fields available for query. */ + @Order(4) + LinkedHashMap fields; + + /** Set of field names that belong to the key. */ + @Order(5) + String[] keyFields; + + /** Aliases. */ + @Order(6) + Map aliases; + + /** Collection of query indexes. */ + @Order(7) + Collection idxs; + + /** Table name. */ + @Order(8) + String tableName; + + /** + * Fields that must have non-null value. + * NB: Used in serde of both QueryEntity and QueryEntityEx in order to avoid duplication. + */ + @Order(9) + Set notNullFields; + + /** Fields default values. */ + Map dfltFieldValues; + + /** Serialized form of {@link #dfltFieldValues}. */ + @Order(10) + byte[] dfltFieldValuesBytes; + + /** Precision(Maximum length) for fields. */ + @Order(11) + Map fieldsPrecision; + + /** Scale for fields. */ + @Order(12) + Map fieldsScale; + + /** */ + public QueryEntityMessage() { } + + /** @param qryEntity Original {@link QueryEntity}. */ + public QueryEntityMessage(QueryEntity qryEntity) { + keyType = qryEntity.getKeyType(); + valType = qryEntity.getValueType(); + + keyFieldName = qryEntity.getKeyFieldName(); + valFieldName = qryEntity.getValueFieldName(); + + fields = qryEntity.getFields(); + aliases = qryEntity.getAliases(); + + if (!F.isEmpty(qryEntity.getKeyFields())) + keyFields = qryEntity.getKeyFields().toArray(U.EMPTY_STRS); + + if (!F.isEmpty(qryEntity.getIndexes())) + idxs = F.viewReadOnly(qryEntity.getIndexes(), QueryIndexMessage::new); + + tableName = qryEntity.getTableName(); + + notNullFields = qryEntity.getNotNullFields(); + dfltFieldValues = qryEntity.getDefaultFieldValues(); + fieldsPrecision = qryEntity.getFieldsPrecision(); + fieldsScale = qryEntity.getFieldsScale(); + } + + /** @return Original {@link QueryEntity}. */ + public QueryEntity toEntity() { + return entityBase().setNotNullFields(notNullFields); + } + + /** @return Entity without 'notNullFields.' */ + protected QueryEntity entityBase() { + return new QueryEntity() + .setKeyType(keyType) + .setValueType(valType) + .setKeyFieldName(keyFieldName) + .setValueFieldName(valFieldName) + .setFields(fields) + .setKeyFields(!F.isEmpty(keyFields) ? new LinkedHashSet<>(List.of(keyFields)) : null) + .setAliases(aliases) + .setIndexes(!F.isEmpty(idxs) ? F.transform(idxs, QueryIndexMessage::queryIndex) : null) + .setTableName(tableName) + .setDefaultFieldValues(dfltFieldValues) + .setFieldsPrecision(fieldsPrecision) + .setFieldsScale(fieldsScale); + } + + /** {@inheritDoc} */ + @Override public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { + if (!F.isEmpty(dfltFieldValues)) + dfltFieldValuesBytes = U.marshal(marsh, dfltFieldValues); + } + + /** {@inheritDoc} */ + @Override public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { + if (!F.isEmpty(dfltFieldValuesBytes)) + dfltFieldValues = U.unmarshal(marsh, dfltFieldValuesBytes, clsLdr); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryInlineSizesDataBagItem.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryInlineSizesDataBagItem.java new file mode 100644 index 0000000000000..f7e03ddf39032 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryInlineSizesDataBagItem.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.schema.message; + +import java.util.Map; +import org.apache.ignite.internal.Order; +import org.apache.ignite.plugin.extensions.communication.Message; + +/** */ +public class QueryInlineSizesDataBagItem implements Message { + /** */ + @Order(0) + Map sizes; + + /** */ + public QueryInlineSizesDataBagItem() {} + + /** @param sizes Inline sizes. */ + public QueryInlineSizesDataBagItem(Map sizes) { + this.sizes = sizes; + } + + /** @return Inline sizes. */ + public Map sizes() { + return sizes; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryProposalsDataBagItem.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryProposalsDataBagItem.java new file mode 100644 index 0000000000000..65082c4ba41b4 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryProposalsDataBagItem.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.schema.message; + +import java.util.LinkedHashMap; +import java.util.UUID; +import org.apache.ignite.internal.Order; +import org.apache.ignite.plugin.extensions.communication.Message; + +/** Wrapper for active schema change propose discovery messages. */ +public class QueryProposalsDataBagItem implements Message { + /** Active proposals. */ + @Order(0) + LinkedHashMap activeProposals; + + /** */ + public QueryProposalsDataBagItem() { + // No-op. + } + + /** @param activeProposals Active proposals. */ + public QueryProposalsDataBagItem(LinkedHashMap activeProposals) { + this.activeProposals = activeProposals; + } + + /** @return Active proposals. */ + public LinkedHashMap activeProposals() { + return activeProposals; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java index 1b832abab0fe3..a7914327d60fc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.query.schema.message; -import java.io.Serializable; import org.apache.ignite.internal.Order; import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage; import org.apache.ignite.internal.processors.query.schema.SchemaOperationException; @@ -30,10 +29,7 @@ /** * Abstract discovery message for schema operations. */ -public abstract class SchemaAbstractDiscoveryMessage extends DiscoveryCustomMessage implements Serializable { - /** */ - private static final long serialVersionUID = 0L; - +public abstract class SchemaAbstractDiscoveryMessage extends DiscoveryCustomMessage { /** Operation. */ @GridToStringInclude @Order(0) @@ -41,11 +37,11 @@ public abstract class SchemaAbstractDiscoveryMessage extends DiscoveryCustomMess /** Error message. */ @Order(1) - transient String errMsg; + String errMsg; /** Error code. */ @Order(2) - transient int errCode; + int errCode; /** Error. */ SchemaOperationException err; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaFinishDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaFinishDiscoveryMessage.java index 9ff555b729a49..fc95da0c2a115 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaFinishDiscoveryMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaFinishDiscoveryMessage.java @@ -27,9 +27,6 @@ * Schema change finish discovery message. */ public class SchemaFinishDiscoveryMessage extends SchemaAbstractDiscoveryMessage { - /** */ - private static final long serialVersionUID = 0L; - /** No-op flag. */ @Order(0) boolean nop; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java index 1f761c1e81ed2..bef0b3b2e94d8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java @@ -28,9 +28,6 @@ * Schema change propose discovery message. */ public class SchemaProposeDiscoveryMessage extends SchemaAbstractDiscoveryMessage { - /** */ - private static final long serialVersionUID = 0L; - /** Cache deployment ID. */ @Order(0) IgniteUuid depId; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAbstractOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAbstractOperation.java index 5264fbe2c6a2a..c3a83e31888f3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAbstractOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAbstractOperation.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.query.schema.operation; -import java.io.Serializable; import java.util.UUID; import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.typedef.internal.S; @@ -26,10 +25,7 @@ /** * Abstract operation on schema. */ -public abstract class SchemaAbstractOperation implements Serializable, Message { - /** */ - private static final long serialVersionUID = 0L; - +public abstract class SchemaAbstractOperation implements Message { /** Operation ID. */ @Order(0) UUID opId; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAddQueryEntityOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAddQueryEntityOperation.java index ebb23aff57ea9..3d700460bb7b1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAddQueryEntityOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAddQueryEntityOperation.java @@ -19,27 +19,22 @@ import java.util.Collection; import java.util.UUID; -import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.QueryEntity; -import org.apache.ignite.internal.MarshallableMessage; import org.apache.ignite.internal.Order; -import org.apache.ignite.internal.util.typedef.internal.U; -import org.apache.ignite.marshaller.Marshaller; - -/** - * Enabling indexing on cache operation. - */ -public class SchemaAddQueryEntityOperation extends SchemaAbstractOperation implements MarshallableMessage { - /** */ - private static final long serialVersionUID = 0L; +import org.apache.ignite.internal.processors.query.QueryEntityEx; +import org.apache.ignite.internal.processors.query.schema.message.QueryEntityExMessage; +import org.apache.ignite.internal.processors.query.schema.message.QueryEntityMessage; +import org.apache.ignite.internal.util.typedef.F; + +/** Operation, which enables indexing on cache operation. */ +public class SchemaAddQueryEntityOperation extends SchemaAbstractOperation { + /** Query entities messages. */ + @Order(0) + Collection entitiesMsgs; - /** */ + /** Original query entities. We keep them to avoid unneccessary conversions from messages. */ private Collection entities; - /** Serialized form of query entities. */ - @Order(0) - transient byte[] qryEntitiesBytes; - /** */ @Order(1) int qryParallelism; @@ -71,42 +66,34 @@ public SchemaAddQueryEntityOperation( this.entities = entities; this.qryParallelism = qryParallelism; this.sqlEscape = sqlEscape; + + entitiesMsgs = F.viewReadOnly(entities, this::makeEntityMessage); } - /** - * @return Collection of query entities. - */ + /** @return Collection of query entities. */ public Collection entities() { + if (entities == null) + entities = F.transform(entitiesMsgs, QueryEntityMessage::toEntity); + return entities; } - /** - * @return Query parallelism. - */ + /** @return Query parallelism. */ public int queryParallelism() { return qryParallelism; } - /** - * @return Sql escape flag. - */ + /** @return Sql escape flag. */ public boolean isSqlEscape() { return sqlEscape; } - /** {@inheritDoc} */ - @Override public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { - if (entities != null) - qryEntitiesBytes = U.marshal(marsh, entities); - } - - /** {@inheritDoc} */ - @Override public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { - if (qryEntitiesBytes != null) { - entities = U.unmarshal(marsh, qryEntitiesBytes, clsLdr); - - qryEntitiesBytes = null; - } + /** + * @param qryEntity Query entity. + * @return The appropriate query entity message. + */ + private QueryEntityMessage makeEntityMessage(QueryEntity qryEntity) { + return qryEntity instanceof QueryEntityEx ? new QueryEntityExMessage((QueryEntityEx)qryEntity) + : new QueryEntityMessage(qryEntity); } - } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAlterTableAddColumnOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAlterTableAddColumnOperation.java index 11d77d31c5b1d..481e8f26fdd4b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAlterTableAddColumnOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAlterTableAddColumnOperation.java @@ -27,9 +27,6 @@ * Schema index drop operation. */ public class SchemaAlterTableAddColumnOperation extends SchemaAbstractOperation { - /** */ - private static final long serialVersionUID = 0L; - /** Target table name. */ @Order(0) String tblName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAlterTableDropColumnOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAlterTableDropColumnOperation.java index cf48709e921ad..1aca33c57178d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAlterTableDropColumnOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAlterTableDropColumnOperation.java @@ -26,9 +26,6 @@ * Schema alter table drop column operation. */ public class SchemaAlterTableDropColumnOperation extends SchemaAbstractOperation { - /** */ - private static final long serialVersionUID = 0L; - /** Target table name. */ @Order(0) String tblName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexCreateOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexCreateOperation.java index 056ccaae028ea..7dcde0c297e9c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexCreateOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexCreateOperation.java @@ -29,9 +29,6 @@ * Schema index create operation. */ public class SchemaIndexCreateOperation extends SchemaIndexAbstractOperation { - /** */ - private static final long serialVersionUID = 0L; - /** Table name. */ @Order(0) String tblName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexDropOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexDropOperation.java index 6962fbb0ee5b2..4d0db89a638d4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexDropOperation.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexDropOperation.java @@ -25,9 +25,6 @@ * Schema index drop operation. */ public class SchemaIndexDropOperation extends SchemaIndexAbstractOperation { - /** */ - private static final long serialVersionUID = 0L; - /** Index name. */ @Order(0) String idxName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java index a7e0cc58d9d27..e417ede2f6e99 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java @@ -1017,6 +1017,10 @@ private void startHttpProtocol() throws IgniteCheckedException { log.debug("Failed to initialize HTTP REST protocol (consider adding ignite-rest-http " + "module to classpath)."); } + catch (LinkageError e) { + U.warn(log, "Failed to initialize HTTP REST protocol (consider adding ignite-rest-http " + + "module and its dependencies to classpath).", e); + } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { throw new IgniteCheckedException("Failed to initialize HTTP REST protocol.", e); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java index 669aa52dda523..8a50386849e33 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java @@ -751,8 +751,10 @@ private IgniteInternalFuture executeCommand( destId == null || destId.equals(ctx.localNodeId()) || replicatedCacheAvailable(cacheName); if (locExec) { - IgniteInternalCache prj = localCache(cacheName) - .setSkipStore(cacheFlags.contains(SKIP_STORE)); + IgniteInternalCache prj = localCache(cacheName); + + if (cacheFlags.contains(SKIP_STORE)) + prj = prj.withSkipStore(); if (cacheFlags.contains(KEEP_BINARIES)) prj = prj.keepBinary(); @@ -919,8 +921,10 @@ private FlaggedCacheOperationCallable(String cacheName, /** {@inheritDoc} */ @Override public GridRestResponse call() throws Exception { - IgniteInternalCache prj = cache(g, cacheName) - .setSkipStore(cacheFlags.contains(SKIP_STORE)); + IgniteInternalCache prj = cache(g, cacheName); + + if (cacheFlags.contains(SKIP_STORE)) + prj = prj.withSkipStore(); if (cacheFlags.contains(KEEP_BINARIES)) prj = prj.keepBinary(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestProtocol.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestProtocol.java index a1aaa0910dd55..d88253978062b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestProtocol.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestProtocol.java @@ -36,6 +36,7 @@ import org.apache.ignite.internal.client.marshaller.jdk.GridClientJdkMarshaller; import org.apache.ignite.internal.client.marshaller.optimized.GridClientOptimizedMarshaller; import org.apache.ignite.internal.client.marshaller.optimized.GridClientZipOptimizedMarshaller; +import org.apache.ignite.internal.processors.metric.MetricRegistryImpl; import org.apache.ignite.internal.processors.rest.GridRestProtocolHandler; import org.apache.ignite.internal.processors.rest.client.message.GridClientMessage; import org.apache.ignite.internal.processors.rest.protocols.GridRestProtocolAdapter; @@ -208,13 +209,15 @@ private boolean startTcpServer(InetAddress hostAddr, int port, GridNioServerList GridNioFilter[] filters; + MetricRegistryImpl mreg = ctx.metric().registry(REST_CONNECTOR_METRIC_REGISTRY_NAME); + if (sslCtx != null) { - GridNioSslFilter sslFilter = new GridNioSslFilter( + GridNioSslFilter sslFilter = U.sslFilter( sslCtx, cfg.isDirectBuffer(), ByteOrder.nativeOrder(), log, - ctx.metric().registry(REST_CONNECTOR_METRIC_REGISTRY_NAME)); + mreg); sslFilter.directMode(false); @@ -232,7 +235,7 @@ private boolean startTcpServer(InetAddress hostAddr, int port, GridNioServerList else filters = new GridNioFilter[] { codec }; - srv = GridNioServer.builder() + GridNioServer.Builder builder = GridNioServer.builder() .address(hostAddr) .port(port) .listener(lsnr) @@ -247,9 +250,11 @@ private boolean startTcpServer(InetAddress hostAddr, int port, GridNioServerList .socketReceiveBufferSize(cfg.getReceiveBufferSize()) .sendQueueLimit(cfg.getSendQueueLimit()) .filters(filters) - .directMode(false) - .metricRegistry(ctx.metric().registry(REST_CONNECTOR_METRIC_REGISTRY_NAME)) - .build(); + .directMode(false); + + srv = U.setNioServerMetrics(builder, mreg).build(); + + U.registerNioServerMetrics(srv, filters, mreg); srv.idleTimeout(cfg.getIdleTimeout()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractProcess.java new file mode 100644 index 0000000000000..40fdee7fa9326 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractProcess.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade; + +import java.util.UUID; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.future.GridFutureAdapter; +import org.jetbrains.annotations.Nullable; + +/** */ +abstract class AbstractProcess { + /** */ + @Nullable private UUID locInitOpId; + + /** */ + @Nullable private GridFutureAdapter locInitOpFut; + + /** */ + protected abstract UUID startInternal(); + + /** */ + protected synchronized IgniteInternalFuture start() { + if (locInitOpFut != null) + return locInitOpFut; + + locInitOpId = startInternal(); + locInitOpFut = new GridFutureAdapter<>(); + + return locInitOpFut; + } + + /** */ + protected synchronized void finishProcess(UUID reqId, @Nullable Throwable err) { + if (!reqId.equals(locInitOpId)) + return; + + locInitOpFut.onDone(err); + + locInitOpId = null; + locInitOpFut = null; + } + + /** */ + protected synchronized void abort(String reason) { + locInitOpId = null; + + if (locInitOpFut != null) { + locInitOpFut.onDone(new IgniteException("Operation was aborted [reason=" + reason + ']')); + + locInitOpFut = null; + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/IgniteComponentUpgradeState.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/IgniteComponentUpgradeState.java new file mode 100644 index 0000000000000..a80e908ebf4d6 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/IgniteComponentUpgradeState.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade; + +import org.apache.ignite.lang.IgniteProductVersion; +import org.jetbrains.annotations.Nullable; + +import static org.apache.ignite.internal.IgniteVersionUtils.semanticVersion; + +/** */ +class IgniteComponentUpgradeState { + /** */ + @Nullable final IgniteProductVersion srcVer; + + /** */ + @Nullable final IgniteProductVersion targetVer; + + /** Whether all cluster nodes hold the same Ignite component version. */ + final boolean isClusterVerHomogenous; + + /** */ + IgniteComponentUpgradeState( + @Nullable IgniteProductVersion srcVer, + @Nullable IgniteProductVersion targetVer, + boolean isClusterVerHomogenous + ) { + this.srcVer = srcVer; + this.targetVer = targetVer; + this.isClusterVerHomogenous = isClusterVerHomogenous; + } + + /** */ + boolean isCompatible(IgniteProductVersion joiningNodeCmpVer) { + if (isClusterVerHomogenous) + return srcVer == null || srcVer.compareTo(joiningNodeCmpVer) <= 0; + + return joiningNodeCmpVer.equals(srcVer) || joiningNodeCmpVer.equals(targetVer); + } + + /** {@inheritDoc} */ + @Override public String toString() { + StringBuilder sb = new StringBuilder(); + + if (isClusterVerHomogenous) + if (srcVer == null) + sb.append("[any]"); + else + sb.append("[").append(semanticVersion(srcVer)).append(" or greater]"); + else { + sb.append("["); + + if (srcVer != null) + sb.append(srcVer); + + if (targetVer != null) { + if (srcVer != null) + sb.append(", "); + + sb.append(targetVer); + } + + sb.append("]"); + } + + sb.append("]"); + + return sb.toString(); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeClusterData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeClusterData.java new file mode 100644 index 0000000000000..f28dc98558aad --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeClusterData.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade; + +import java.util.Collection; +import java.util.UUID; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteComponentFeatureSet; +import org.apache.ignite.plugin.extensions.communication.Message; + +/** */ +public class RollingUpgradeClusterData implements Message { + /** */ + @Order(0) + boolean isVersionUpgradeEnabled; + + /** */ + @Order(1) + UUID curFinalizeProcId; + + /** */ + @Order(2) + Collection activeFeatures; + + /** */ + public RollingUpgradeClusterData() { + // No-op. + } + + /** */ + public RollingUpgradeClusterData( + boolean isVersionUpgradeEnabled, + UUID curFinalizeProcId, + Collection activeFeatures + ) { + this.isVersionUpgradeEnabled = isVersionUpgradeEnabled; + this.curFinalizeProcId = curFinalizeProcId; + this.activeFeatures = activeFeatures; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeProcessor.java index f9ddc8cc871a4..ab2f9cda1d991 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeProcessor.java @@ -17,79 +17,188 @@ package org.apache.ignite.internal.processors.rollingupgrade; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.UUID; -import java.util.concurrent.CountDownLatch; +import java.util.stream.Collectors; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.events.DiscoveryEvent; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.IgniteVersionUtils; import org.apache.ignite.internal.processors.GridProcessorAdapter; -import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorage; -import org.apache.ignite.internal.processors.metastorage.DistributedMetastorageLifecycleListener; -import org.apache.ignite.internal.processors.metastorage.ReadableDistributedMetaStorage; import org.apache.ignite.internal.processors.nodevalidation.DiscoveryNodeValidationProcessor; -import org.apache.ignite.internal.util.lang.IgnitePair; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteComponentFeatureSet; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteCoreFeature; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeature; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeatureManager; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeatureSet; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteNodeFeatureSet; +import org.apache.ignite.internal.processors.rollingupgrade.feature.SupportedFeatureRegistry; +import org.apache.ignite.internal.util.distributed.DistributedProcess; +import org.apache.ignite.internal.util.distributed.InitMessage; +import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.LT; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteFuture; import org.apache.ignite.lang.IgniteProductVersion; -import org.apache.ignite.plugin.security.SecurityPermission; +import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.spi.IgniteNodeValidationResult; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.DiscoveryDataBag; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; import static org.apache.ignite.events.EventType.EVT_NODE_JOINED; import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.events.EventType.EVT_NODE_VALIDATION_FAILED; -import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_BUILD_VER; -import static org.apache.ignite.internal.processors.metastorage.DistributedMetaStorage.IGNITE_INTERNAL_KEY_PREFIX; - -/** Rolling upgrade processor. Manages current and target versions of cluster. */ +import static org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.ROLLING_UPGRADE_PROC; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IGNITE_FEATURES; +import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.RU_ABORT_VERSION_FINALIZATION; +import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.RU_COMPLETE_VERSION_FINALIZATION; +import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.RU_ENABLE; +import static org.apache.ignite.internal.util.distributed.DistributedProcess.DistributedProcessType.RU_PREPARE_VERSION_FINALIZATION; +import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_ROLLING_UPGRADE; + +/** */ public class RollingUpgradeProcessor extends GridProcessorAdapter implements DiscoveryNodeValidationProcessor { - /** Key for the distributed property that holds current and target versions. */ - private static final String ROLLING_UPGRADE_VERSIONS_KEY = IGNITE_INTERNAL_KEY_PREFIX + "rolling.upgrade.versions"; + /** */ + private final IgniteFeatureManager featureMgr; - /** Metastorage with the write access. */ - @Nullable private volatile DistributedMetaStorage metastorage; + /** */ + private final ClusterVersionUpgradeEnableProcess enableProc; - /** Last joining node. */ - private ClusterNode lastJoiningNode; + /** */ + private final ClusterVersionFinalizationProcess finalizeProc; - /** Lock for synchronization between tcp-disco-msg-worker thread and management operations. */ - private final Object lock = new Object(); + /** */ + private final ClusterVersionFinalizationAbortProcess finalizeAbortProc; /** */ - private final CountDownLatch startLatch = new CountDownLatch(1); + private final Object topGuard = new Object(); - /** Pair with current and target versions. {@code null} when rolling upgrade is disabled. */ - @Nullable private volatile IgnitePair rollUpVers; + /** */ + private final Set joiningNodes = new HashSet<>(); + + /** */ + private volatile boolean isVerUpgradeEnabled; /** - * @param ctx Context. + * We rely on the guarantee that this varable is only accessed from the Discovery thread. + * Therefore, synchronization is not required. */ + @Nullable private volatile UUID curFinalizeProcId; + + /** */ public RollingUpgradeProcessor(GridKernalContext ctx) { + this(ctx, new IgniteComponentFeatureSet( + IgniteCoreFeature.COMPONENT_NAME, + IgniteVersionUtils.VER, + IgniteFeatureSet.buildFrom(SupportedFeatureRegistry.class)) + ); + } + + /** */ + protected RollingUpgradeProcessor(GridKernalContext ctx, IgniteComponentFeatureSet coreFeatures) { super(ctx); + + enableProc = new ClusterVersionUpgradeEnableProcess(); + finalizeProc = new ClusterVersionFinalizationProcess(); + finalizeAbortProc = new ClusterVersionFinalizationAbortProcess(); + featureMgr = new IgniteFeatureManager(ctx, coreFeatures); } - /** {@inheritDoc} */ - @Override public void onKernalStart(boolean active) throws IgniteCheckedException { - startLatch.countDown(); + /** @return Whether nodes running a higher Ignite version are allowed to join the cluster. */ + public boolean isVersionUpgradeEnabled() { + return isVerUpgradeEnabled; + } + + /** + * Allows nodes running a higher Ignite version to join the cluster. + * Until the cluster version is finalized, nodes running a higher version operate in + * a compatibility mode that emulates the behavior of the current cluster version. + */ + public void enableVersionUpgrade() throws IgniteCheckedException { + ctx.security().authorize(ADMIN_ROLLING_UPGRADE); + + if (isVerUpgradeEnabled) + return; + + enableProc.start().get(); + + if (log.isInfoEnabled()) + log.info("Cluster version Rolling Upgrade was successfully enabled"); + } + + /** + * Tries to finalize the cluster version. + * + *

      If all cluster nodes are running the same Ignite version, this method:

      + *
        + *
      1. Prevents nodes running a higher Ignite version from joining the cluster.
      2. + *
      3. Activates all {@link IgniteFeature}s supported by the finalized cluster version.
      4. + *
      + * + *

      If the cluster contains nodes running different Ignite versions, the operation fails.

      + */ + public void finalizeClusterVersion() throws IgniteCheckedException { + ctx.security().authorize(ADMIN_ROLLING_UPGRADE); + + if (!isVerUpgradeEnabled) + return; + + finalizeProc.start().get(); + + if (log.isInfoEnabled()) + log.info("Cluster version was successfully finalized [componentVersions=" + featureMgr.activeFeatures() + ']'); + } + + /** */ + public void abortClusterVersionFinalization() throws IgniteCheckedException { + ctx.security().authorize(ADMIN_ROLLING_UPGRADE); + + if (!isVerUpgradeEnabled) + return; + + finalizeAbortProc.start().get(); + + if (log.isInfoEnabled()) + log.info("Cluster version finalization has been aborted"); + } + + /** */ + public IgniteFeatureManager features() { + return featureMgr; + } + + /** */ + IgniteComponentUpgradeState state(String cmpName) { + synchronized (topGuard) { + return detectComponentUpgradeState(clusterFeatures(), cmpName); + } } /** {@inheritDoc} */ @Override public void start() throws IgniteCheckedException { + ctx.addNodeAttribute( + ATTR_IGNITE_FEATURES, + U.marshal( + ctx.marshallerContext().jdkMarshaller(), + featureMgr.localVersionFeatures().values().toArray(new IgniteComponentFeatureSet[0])) + ); + ctx.event().addLocalEventListener( evt -> { - UUID nodeId = ((DiscoveryEvent)evt).eventNode().id(); - - synchronized (lock) { - if (lastJoiningNode != null && lastJoiningNode.id().equals(nodeId)) - lastJoiningNode = null; + synchronized (topGuard) { + joiningNodes.remove(((DiscoveryEvent)evt).eventNode()); } }, EVT_NODE_JOINED, @@ -97,251 +206,453 @@ public RollingUpgradeProcessor(GridKernalContext ctx) { EVT_NODE_LEFT, EVT_NODE_VALIDATION_FAILED ); + } + + /** {@inheritDoc} */ + @Override public DiscoveryDataExchangeType discoveryDataType() { + return ROLLING_UPGRADE_PROC; + } + + /** {@inheritDoc} */ + @Override public void collectGridNodeData(DiscoveryDataBag dataBag) { + if (ctx.clientNode()) + return; + + int cmpId = discoveryDataType().ordinal(); + + if (!dataBag.commonDataCollectedFor(cmpId)) + dataBag.addGridCommonData(cmpId, collectRollingUpgradeClusterData()); + } + + /** {@inheritDoc} */ + @Override public void onGridDataReceived(DiscoveryDataBag.GridDiscoveryData data) { + RollingUpgradeClusterData gridData = data.commonData(); - ctx.internalSubscriptionProcessor().registerDistributedMetastorageListener(new DistributedMetastorageLifecycleListener() { - @Override public void onReadyForWrite(DistributedMetaStorage metastorage) { - RollingUpgradeProcessor.this.metastorage = metastorage; + isVerUpgradeEnabled = gridData.isVersionUpgradeEnabled; + curFinalizeProcId = gridData.curFinalizeProcId; + + featureMgr.onGridDataReceived(new IgniteNodeFeatureSet(gridData.activeFeatures)); + } + + /** {@inheritDoc} */ + @Override public @Nullable IgniteNodeValidationResult validateNode(ClusterNode joiningNode) { + synchronized (topGuard) { + if (curFinalizeProcId != null) { + return new IgniteNodeValidationResult( + joiningNode.id(), + "Node joins are not allowed during cluster version finalization. Retry the node join procedure after" + + " cluster version finalization process is complete [joiningNode=" + joiningNode + ']'); } - @Override public void onReadyForRead(ReadableDistributedMetaStorage metastorage) { - try { - rollUpVers = metastorage.read(ROLLING_UPGRADE_VERSIONS_KEY); - } - catch (IgniteCheckedException e) { - throw new IgniteException(e); + IgniteNodeFeatureSet joiningNodeFeatures; + + try { + joiningNodeFeatures = extractNodeFeatures(joiningNode); + } + catch (IgniteCheckedException e) { + return new IgniteNodeValidationResult( + joiningNode.id(), + "Failed to resolve joining node features [joiningNode=" + joiningNode + ", errMsg=" + e.getMessage() + ']'); + } + + if (isVerUpgradeEnabled) { + if (!joiningNode.isClient() && !joiningNodeFeatures.components().containsAll(featureMgr.activeFeatures().components())) { + return new IgniteNodeValidationResult( + joiningNode.id(), + "Some components active in the cluster are not configured on the joining server node" + + " [clusterComponents=" + featureMgr.activeFeatures().components() + + ", joiningNodeComponents=" + joiningNodeFeatures.components() + + ", joiningNode=" + joiningNode + ']' + ); } - // Keep the current and target version pair in sync with metastorage updates, e.g., to handle coordinator changes. - metastorage.listen(ROLLING_UPGRADE_VERSIONS_KEY::equals, (key, oldVal, newVal) -> { - rollUpVers = (IgnitePair)newVal; - }); + Map clusterFeatures = clusterFeatures(); + + for (IgniteComponentFeatureSet rmtCmpFeatures : joiningNodeFeatures.values()) { + IgniteComponentUpgradeState state = detectComponentUpgradeState(clusterFeatures, rmtCmpFeatures.componentName()); + + if (!state.isCompatible(rmtCmpFeatures.version())) { + return new IgniteNodeValidationResult( + joiningNode.id(), + "Joining node is not allowed to join the cluster because it is running a component with an" + + " incompatible version. The Rolling Upgrade process supports at most two different versions " + + " of each component in the cluster. Upgrade the joining node component versions and retry" + + " the node join procedure" + + " [componentName=" + rmtCmpFeatures.componentName() + + ", allowedComponentVersions=" + state + + ", joiningNodeComponentVersion=" + rmtCmpFeatures.version() + + ", joiningNode=" + joiningNode + ']'); + } + + IgniteComponentFeatureSet locCmpFeatures = featureMgr.activeComponentFeatures(rmtCmpFeatures.componentName()); + + if (locCmpFeatures != null && !locCmpFeatures.isUpgradableTo(rmtCmpFeatures)) { + return new IgniteNodeValidationResult( + joiningNode.id(), + "Ignite component Rolling Upgrade is not supported between the component version active in the cluster " + + "and the version running on the joining node. Refer to the documentation for supported Rolling Upgrade " + + "version combinations, and then retry the node join operation" + + " [componentName=" + locCmpFeatures.componentName() + + ", clusterComponentVer=" + locCmpFeatures.version() + + ", joiningNodeComponentVer=" + rmtCmpFeatures.version() + + ", joiningNode=" + joiningNode + ']'); + } + } + } + else if (!joiningNodeComponentVersionsMatchCluster(joiningNode, joiningNodeFeatures)) { + return new IgniteNodeValidationResult( + joiningNode.id(), + "One or more component versions on the joining node differ from the corresponding versions active in the cluster" + + " [clusterComponentVers=" + featureMgr.activeFeatures() + + ", joiningNodeComponentVers=" + joiningNodeFeatures + + ", joiningNode=" + joiningNode + ']'); } - }); - } - /** {@inheritDoc} The joining node is stored to verify later whether it successfully connected to the ring or failed to join. */ - @Override public @Nullable IgniteNodeValidationResult validateNode(ClusterNode node) { - synchronized (lock) { - lastJoiningNode = node; - } + joiningNodes.add(joiningNode); - ClusterNode locNode = ctx.discovery().localNode(); + return null; + } + } - String locBuildVer = locNode.attribute(ATTR_BUILD_VER); - String rmtBuildVer = node.attribute(ATTR_BUILD_VER); + /** {@inheritDoc} */ + @Override public void onDisconnected(IgniteFuture reconnectFut) { + String errMsg = "Client node has disconnected"; - IgniteProductVersion rmtVer = IgniteProductVersion.fromString(rmtBuildVer); + enableProc.abort(errMsg); + finalizeProc.abort(errMsg); + finalizeAbortProc.abort(errMsg); + } - IgnitePair pair = rollUpVers; + /** */ + private IgniteComponentUpgradeState detectComponentUpgradeState( + Map clusterFeatures, + String cmpName + ) { + SortedSet clusterCmpVersions = distinctClusterComponentVersions(clusterFeatures, cmpName); - IgniteProductVersion curVer = pair == null ? IgniteProductVersion.fromString(locBuildVer) : pair.get1(); - IgniteProductVersion targetVer = pair == null ? null : pair.get2(); + assert !clusterCmpVersions.isEmpty() && clusterCmpVersions.size() <= 2 : "Cluster nodes must run no more than" + + " two versions of the component [cmpName=" + cmpName + ", clusterCmpVersions=" + clusterCmpVersions.size() + "]"; - if (Objects.equals(rmtVer, curVer) || Objects.equals(rmtVer, targetVer)) - return null; + IgniteProductVersion minCmpVer = clusterCmpVersions.first(); + IgniteProductVersion maxCmpVer = clusterCmpVersions.last(); - String errMsg = "Remote node rejected due to incompatible version for cluster join.\n" - + "Remote node info:\n" - + " - Version : " + rmtBuildVer + "\n" - + " - Addresses : " + U.addressesAsString(node) + "\n" - + " - Node ID : " + node.id() + "\n" - + "Local node info:\n" - + " - Version : " + locBuildVer + "\n" - + " - Addresses : " + U.addressesAsString(locNode) + "\n" - + " - Node ID : " + locNode.id() + "\n" - + "Allowed versions for joining: " + curVer + (targetVer == null ? "" : ", " + targetVer); + if (!Objects.equals(minCmpVer, maxCmpVer)) + return new IgniteComponentUpgradeState(minCmpVer, maxCmpVer, false); - LT.warn(log, errMsg); + IgniteComponentFeatureSet activeCompFeatures = featureMgr.activeComponentFeatures(cmpName); - if (log.isDebugEnabled()) - log.debug(errMsg); + IgniteProductVersion logicalCmpVer = activeCompFeatures == null ? null : activeCompFeatures.version(); - return new IgniteNodeValidationResult(node.id(), errMsg); + return new IgniteComponentUpgradeState( + logicalCmpVer, + Objects.equals(logicalCmpVer, maxCmpVer) ? null : maxCmpVer, + true); } - /** - * Enables rolling upgrade with specified target version. - * This method can only be called on coordinator node with {@link TcpDiscoverySpi}. - * - * @param target Target version. - * @param force If {@code true}, skips target version compatibility checks and forcibly enables rolling upgrade. - * This flag does not override an already active upgrade configuration. - * @throws IgniteCheckedException If: - *
        - *
      • The current and target versions are incompatible;
      • - *
      • The local node is not a coordinator;
      • - *
      • The discovery SPI is not {@link TcpDiscoverySpi};
      • - *
      • The distributed metastorage is not ready;
      • - *
      - */ - public void enable(IgniteProductVersion target, boolean force) throws IgniteCheckedException { - ctx.security().authorize(SecurityPermission.ADMIN_ROLLING_UPGRADE); - - if (startLatch.getCount() > 0) - throw new IgniteCheckedException("Cannot enable rolling upgrade: processor has not been started yet"); + /** */ + private SortedSet distinctClusterComponentVersions( + Map clusterFeatures, + String cmpName + ) { + SortedSet distinctCmpVersions = new TreeSet<>(Comparator.nullsFirst(Comparator.naturalOrder())); - if (!U.isLocalNodeCoordinator(ctx.discovery())) - throw new IgniteCheckedException("Rolling upgrade can be enabled only on coordinator node"); + clusterFeatures.forEach((node, nodeFeatures) -> { + IgniteComponentFeatureSet cmpFeatures = nodeFeatures.componentFeatures(cmpName); - if (metastorage == null) - throw new IgniteCheckedException("Metastorage is not ready yet. Try again later"); + if (node.isClient() && cmpFeatures == null) + return; // Components are optional on client nodes, even when they are configured on servers. - if (!(ctx.config().getDiscoverySpi() instanceof TcpDiscoverySpi)) - throw new IgniteCheckedException("Rolling upgrade is supported only with TCP discovery SPI"); + distinctCmpVersions.add(cmpFeatures == null ? null : cmpFeatures.version()); + }); - String curBuildVer = ctx.discovery().localNode().attribute(ATTR_BUILD_VER); - IgniteProductVersion curVer = IgniteProductVersion.fromString(curBuildVer); + return distinctCmpVersions; + } - if (!checkVersionsForEnabling(curVer, target, force)) - return; + /** */ + private boolean joiningNodeComponentVersionsMatchCluster(ClusterNode joiningNode, IgniteNodeFeatureSet joiningNodeFeatures) { + IgniteNodeFeatureSet locFeatures = featureMgr.localVersionFeatures(); - IgnitePair newPair = F.pair(curVer, target); + return joiningNode.isClient() + ? locFeatures.containsAll(joiningNodeFeatures) + : locFeatures.equals(joiningNodeFeatures); + } - if (!metastorage.compareAndSet(ROLLING_UPGRADE_VERSIONS_KEY, null, newPair)) { - IgnitePair oldVerPair = metastorage.read(ROLLING_UPGRADE_VERSIONS_KEY); + /** */ + private boolean isReadyForVersionFinalization() { + Map clusterFeatures = clusterFeatures(); - if (newPair.equals(oldVerPair)) - return; + Set distinctServerNodeFeatureSets = new HashSet<>(); + Set distinctClientNodeFeatureSets = new HashSet<>(); - if (oldVerPair == null) - throw new IgniteCheckedException("Could not enable rolling upgrade. Try again"); + clusterFeatures.forEach((node, features) -> { + if (!node.isClient()) + distinctServerNodeFeatureSets.add(features); + else + distinctClientNodeFeatureSets.add(features); + }); - throw new IgniteCheckedException("Rolling upgrade is already enabled with a different current and target version: " + - oldVerPair.get1() + " , " + oldVerPair.get2()); - } + if (distinctServerNodeFeatureSets.size() != 1) + return false; - rollUpVers = newPair; + IgniteNodeFeatureSet srvFeatures = F.first(distinctServerNodeFeatureSets); - if (log.isInfoEnabled()) - log.info("Rolling upgrade enabled [current=" + curVer + ", target=" + target + ']'); + return distinctClientNodeFeatureSets.stream().allMatch(srvFeatures::containsAll); } - /** - * Disables rolling upgrade. - * This method can only be called on coordinator node. - * - *

      May be blocked while a node with a different version is still joining or during metastorage operations.

      - * - * @throws IgniteCheckedException If cluster has two or more nodes with different versions or if node is not coordinator - * or metastorage is not ready. - */ - public void disable() throws IgniteCheckedException { - ctx.security().authorize(SecurityPermission.ADMIN_ROLLING_UPGRADE); + /** */ + private RollingUpgradeClusterData collectRollingUpgradeClusterData() { + return new RollingUpgradeClusterData( + isVerUpgradeEnabled, + curFinalizeProcId, + featureMgr.activeFeatures().values() + ); + } - if (!U.isLocalNodeCoordinator(ctx.discovery())) - throw new IgniteCheckedException("Rolling upgrade can be disabled only on coordinator node"); + /** */ + private IgniteNodeFeatureSet extractNodeFeatures(ClusterNode node) throws IgniteCheckedException { + byte[] attrVal = node.attribute(ATTR_IGNITE_FEATURES); - if (metastorage == null) - throw new IgniteCheckedException("Meta storage is not ready. Try again"); + IgniteComponentFeatureSet[] nodeFeatures = U.unmarshal( + ctx.marshallerContext().jdkMarshaller(), + attrVal, + U.resolveClassLoader(ctx.config())); - if (rollUpVers == null) - return; + return new IgniteNodeFeatureSet(List.of(nodeFeatures)); + } - IgnitePair minMaxVerPair; + /** */ + private static Throwable firstError(Map errors) { + return F.isEmpty(errors) ? null : F.firstValue(errors); + } - synchronized (lock) { - minMaxVerPair = resolveMinMaxNodeVersions(); + /** */ + private Map clusterFeatures() { + assert Thread.holdsLock(topGuard); - if (!minMaxVerPair.get1().equals(minMaxVerPair.get2())) - throw new IgniteCheckedException("Can't disable rolling upgrade with different versions in cluster: " - + minMaxVerPair.get1() + ", " + minMaxVerPair.get2()); + try { + Map res = new HashMap<>(); - if (lastJoiningNode != null) { - IgniteProductVersion lastJoiningNodeVer = IgniteProductVersion.fromString(lastJoiningNode.attribute(ATTR_BUILD_VER)); + for (ClusterNode node : clusterNodes()) + res.put(node, extractNodeFeatures(node)); - if (!minMaxVerPair.get1().equals(lastJoiningNodeVer)) - throw new IgniteCheckedException("Can't disable rolling upgrade with different versions in cluster: " - + minMaxVerPair.get1() + ", " + lastJoiningNodeVer); - } + return res; + } + catch (IgniteCheckedException e) { + U.error(log, "Failed to resolve cluster features", e); - rollUpVers = null; + throw new IgniteException("Failed to resolve cluster features", e); } + } - metastorage.remove(ROLLING_UPGRADE_VERSIONS_KEY); + /** */ + private Set clusterNodes() { + assert Thread.holdsLock(topGuard); - if (log.isInfoEnabled()) - log.info("Rolling upgrade disabled. Current version of nodes in cluster: " + minMaxVerPair.get1()); + Set clusterNodes = new HashSet<>(ctx.discovery().discoverySpiRemoteNodes()); + + clusterNodes.add(ctx.discovery().localNode()); + clusterNodes.addAll(joiningNodes); + + return clusterNodes; } /** */ - private IgnitePair resolveMinMaxNodeVersions() { - assert Thread.holdsLock(lock); + private class ClusterVersionUpgradeEnableProcess extends AbstractProcess { + /** */ + private final DistributedProcess distributedProc; + + /** */ + public ClusterVersionUpgradeEnableProcess() { + distributedProc = new DistributedProcess<>( + ctx, + RU_ENABLE, + this::execute, + this::finish, + (reqId, req) -> new InitMessage<>(reqId, RU_ENABLE, req, true)); + } - SortedSet clusterNodes = new TreeSet<>(); + /** {@inheritDoc} */ + @Override protected UUID startInternal() { + UUID reqId = UUID.randomUUID(); - for (ClusterNode node : ctx.discovery().discoverySpiRemoteNodes()) - clusterNodes.add(node.version()); + distributedProc.start(reqId, null); - clusterNodes.add(ctx.discovery().localNode().version()); + if (log.isInfoEnabled()) + log.info("Cluster version upgrade enable process has been started [procId=" + reqId + "]"); - return new IgnitePair<>(clusterNodes.first(), clusterNodes.last()); - } + return reqId; + } - /** - * Returns a pair containing the current and target versions of the cluster. - *

      - * This method returns {@code null} if rolling upgrade has not been enabled yet - * or if version information has not been read from the distributed metastorage. - * - * @return A pair where: - *

        - *
      • First element — current version of the cluster.
      • - *
      • Second element — target version to which the cluster is being upgraded.
      • - *
      - * or {@code null} if rolling upgrade is not active. - */ - @Nullable public IgnitePair versions() { - return rollUpVers; - } + /** */ + private IgniteInternalFuture execute(UUID ignored, Message req) { + isVerUpgradeEnabled = true; + + return new GridFinishedFuture<>(); + } - /** Checks whether the cluster is in the rolling upgrade mode. */ - public boolean enabled() { - return versions() != null; + /** */ + private void finish(UUID reqId, Map responses, Map errors) { + finishProcess(reqId, firstError(errors)); + } } - /** - * Checks cur and target versions. - * - * @param cur Current cluster version. - * @param target Target cluster version. - * @param force Force flag to skip version checks. - * @throws IgniteCheckedException If versions are incorrect. - */ - private boolean checkVersionsForEnabling( - IgniteProductVersion cur, - IgniteProductVersion target, - boolean force - ) throws IgniteCheckedException { - IgnitePair oldVerPair = rollUpVers; - if (oldVerPair != null) { - if (oldVerPair.get1().equals(cur) && oldVerPair.get2().equals(target)) - return false; - - throw new IgniteCheckedException("Rolling upgrade is already enabled with a different current and target version: " + - oldVerPair.get1() + " , " + oldVerPair.get2()); + /** */ + private class ClusterVersionFinalizationProcess extends AbstractProcess { + /** */ + private final DistributedProcess preparePhase; + + /** */ + private final DistributedProcess completePhase; + + /** */ + public ClusterVersionFinalizationProcess() { + preparePhase = new DistributedProcess<>( + ctx, + RU_PREPARE_VERSION_FINALIZATION, + this::executePreparePhase, + this::finishPreparePhase, + (reqId, req) -> new InitMessage<>(reqId, RU_PREPARE_VERSION_FINALIZATION, req, true)); + + completePhase = new DistributedProcess<>( + ctx, + RU_COMPLETE_VERSION_FINALIZATION, + this::executeCompletePhase, + this::finishCompletePhase, + (reqId, req) -> new InitMessage<>(reqId, RU_COMPLETE_VERSION_FINALIZATION, req, true)); } - if (force) { + /** {@inheritDoc} */ + @Override protected UUID startInternal() { + UUID reqId = UUID.randomUUID(); + + preparePhase.start(reqId, null); + if (log.isInfoEnabled()) - log.info("Skipping version compatibility check for rolling upgrade due to force flag " - + "[currentVer=" + cur + ", targetVer=" + target + ']'); + log.info("Cluster version finalization process has been started [procId=" + reqId + ']'); + + return reqId; + } + + /** {@inheritDoc} */ + @Override protected void finishProcess(UUID reqId, @Nullable Throwable err) { + if (err != null) + U.error(log, "Cluster version finalization process failed [procId=" + reqId + ']', err); + + super.finishProcess(reqId, err); + } + + /** {@inheritDoc} */ + @Override protected void abort(String reason) { + U.warn(log, "Cluster version finalization process has been aborted [procId=" + curFinalizeProcId + ", reason=" + reason + ']'); + + curFinalizeProcId = null; - return true; + super.abort(reason); } - if (cur.major() != target.major()) - throw new IgniteCheckedException("Major versions are different"); + /** */ + boolean isInProgress() { + return isVerUpgradeEnabled && curFinalizeProcId != null; + } + + /** */ + private IgniteInternalFuture executePreparePhase(UUID reqId, Message req) { + synchronized (topGuard) { + if (curFinalizeProcId != null) { + U.error(log, "Failed to handle cluster version finalization request. Another process is " + + "already in progress [curProcId=" + reqId + ", activeProcId=" + curFinalizeProcId + ']'); - if (cur.minor() != target.minor()) { - if (target.minor() == cur.minor() + 1 && target.maintenance() == 0) - return true; + return new GridFinishedFuture<>(new IgniteException("Cluster version finalization process is already in progress")); + } - throw new IgniteCheckedException("Minor version can only be incremented by 1"); + curFinalizeProcId = reqId; + + if (!isReadyForVersionFinalization()) + return new GridFinishedFuture<>(new IgniteException( + "Cluster version finalization failed. The cluster contains nodes running" + + " different versions of one or more components. Retry the operation after upgrading" + + " all cluster node components to the same version" + + " [clusterFeatures=" + clusterFeatures().entrySet().stream().collect( + Collectors.toMap(e -> e.getKey().id(), Map.Entry::getValue)) + ']')); + + return new GridFinishedFuture<>(); + } } - if (cur.maintenance() + 1 != target.maintenance()) - throw new IgniteCheckedException("Patch version can only be incremented by 1"); + /** */ + private void finishPreparePhase(UUID reqId, Map responses, Map errors) { + if (!F.isEmpty(errors)) { + if (reqId.equals(curFinalizeProcId)) + curFinalizeProcId = null; - return true; + finishProcess(reqId, firstError(errors)); + } + else if (reqId.equals(curFinalizeProcId) && U.isLocalNodeCoordinator(ctx.discovery())) + completePhase.start(reqId, null); + } + + /** */ + private IgniteInternalFuture executeCompletePhase(UUID reqId, Message req) { + if (!reqId.equals(curFinalizeProcId)) { + // This condition is guaranteed to occur only when cluster version finalization is aborted + // after the prepare phase has completed successfully but before the completion phase begins. + // Aborting cluster version finalization is mutually exclusive with the finalization completion + // phase and is applied consistently across all cluster nodes. + return new GridFinishedFuture<>(new IgniteException( + "Failed to complete the cluster version finalization operation." + + " The operation may have been aborted by an administrator. Retry the operation if possible" + )); + } + + featureMgr.activateLocalVersionFeatures(); + + isVerUpgradeEnabled = false; + curFinalizeProcId = null; + + return new GridFinishedFuture<>(); + } + + /** */ + private void finishCompletePhase(UUID reqId, Map responses, Map errors) { + finishProcess(reqId, firstError(errors)); + } + } + + /** */ + private class ClusterVersionFinalizationAbortProcess extends AbstractProcess { + /** */ + private final DistributedProcess distributedProc; + + /** */ + public ClusterVersionFinalizationAbortProcess() { + distributedProc = new DistributedProcess<>( + ctx, + RU_ABORT_VERSION_FINALIZATION, + this::execute, + this::finish, + (reqId, req) -> new InitMessage<>(reqId, RU_ABORT_VERSION_FINALIZATION, req, true)); + } + + /** {@inheritDoc} */ + @Override protected UUID startInternal() { + UUID reqId = UUID.randomUUID(); + + distributedProc.start(reqId, null); + + return reqId; + } + + /** */ + private IgniteInternalFuture execute(UUID ignored, Message req) { + if (finalizeProc.isInProgress()) + finalizeProc.abort("Operation has been aborted by administrator"); + + return new GridFinishedFuture<>(); + } + + /** */ + private void finish(UUID reqId, Map responses, Map errors) { + finishProcess(reqId, firstError(errors)); + } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteComponentFeatureSet.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteComponentFeatureSet.java new file mode 100644 index 0000000000000..a689f0f52b929 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteComponentFeatureSet.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.util.Objects; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.util.typedef.internal.A; +import org.apache.ignite.lang.IgniteProductVersion; +import org.apache.ignite.plugin.extensions.communication.Message; + +/** Represents a set of {@link IgniteFeature}s available for the specific Ignite component version. */ +public class IgniteComponentFeatureSet implements Message, Externalizable { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + @Order(0) + String compName; + + /** */ + @Order(1) + IgniteProductVersion compVer; + + /** */ + @Order(2) + IgniteFeatureSet features; + + /** */ + public IgniteComponentFeatureSet() { + // No-op. + } + + /** */ + public IgniteComponentFeatureSet(String compName, IgniteProductVersion compVer, IgniteFeatureSet features) { + A.notNull(compName, "component name"); + A.notNull(compVer, "component version"); + A.notNull(features, "component features"); + + this.compName = compName; + this.compVer = compVer; + this.features = features; + } + + /** */ + public String componentName() { + return compName; + } + + /** */ + public IgniteProductVersion version() { + return compVer; + } + + /** */ + public boolean contains(int featureId) { + return features.contains(featureId); + } + + /** */ + public boolean isUpgradableTo(IgniteComponentFeatureSet target) { + return Objects.equals(compName, target.compName) && features.isUpgradableTo(target.features); + } + + /** {@inheritDoc} */ + @Override public void writeExternal(ObjectOutput out) throws IOException { + out.writeUTF(compName); + out.writeObject(compVer); + out.writeObject(features); + } + + /** {@inheritDoc} */ + @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + compName = in.readUTF(); + compVer = (IgniteProductVersion)in.readObject(); + features = (IgniteFeatureSet)in.readObject(); + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) + return false; + + IgniteComponentFeatureSet other = (IgniteComponentFeatureSet)o; + + return Objects.equals(compName, other.compName) + && Objects.equals(features, other.features) + && Objects.equals(compVer, other.compVer); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return "IgniteComponent [name=" + compName + ", ver=" + compVer + ']'; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return Objects.hash(compName, features, compVer); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteComponentFeatureSetProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteComponentFeatureSetProvider.java new file mode 100644 index 0000000000000..31316cc5a44c0 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteComponentFeatureSetProvider.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import java.util.Collection; +import org.apache.ignite.lang.IgniteProductVersion; +import org.apache.ignite.plugin.Extension; + +/** + * Provides the ability for internal components (e.g., plugins and SPIs) to provide their own independent sets of + * {@link IgniteFeature}s that will be accounted during Rolling Upgrade. + * + * @see IgniteFeature + */ +public interface IgniteComponentFeatureSetProvider extends Extension { + /** The name of the Ignite component that provides its own set of {@link IgniteFeature}s. */ + public String componentName(); + + /** The version of the Ignite component with which the provided {@link IgniteFeature}s will be associated. */ + public IgniteProductVersion componentVersion(); + + /** + * The set of features supported by the Ignite component. Note that the {@link IgniteFeature#componentName()} value + * for all features must match the {@link #componentName()} value. + */ + public Collection features(); +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteCoreFeature.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteCoreFeature.java new file mode 100644 index 0000000000000..a0250ef8a6237 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteCoreFeature.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import java.util.Objects; +import org.apache.ignite.internal.util.tostring.GridToStringInclude; +import org.apache.ignite.internal.util.typedef.internal.A; +import org.apache.ignite.internal.util.typedef.internal.S; + +/** Represents an implementation of {@link IgniteFeature} used to define incompatible changes in Ignite core functionality. */ +public class IgniteCoreFeature implements IgniteFeature { + /** */ + public static final String COMPONENT_NAME = "core"; + + /** */ + @GridToStringInclude + private final int id; + + /** */ + public IgniteCoreFeature(int id) { + A.ensure(id >= 0, "Feature ID must be non-negative"); + + this.id = id; + } + + /** {@inheritDoc} */ + @Override public int id() { + return id; + } + + /** {@inheritDoc} */ + @Override public String componentName() { + return COMPONENT_NAME; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + IgniteCoreFeature that = (IgniteCoreFeature)o; + + return id == that.id; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return Objects.hash(id); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(IgniteCoreFeature.class, this); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeature.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeature.java new file mode 100644 index 0000000000000..adc1e79be15c8 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeature.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** + * Represents a change in Ignite node behavior that is not compatible with Ignite nodes from previous versions. + * {@link IgniteFeature} is one of the core mechanisms on which the Ignite Rolling Upgrade implementation depends. + * It serves two main purposes: + *
        + *
      1. determining Rolling Upgrade availability between different Ignite versions
      2. + *
      3. providing the ability to deactivate Ignite functionality introduced in newer versions for the duration of a Rolling Upgrade
      4. + *
      + * + * This interface allows you to define Ignite features for both custom plugins/SPIs and core Ignite modules, and ensures + * they are handled consistently throughout the Rolling Upgrade process. + * + * @see IgniteFeatureSet + * @see IgniteComponentFeatureSetProvider + */ +public interface IgniteFeature { + /** + *

      {@link IgniteFeature} is identified by a unique integer ID. IDs of {@link IgniteFeature} instances must:

      + *
        + *
      • remain unchanged between Ignite versions
      • + *
      • start at {@code 0} and increase monotonically
      • + *
      + * + * @return The unique identifier of this feature. + */ + int id(); + + /** The name of the Ignite component to which this {@link IgniteFeature} belongs. */ + String componentName(); +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java new file mode 100644 index 0000000000000..f9a229dc8398f --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureManager.java @@ -0,0 +1,163 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.util.future.GridFutureAdapter; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.A; +import org.apache.ignite.lang.IgniteRunnable; +import org.jetbrains.annotations.Nullable; + +/** Maintains the set of active cluster {@link IgniteComponentFeatureSet} used by Rolling Upgrade logic. */ +public class IgniteFeatureManager { + /** */ + private final GridKernalContext ctx; + + /** */ + private final IgniteNodeFeatureSet locVerFeatures; + + /** */ + private final GridFutureAdapter locVerFeaturesActivationFut; + + /** */ + private volatile IgniteNodeFeatureSet activeFeatures; + + /** */ + public IgniteFeatureManager(GridKernalContext ctx, IgniteComponentFeatureSet locCoreFeatures) { + this.ctx = ctx; + this.locVerFeatures = collectLocalVersionFeatures(ctx, locCoreFeatures); + locVerFeaturesActivationFut = new GridFutureAdapter<>(); + } + + /** @return The set of features declared by the local node's product version. */ + public IgniteNodeFeatureSet localVersionFeatures() { + return locVerFeatures; + } + + /** @return Active functions of the specified component. */ + @Nullable public IgniteComponentFeatureSet activeComponentFeatures(String cmpName) { + return activeFeatures().componentFeatures(cmpName); + } + + /** @return The set of features currently active in the cluster. */ + public IgniteNodeFeatureSet activeFeatures() { + final IgniteNodeFeatureSet finalActiveFeatures = activeFeatures; + + checkActiveFeaturesInitialized(finalActiveFeatures); + + return finalActiveFeatures; + } + + /** @return {@code true} if the specified {@link IgniteFeature} is active in the cluster; {@code false} otherwise. */ + public boolean isActive(IgniteFeature feature) { + final IgniteNodeFeatureSet finalActiveFeatures = activeFeatures; + + checkActiveFeaturesInitialized(finalActiveFeatures); + + return finalActiveFeatures.contains(feature); + } + + /** Registers the specified listener to be notified when the {@link IgniteFeature} is activated. */ + public void listenActivation(IgniteFeature feature, IgniteRunnable lsnr) { + assert locVerFeatures.contains(feature); + + final IgniteNodeFeatureSet finalActiveFeatures = activeFeatures; + + checkActiveFeaturesInitialized(finalActiveFeatures); + + if (finalActiveFeatures.contains(feature)) + lsnr.run(); + else + locVerFeaturesActivationFut.listen(lsnr); + } + + /** */ + public void onGridDataReceived(IgniteNodeFeatureSet activeClusterFeatures) { + if (locVerFeatures.equals(activeClusterFeatures)) + activateLocalVersionFeatures(); + else + this.activeFeatures = activeClusterFeatures; + } + + /** */ + public void onLocalJoin() { + if (activeFeatures == null) + activateLocalVersionFeatures(); + } + + /** */ + public synchronized void activateLocalVersionFeatures() { + if (locVerFeaturesActivationFut.isDone()) + return; + + activeFeatures = locVerFeatures; + + locVerFeaturesActivationFut.onDone(); + } + + /** */ + private void checkActiveFeaturesInitialized(IgniteNodeFeatureSet activeFeatures) { + if (activeFeatures == null) { + throw new IllegalStateException("Local node features are not yet initialized [locNodeId=" + + ctx.discovery().localNode().id() + ']'); + } + } + + /** */ + private IgniteNodeFeatureSet collectLocalVersionFeatures(GridKernalContext ctx, IgniteComponentFeatureSet locCoreFeatures) { + Set features = new HashSet<>(); + + features.add(locCoreFeatures); + + IgniteComponentFeatureSetProvider[] components = ctx.plugins().extensions(IgniteComponentFeatureSetProvider.class); + + if (!F.isEmpty(components)) { + for (IgniteComponentFeatureSetProvider component : components) + features.add(buildComponentFeatures(component)); + } + + return new IgniteNodeFeatureSet(features); + } + + /** */ + private IgniteComponentFeatureSet buildComponentFeatures(IgniteComponentFeatureSetProvider cmpFeaturesProvider) { + Collection cmpFeatures = cmpFeaturesProvider.features(); + + A.notEmpty(cmpFeatures, "component features"); + + boolean allFeaturesBelongToComponent = cmpFeatures.stream() + .map(IgniteFeature::componentName) + .allMatch(featureCmp -> featureCmp.equals(cmpFeaturesProvider.componentName())); + + if (!allFeaturesBelongToComponent) { + throw new IgniteException("All specified Ignite Features must belong to the same component" + + " [componentName=" + cmpFeaturesProvider.componentName() + ']'); + } + + return new IgniteComponentFeatureSet( + cmpFeaturesProvider.componentName(), + cmpFeaturesProvider.componentVersion(), + IgniteFeatureSet.buildFrom(cmpFeatures) + ); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureSet.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureSet.java new file mode 100644 index 0000000000000..aa994965bc221 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureSet.java @@ -0,0 +1,311 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Objects; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.util.GridIntIterator; +import org.apache.ignite.internal.util.GridIntList; +import org.apache.ignite.internal.util.typedef.internal.A; +import org.apache.ignite.plugin.extensions.communication.Message; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Represents a set of Ignite node features. A feature set determines the behavior of an Ignite node. Therefore, + * comparing the feature sets of Ignite nodes running different versions helps identify behavioral differences between + * versions and determine Rolling Upgrade availability. + * + *

      The Ignite Feature Set divides all features into two categories: features that can be deactivated to simulate + * the behavior of nodes from previous versions, and features that cannot be deactivated.

      + * + *

      Note that the Ignite Feature Set operates on {@link IgniteFeature} identifiers and relies on the following + * properties of {@link IgniteFeature} identifiers:

      + * + *
        + *
      • The identifiers of existing features do not change between Ignite versions
      • + *
      • Identifier values start at {@code 0} and increase monotonically
      • + *
      + * + *

      The feature set divides features into three ranges:

      + * + *
        + *
      1. + * A continuous range of feature IDs that cannot be deactivated: + * {@code [0 -> }{@link IgniteFeatureSet#rangeStartInclusive}{@code )} + *
      2. + *
      3. + * A continuous range of feature IDs that can be deactivated: + * {@code [}{@link IgniteFeatureSet#rangeStartInclusive}{@code -> } + * {@link IgniteFeatureSet#rangeEndInclusive}{@code ]} + *
      4. + *
      5. + * A sparse suffix containing IDs of features that can be deactivated. The identifier values in this range + * are greater than {@link IgniteFeatureSet#rangeEndInclusive} + *
      6. + *
      + * + * @see IgniteFeature + */ +public class IgniteFeatureSet implements Iterable, Message, Externalizable { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + @Order(0) + int rangeStartInclusive; + + /** */ + @Order(1) + int rangeEndInclusive; + + /** */ + @Order(2) + @Nullable GridIntList sparseSuffix; + + /** */ + public IgniteFeatureSet() { + // No-op. + } + + /** */ + private IgniteFeatureSet(int rangeStartInclusive, int rangeEndInclusive, @Nullable GridIntList sparseSuffix) { + A.ensure(rangeStartInclusive >= 0, "rangeStart must be greater than or equal to 0"); + A.ensure(rangeEndInclusive >= rangeStartInclusive, "rangeEnd must be greater than or equal to rangeStart"); + + this.rangeStartInclusive = rangeStartInclusive; + this.rangeEndInclusive = rangeEndInclusive; + this.sparseSuffix = sparseSuffix; + } + + /** */ + public boolean isUpgradableTo(IgniteFeatureSet target) { + GridIntList diff = difference(target); + + for (GridIntIterator iter = diff.iterator(); iter.hasNext(); ) { + int featureId = iter.next(); + + if (!target.contains(featureId) || !target.canDeactivate(featureId)) + return false; + } + + return true; + } + + /** */ + public GridIntList difference(IgniteFeatureSet other) { + GridIntList res = new GridIntList(); + + for (int featureId : other) { + if (!contains(featureId)) + res.add(featureId); + } + + for (int featureId : this) { + if (!other.contains(featureId)) + res.add(featureId); + } + + return res; + } + + /** */ + public boolean contains(int featureId) { + if (featureId <= rangeEndInclusive) + return true; + + return sparseSuffix != null && sparseSuffix.contains(featureId); + } + + /** */ + private int calculateSize() { + int size = rangeEndInclusive + 1; + + if (sparseSuffix != null) + size += sparseSuffix.size(); + + return size; + } + + /** */ + private boolean canDeactivate(int featureId) { + return rangeStartInclusive <= featureId; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + IgniteFeatureSet that = (IgniteFeatureSet)o; + + return rangeStartInclusive == that.rangeStartInclusive + && rangeEndInclusive == that.rangeEndInclusive + && Objects.equals(sparseSuffix, that.sparseSuffix); + } + + /** {@inheritDoc} */ + @Override public @NotNull Iterator iterator() { + return new Iterator<>() { + /** */ + private int idx = 0; + + /** */ + private final int size = calculateSize(); + + /** {@inheritDoc} */ + @Override public boolean hasNext() { + return idx < size; + } + + /** {@inheritDoc} */ + @Override public Integer next() { + if (!hasNext()) + throw new NoSuchElementException(); + + Integer res = idx <= rangeEndInclusive ? idx : sparseSuffix.get(idx - rangeEndInclusive - 1); + + ++idx; + + return res; + } + }; + } + + /** {@inheritDoc} */ + @Override public void writeExternal(ObjectOutput out) throws IOException { + out.writeInt(rangeStartInclusive); + out.writeInt(rangeEndInclusive); + out.writeObject(sparseSuffix); + } + + /** {@inheritDoc} */ + @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + rangeStartInclusive = in.readInt(); + rangeEndInclusive = in.readInt(); + sparseSuffix = (GridIntList)in.readObject(); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return Objects.hash(rangeStartInclusive, rangeEndInclusive, sparseSuffix); + } + + /** {@inheritDoc} */ + @Override public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("IgniteFeatureSet [").append(rangeStartInclusive); + + if (rangeStartInclusive != rangeEndInclusive) + sb.append(rangeEndInclusive - rangeStartInclusive > 1 ? " -> " : ", ").append(rangeEndInclusive); + + if (sparseSuffix != null) { + for (GridIntIterator iter = sparseSuffix.iterator(); iter.hasNext(); ) + sb.append(", ").append(iter.next()); + } + + sb.append(']'); + + return sb.toString(); + } + + /** */ + public static IgniteFeatureSet buildFrom(Class cls) { + return buildFrom(readDeclaredFeatures(cls)); + } + + /** + * Creates an {@link IgniteFeatureSet} from the specified collection of {@link IgniteFeature}s that can be deactivated + * on an Ignite node. + * + *

      {@link IgniteFeature} instances that are not present in the specified collection and whose IDs are lower than + * the minimum ID among the specified {@link IgniteFeature}s are considered non-deactivatable.

      + */ + public static IgniteFeatureSet buildFrom(Collection features) { + A.notEmpty(features, "features"); + + GridIntList featureIds = new GridIntList(features.stream().mapToInt(IgniteFeature::id).toArray()); + + featureIds.sort(); + + int rangeStart = featureIds.get(0); + int rangeEnd = rangeStart; + + int idx = 1; + + for (; idx < featureIds.size(); idx++) { + int nextFeatureId = featureIds.get(idx); + + assert nextFeatureId != rangeEnd : "Duplication of Ignite Feature ID [duplicatedFeatureId=" + nextFeatureId + ']'; + + if (nextFeatureId == rangeEnd + 1) + rangeEnd = nextFeatureId; + else + break; + } + + GridIntList sparseSuffix = idx < featureIds.size() ? featureIds.copyOfRange(idx, featureIds.size()) : null; + + return new IgniteFeatureSet(rangeStart, rangeEnd, sparseSuffix); + } + + /** */ + public static Collection readDeclaredFeatures(Class cls) { + A.notNull(cls, "cls"); + + List features = new ArrayList<>(); + + for (Field field : cls.getFields()) { + if (Modifier.isStatic(field.getModifiers()) && + field.getType().equals(IgniteFeature.class) && + field.getName().endsWith("_FEATURE") + ) { + try { + IgniteFeature feature = (IgniteFeature)field.get(null); + + features.add(feature); + } + catch (IllegalAccessException e) { + throw new IgniteException( + "Failed to parse specified class to collect feature definitions [cls=" + cls.getName() + ']', e); + } + } + } + + if (features.isEmpty()) + throw new IgniteException("No Ignite feature definitions were found in the specified class [cls=" + cls.getName() + ']'); + + return features; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteNodeFeatureSet.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteNodeFeatureSet.java new file mode 100644 index 0000000000000..6bf5661c5bb07 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteNodeFeatureSet.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.util.tostring.GridToStringExclude; +import org.jetbrains.annotations.Nullable; + +/** + * Represents a set of {@link IgniteFeature}s supported by an Ignite node. Ignite is divided into independent components. + * Each component is associated with its version and a set of {@link IgniteFeature}s. + */ +public class IgniteNodeFeatureSet { + /** */ + @GridToStringExclude + private final Map features; + + /** */ + public IgniteNodeFeatureSet(Collection features) { + this.features = indexByComponentName(features); + } + + /** */ + public Set components() { + return Collections.unmodifiableSet(features.keySet()); + } + + /** */ + public Collection values() { + return Collections.unmodifiableCollection(features.values()); + } + + /** */ + @Nullable public IgniteComponentFeatureSet componentFeatures(String cmpName) { + return features.get(cmpName); + } + + /** */ + public boolean containsAll(IgniteNodeFeatureSet other) { + if (!components().containsAll(other.components())) + return false; + + for (IgniteComponentFeatureSet otherCmpFeatures : other.features.values()) { + if (!otherCmpFeatures.equals(features.get(otherCmpFeatures.componentName()))) + return false; + } + + return true; + } + + /** */ + public boolean contains(IgniteFeature feature) { + IgniteComponentFeatureSet cmpFeatures = features.get(feature.componentName()); + + return cmpFeatures != null && cmpFeatures.contains(feature.id()); + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) + return false; + + IgniteNodeFeatureSet other = (IgniteNodeFeatureSet)o; + + return Objects.equals(features, other.features); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return Objects.hashCode(features); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return features.values().stream().map(IgniteComponentFeatureSet::toString).collect(Collectors.joining(", ", "[", "]")); + } + + /** */ + private static Map indexByComponentName(Collection features) { + Map res = new HashMap<>(); + + for (IgniteComponentFeatureSet compFeatures : features) { + if (res.put(compFeatures.componentName(), compFeatures) != null) + throw new IgniteException("Duplicated component name [cmpName=" + compFeatures.componentName() + ']'); + } + + return res; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/SupportedFeatureRegistry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/SupportedFeatureRegistry.java new file mode 100644 index 0000000000000..7b3e55b85d3c4 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/feature/SupportedFeatureRegistry.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import org.apache.ignite.internal.processors.rollingupgrade.RollingUpgradeProcessor; + +/** + * Declares the {@link IgniteFeature}s supported by the current Ignite version. + * The complete set of declared {@link IgniteFeature}s defines the behavior of a node running the current version + * and determines whether a Rolling Upgrade is supported between the current Ignite version and older Ignite versions. + * + *

      Developer Guide

      + * + *

      Developers should introduce a new {@link IgniteFeature} whenever a code change may break backward compatibility + * with older Ignite versions.

      + * + *

      Typical cases include:

      + * + *
        + *
      1. Message schema changes (adding, replacing, or removing fields).
      2. + *
      3. Changes to message production or processing logic.
      4. + *
      5. Introduction of new message types and their associated processing logic.
      6. + *
      7. API deprecation or removal.
      8. + *
      9. Changes to persistence logic or on-disk data formats.
      10. + *
      + * + *

      Template for Rolling Upgrade-compatible code:

      + * + *
      {@code
      + * if (ctx.rollingUpgrade().features().isActive(IGNITE_FEATURE)) {
      + *     // 
      + * }
      + * else {
      + *     // 
      + * }
      + * }
      + * + *

      {@link IgniteFeature} ID and naming conventions:

      + * + *
        + *
      1. Each variable declaring an {@link IgniteFeature} must end with the {@code _FEATURE} suffix.
      2. + *
      3. IDs of existing {@link IgniteFeature}s must not be modified.
      4. + *
      5. IDs assigned to new {@link IgniteFeature}s must increase monotonically.
      6. + *
      7. {@link IgniteFeature}s must be declared in ascending order of their identifiers.
      8. + *
      + * + *

      Release Manager Guide

      + *

      Release based on the Ignite main branch

      + *

      The release manager should:

      + * + *
        + *
      1. + * Determine which previous Ignite versions should remain eligible for Rolling Upgrade to the current version. + *
      2. + *
      3. + * Remove {@link IgniteFeature}s introduced in Ignite versions from which Rolling Upgrade is no longer supported. + * Such removals must always form a contiguous range starting from the lowest {@link IgniteFeature} identifier. + *
      4. + *
      5. + * Remove code that emulates the behavior of Ignite versions from which Rolling Upgrade is no longer supported. + * As a result, only the {@code } branch should remain. + *
      6. + *
      + * + *

      Release based on a legacy branch (backporting features to earlier Ignite versions)

      + *

      The release manager must follow the rules listed below:

      + *
        + *
      1. Identifiers of backported {@link IgniteFeature}s must not be modified.
      2. + *
      3. Removal of existing {@link IgniteFeature}s is strictly prohibited.
      4. + *
      5. Introducing new {@link IgniteFeature}s that do not exist in the main branch is strictly prohibited.
      6. + *
      + * + * @see IgniteFeature + * @see IgniteFeatureSet + * @see IgniteFeatureManager + * @see RollingUpgradeProcessor + */ +public class SupportedFeatureRegistry { + /** */ + public static final IgniteFeature ROLLING_UPGRADE_FEATURE = new IgniteCoreFeature(0); +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java index 7b34ed75db2dc..ddbf0d3d96f7a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java @@ -34,6 +34,7 @@ import org.apache.ignite.internal.processors.security.sandbox.NoOpSandbox; import org.apache.ignite.internal.thread.context.OperationContext; import org.apache.ignite.internal.thread.context.OperationContextAttribute; +import org.apache.ignite.internal.thread.context.OperationContextDispatcher; import org.apache.ignite.internal.thread.context.Scope; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; @@ -55,6 +56,7 @@ import static org.apache.ignite.internal.processors.security.SecurityUtils.MSG_SEC_PROC_CLS_IS_INVALID; import static org.apache.ignite.internal.processors.security.SecurityUtils.hasSecurityManager; import static org.apache.ignite.internal.processors.security.SecurityUtils.nodeSecurityContext; +import static org.apache.ignite.internal.thread.context.DistributedOperationContextAttribute.SECURITY; import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_USER_ACCESS; import static org.apache.ignite.plugin.security.SecurityPermission.JOIN_AS_SERVER; @@ -88,8 +90,12 @@ static boolean hasSandboxedNodes() { return SANDBOXED_NODES_COUNTER.get() > 0; } - /** Context attribute that holds Security Context. */ - private static final OperationContextAttribute SEC_CTX = OperationContextAttribute.newInstance(); + /** + * Attribute that holds local and distributed Security Context. + * + * @see OperationContextDispatcher + */ + private static final OperationContextAttribute SEC_CTX_ATTR = OperationContextAttribute.newInstance(); /** Security processor. */ private final GridSecurityProcessor secPrc; @@ -126,28 +132,12 @@ public IgniteSecurityProcessor(GridKernalContext ctx, GridSecurityProcessor secP /** {@inheritDoc} */ @Override public Scope withContext(SecurityContext secCtx) { - return OperationContext.set(SEC_CTX, secCtx == dfltSecCtx ? null : secCtx); + return OperationContext.set(SEC_CTX_ATTR, secCtx == dfltSecCtx ? null : new SecurityContextWrapper(secCtx)); } /** {@inheritDoc} */ @Override public Scope withContext(UUID subjId) { - try { - SecurityContext res = secPrc.securityContext(subjId); - - if (res == null) { - res = findNodeSecurityContext(subjId); - - if (res == null) - throw new IllegalStateException("Failed to find security context for subject with given ID : " + subjId); - } - - return withContext(res); - } - catch (Throwable e) { - log.error(FAILED_OBTAIN_SEC_CTX_MSG, e); - - throw e; - } + return withContext(securityContext(subjId)); } /** @@ -172,14 +162,41 @@ public IgniteSecurityProcessor(GridKernalContext ctx, GridSecurityProcessor secP /** {@inheritDoc} */ @Override public boolean isDefaultContext() { - return OperationContext.get(SEC_CTX) == null; + return OperationContext.get(SEC_CTX_ATTR) == null; } /** {@inheritDoc} */ @Override public SecurityContext securityContext() { - SecurityContext res = OperationContext.get(SEC_CTX); + SecurityContextWrapper secCtx = OperationContext.get(SEC_CTX_ATTR); + + if (secCtx == null) + return dfltSecCtx; + + if (secCtx.delegate() == null) + secCtx.delegate(securityContext(secCtx.subjId)); - return res == null ? dfltSecCtx : res; + return secCtx.delegate(); + } + + /** */ + private SecurityContext securityContext(UUID subjId) { + try { + SecurityContext res = secPrc.securityContext(subjId); + + if (res == null) { + res = findNodeSecurityContext(subjId); + + if (res == null) + throw new IllegalStateException("Failed to find security context for subject with given ID : " + subjId); + } + + return res; + } + catch (Throwable e) { + log.error(FAILED_OBTAIN_SEC_CTX_MSG, e); + + throw e; + } } /** {@inheritDoc} */ @@ -236,6 +253,8 @@ public IgniteSecurityProcessor(GridKernalContext ctx, GridSecurityProcessor secP @Override public void start() throws IgniteCheckedException { super.start(); + ctx.operationContextDispatcher().registerDistributedAttribute(SECURITY.id(), SEC_CTX_ATTR); + ctx.addNodeAttribute(ATTR_GRID_SEC_PROC_CLASS, secPrc.getClass().getName()); secPrc.start(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextWrapper.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextWrapper.java new file mode 100644 index 0000000000000..81777e5629fc2 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContextWrapper.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.security; + +import java.util.UUID; +import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.thread.context.DistributedOperationContextAttribute; +import org.apache.ignite.internal.thread.context.OperationContextDispatcher; +import org.apache.ignite.plugin.extensions.communication.Message; +import org.apache.ignite.plugin.security.SecuritySubject; + +/** + * {@link SecurityContext} attribute value holder and message for {@link SecuritySubject}'s id. + * + * @see OperationContextDispatcher#collectDistributedAttributes() + * @see DistributedOperationContextAttribute#SECURITY + */ +public class SecurityContextWrapper implements Message { + /** A value of {@link SecuritySubject#id()} */ + @Order(0) + UUID subjId; + + /** Transient, effective {@link SecurityContext}. */ + private SecurityContext delegate; + + /** Empty constructor for serialization purposes. */ + public SecurityContextWrapper() { + // No-op. + } + + /** */ + public SecurityContextWrapper(SecurityContext delegate) { + this.delegate = delegate; + this.subjId = delegate.subject().id(); + } + + /** */ + public SecurityContext delegate() { + return delegate; + } + + /** */ + public void delegate(SecurityContext delegate) { + this.delegate = delegate; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/IgniteServiceProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/IgniteServiceProcessor.java index e7f59549ea4ac..34118541ece6d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/IgniteServiceProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/IgniteServiceProcessor.java @@ -389,7 +389,7 @@ private void cancelDeployedServices() { if (data.commonData() == null) return; - ServiceProcessorCommonDiscoveryData clusterData = (ServiceProcessorCommonDiscoveryData)data.commonData(); + ServiceProcessorCommonDiscoveryData clusterData = data.commonData(); for (ServiceInfo desc : clusterData.registeredServices()) { try { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java index 77563757c5742..c7cd10f562629 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java @@ -22,15 +22,11 @@ import org.apache.ignite.logger.NullLogger; import org.apache.ignite.spi.tracing.TracingConfigurationManager; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * Noop implementation of {@link Tracing}. */ -public class NoopTracing implements Tracing { - /** Noop serialized span. */ - public static final byte[] NOOP_SERIALIZED_SPAN = new byte[0]; - +public class NoopTracing extends NoopSpanManager implements Tracing { /** Traceable messages handler. */ private final TraceableMessagesHandler msgHnd; @@ -46,29 +42,6 @@ public NoopTracing() { return msgHnd; } - /** {@inheritDoc} */ - @Override public Span create(@NotNull SpanType spanType, @Nullable Span parentSpan) { - return NoopSpan.INSTANCE; - } - - /** {@inheritDoc} */ - @Override public Span create(@NotNull SpanType spanType, @Nullable byte[] serializedParentSpan) { - return NoopSpan.INSTANCE; - } - - /** {@inheritDoc} */ - @Override public @NotNull Span create( - @NotNull SpanType spanType, - @Nullable Span parentSpan, - @Nullable String label) { - return NoopSpan.INSTANCE; - } - - /** {@inheritDoc} */ - @Override public byte[] serialize(@NotNull Span span) { - return NOOP_SERIALIZED_SPAN; - } - /** {@inheritDoc} */ @Override public @NotNull TracingConfigurationManager configuration() { return NoopTracingConfigurationManager.INSTANCE; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/sql/optimizer/affinity/PartitionNode.java b/modules/core/src/main/java/org/apache/ignite/internal/sql/optimizer/affinity/PartitionNode.java index 98e203001f71c..c507bdf443c47 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/sql/optimizer/affinity/PartitionNode.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/sql/optimizer/affinity/PartitionNode.java @@ -41,7 +41,6 @@ public interface PartitionNode { */ int joinGroup(); - /** * @return First met cache name of an any PartitionSingleNode * during PartitionNode tree traversal. This method is intended to be used within the Jdbc thin client. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridDirectMap.java b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttribute.java similarity index 57% rename from modules/core/src/main/java/org/apache/ignite/internal/GridDirectMap.java rename to modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttribute.java index 8bddc4756d59f..7c6899fec0eb7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridDirectMap.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/DistributedOperationContextAttribute.java @@ -15,29 +15,22 @@ * limitations under the License. */ -package org.apache.ignite.internal; +package org.apache.ignite.internal.thread.context; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import org.apache.ignite.internal.processors.security.SecurityContext; +import org.apache.ignite.internal.processors.security.SecurityContextWrapper; -/** - * Annotates map fields. - * Deprecated as not needed for new messages. See {@link Order} and {@link MessageProcessor} for details on how message - * serialization code is generated. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -@Deprecated -public @interface GridDirectMap { +/** Ids of Ignite's known distributed operation context attributes. */ +public enum DistributedOperationContextAttribute { /** - * @return Key type. + * Distributed {@link SecurityContext}. + * + * @see SecurityContextWrapper */ - Class keyType(); + SECURITY; - /** - * @return Value type. - */ - Class valueType(); + /** Cluster-wide id of distributed attribute. */ + public byte id() { + return (byte)ordinal(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java new file mode 100644 index 0000000000000..11f56e032bf6d --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/thread/context/OperationContextDispatcher.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.thread.context; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentSkipListMap; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.OperationContextMessage; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.plugin.extensions.communication.Message; +import org.jetbrains.annotations.Nullable; + +/** + * Provides the ability to manage {@link OperationContext} attributes in a distributed manner. + * + *

      This mechanism is primarily used to propagate {@link OperationContext} state across the cluster by + * capturing it before a message is sent, transferring it together with the message, and restoring it on + * the receiving node before message processing begins.

      + * + *

      The implementation relies on a mapping between a distributed identifier and an + * {@link OperationContextAttribute} instance that is consistent across all cluster nodes.

      + * + *

      To enable propagation of an {@link OperationContextAttribute} value across cluster nodes, the + * attribute must be registered with the {@link #registerDistributedAttribute(int, OperationContextAttribute)} method. + * + *

      Note, that the maximum number of distributed attributes to register is currently limited to + * {@link #MAX_ATTRS_CNT} for implementation reasons.

      + * + * @see OperationContext + * @see OperationContextMessage + * @see DistributedOperationContextAttribute + */ +public class OperationContextDispatcher { + /** Maximal number of supported distributed attributes. */ + static final byte MAX_ATTRS_CNT = Byte.SIZE; + + /** Registered distributed attributes by their cluster-wide id. */ + private final Map> attrs = new ConcurrentSkipListMap<>(); + + /** Whether the registration of new distributed attributes is allowed. */ + private volatile boolean regFinished; + + /** + * Registers an attribute of {@link OperationContext} with the specified distributed ID. + * + *

      The distributed ID is used to consistently identify the attribute across all nodes in the cluster. + * It must be unique, and its value must be in the range [{@code 0} : {@code Byte.SIZE}).

      + * + *

      Registered attribute value is automatically captured and propagated between cluster nodes + * during the messages transmission.

      + */ + public void registerDistributedAttribute(int id, OperationContextAttribute attr) { + if (regFinished) + throw new IgniteException("Initialization of distributed operation context attributes has already finished."); + + assert id >= 0 && id < MAX_ATTRS_CNT : "Invalid distributed attributed id [id=" + id + ']'; + + if (attrs.putIfAbsent((byte)id, attr) != null) + throw new IgniteException("Duplicated distributed attribute id [id=" + id + ']'); + } + + /** + * Collects the values of all distributed {@link OperationContextAttribute}s registered by this dispatcher. + * + * @see OperationContext#get(OperationContextAttribute) + */ + public @Nullable OperationContextMessage collectDistributedAttributes() { + OperationContextMessage res = null; + List vals = null; + + for (Map.Entry> e : attrs.entrySet()) { + OperationContextAttribute attr = e.getValue(); + + Message curVal = OperationContext.get(attr); + + if (curVal != attr.initialValue()) { + if (res == null) { + res = new OperationContextMessage(); + + vals = new ArrayList<>(MAX_ATTRS_CNT / 2); + } + + byte mask = (byte)(1 << e.getKey()); + + assert (res.idBitmap & mask) == 0; + + vals.add(curVal); + res.idBitmap |= mask; + } + } + + if (res != null) + res.vals = vals.toArray(new Message[vals.size()]); + + return res; + } + + /** Restores distributed {@link OperationContextAttribute} values received from a remote node. */ + public Scope restoreDistributedAttributes(@Nullable OperationContextMessage msg) { + if (msg == null) + return Scope.NOOP_SCOPE; + + assert msg.idBitmap != 0; + assert !F.isEmpty(msg.vals); + assert msg.vals.length <= MAX_ATTRS_CNT; + + OperationContext.ContextUpdater updater = OperationContext.ContextUpdater.create(); + + for (byte valIdx = 0, maskIdx = 0; valIdx < msg.vals.length; ++valIdx) { + Message curVal = msg.vals[valIdx]; + + while ((msg.idBitmap & (1 << maskIdx)) == 0) + ++maskIdx; + + OperationContextAttribute attr = (OperationContextAttribute)attrs.get(maskIdx++); + + assert attr != null; + + updater.set(attr, curVal); + } + + return updater.apply(); + } + + /** Restricts further registration of distributed attributes. */ + public void finishRegistration() { + regFinished = true; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/transactions/IgniteTxOptimisticCheckedException.java b/modules/core/src/main/java/org/apache/ignite/internal/transactions/IgniteTxOptimisticCheckedException.java index 9430dd7c20046..0cc0ffd36651f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/transactions/IgniteTxOptimisticCheckedException.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/transactions/IgniteTxOptimisticCheckedException.java @@ -17,10 +17,12 @@ package org.apache.ignite.internal.transactions; +import org.apache.ignite.internal.util.future.GridCompoundFuture.SkipLoggingException; + /** * Exception thrown whenever grid transactions fail optimistically. */ -public class IgniteTxOptimisticCheckedException extends TransactionCheckedException { +public class IgniteTxOptimisticCheckedException extends TransactionCheckedException implements SkipLoggingException { /** */ private static final long serialVersionUID = 0L; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java index 0457b592dfce9..6d00a47c737f8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java @@ -22,7 +22,9 @@ import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Arrays; +import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.typedef.internal.SB; +import org.apache.ignite.plugin.extensions.communication.Message; import static org.apache.ignite.internal.util.IgniteUtils.EMPTY_INTS; @@ -30,15 +32,17 @@ * Minimal list API to work with primitive ints. This list exists * to avoid boxing/unboxing when using standard list from Java. */ -public class GridIntList implements Externalizable { +public class GridIntList implements Message, Externalizable { /** */ private static final long serialVersionUID = 0L; /** */ - private int[] arr; + @Order(0) + int[] arr; /** */ - private int idx; + @Order(1) + int idx; /** * @@ -223,6 +227,17 @@ public int[] arrayCopy() { return res; } + /** + * @param from The initial index of the range to be copied, inclusive. + * @param to The final index of the range to be copied, exclusive. + * @return a new {@link GridIntList} containing the specified range from the current {@link GridIntList}. + */ + public GridIntList copyOfRange(int from, int to) { + assert 0 <= from && from <= to && to <= idx; + + return new GridIntList(Arrays.copyOfRange(arr, from, to)); + } + /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeInt(idx); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java index 1513346138589..1f722faffc8de 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java @@ -65,7 +65,6 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileLock; -import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -114,7 +113,7 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReadWriteLock; import java.util.function.Consumer; -import java.util.function.Function; +import java.util.function.LongConsumer; import java.util.jar.JarFile; import java.util.logging.ConsoleHandler; import java.util.logging.Handler; @@ -135,6 +134,7 @@ import javax.management.ObjectName; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; @@ -144,13 +144,7 @@ import org.apache.ignite.IgniteLogger; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.binary.BinaryField; -import org.apache.ignite.binary.BinaryIdMapper; -import org.apache.ignite.binary.BinaryNameMapper; import org.apache.ignite.binary.BinaryObjectBuilder; -import org.apache.ignite.binary.BinaryObjectException; -import org.apache.ignite.binary.BinarySerializer; -import org.apache.ignite.binary.BinaryType; -import org.apache.ignite.binary.BinaryTypeConfiguration; import org.apache.ignite.cluster.ClusterGroupEmptyException; import org.apache.ignite.cluster.ClusterMetrics; import org.apache.ignite.cluster.ClusterNode; @@ -171,7 +165,6 @@ import org.apache.ignite.internal.IgniteNodeAttributes; import org.apache.ignite.internal.binary.BinaryContext; import org.apache.ignite.internal.binary.BinaryMarshaller; -import org.apache.ignite.internal.binary.BinaryMetadata; import org.apache.ignite.internal.binary.BinaryMetadataHandler; import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.builder.BinaryObjectBuilderEx; @@ -194,15 +187,18 @@ import org.apache.ignite.internal.processors.cache.CacheObjectContext; import org.apache.ignite.internal.processors.cache.GridCacheSharedContext; import org.apache.ignite.internal.processors.cache.IgnitePeerToPeerClassLoadingException; +import org.apache.ignite.internal.processors.metric.MetricRegistryImpl; import org.apache.ignite.internal.transactions.IgniteTxHeuristicCheckedException; import org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException; import org.apache.ignite.internal.transactions.IgniteTxRollbackCheckedException; import org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.future.IgniteFutureImpl; -import org.apache.ignite.internal.util.lang.GridClosureException; import org.apache.ignite.internal.util.lang.GridPeerDeployAware; import org.apache.ignite.internal.util.lang.IgniteThrowableFunction; +import org.apache.ignite.internal.util.nio.GridNioFilter; +import org.apache.ignite.internal.util.nio.GridNioServer; +import org.apache.ignite.internal.util.nio.ssl.GridNioSslFilter; import org.apache.ignite.internal.util.typedef.C1; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.G; @@ -231,7 +227,6 @@ import org.apache.ignite.spi.discovery.DiscoverySpiCustomMessage; import org.apache.ignite.spi.discovery.DiscoverySpiOrderSupport; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; -import org.apache.ignite.thread.IgniteThread; import org.apache.ignite.transactions.TransactionDeadlockException; import org.apache.ignite.transactions.TransactionHeuristicException; import org.apache.ignite.transactions.TransactionOptimisticException; @@ -300,9 +295,6 @@ public abstract class IgniteUtils extends CommonUtils { /** Empty integers array. */ public static final int[] EMPTY_INTS = new int[0]; - /** Empty longs array. */ - public static final long[] EMPTY_LONGS = new long[0]; - /** Empty strings array. */ public static final String[] EMPTY_STRS = new String[0]; @@ -350,9 +342,6 @@ public abstract class IgniteUtils extends CommonUtils { public static final String JMX_DOMAIN = IgniteUtils.class.getName().substring(0, IgniteUtils.class.getName(). indexOf('.', IgniteUtils.class.getName().indexOf('.') + 1)); - /** Network packet header. */ - public static final byte[] IGNITE_HEADER = intToBytes(0x0149474E); - /** Default buffer size = 4K. */ private static final int BUF_SIZE = 4096; @@ -413,10 +402,6 @@ public abstract class IgniteUtils extends CommonUtils { public static boolean IGNITE_TEST_FEATURES_ENABLED = IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_TEST_FEATURES_ENABLED); - /** For tests. */ - @SuppressWarnings("PublicField") - public static boolean useTestBinaryCtx; - /** */ private static final boolean assertionsEnabled; @@ -2130,28 +2115,6 @@ private static long fromBytes(byte[] bytes, int off, int limit) { return res; } - /** - * Compares fragments of byte arrays. - * - * @param a First array. - * @param aOff First array offset. - * @param b Second array. - * @param bOff Second array offset. - * @param len Length of fragments. - * @return {@code true} if fragments are equal, {@code false} otherwise. - */ - public static boolean bytesEqual(byte[] a, int aOff, byte[] b, int bOff, int len) { - if (aOff + len > a.length || bOff + len > b.length) - return false; - else { - for (int i = 0; i < len; i++) - if (a[aOff + i] != b[bOff + i]) - return false; - - return true; - } - } - /** * @param bytes Number of bytes to display. * @param si If {@code true}, then unit base is 1000, otherwise unit base is 1024. @@ -2796,47 +2759,6 @@ public static void closeWithSuppressingException(@Nullable AutoCloseable rsrc, @ } } - /** - * Quietly closes given resource ignoring possible checked exception. - * - * @param rsrc Resource to close. If it's {@code null} - it's no-op. - */ - public static void closeQuiet(@Nullable AutoCloseable rsrc) { - if (rsrc != null) - try { - rsrc.close(); - } - catch (Exception ignored) { - // No-op. - } - } - - /** - * Quietly closes given {@link Socket} ignoring possible checked exception. - * - * @param sock Socket to close. If it's {@code null} - it's no-op. - */ - public static void closeQuiet(@Nullable Socket sock) { - if (sock == null) - return; - - try { - // Avoid tls 1.3 incompatibility https://bugs.openjdk.java.net/browse/JDK-8208526 - sock.shutdownOutput(); - sock.shutdownInput(); - } - catch (Exception ignored) { - // No-op. - } - - try { - sock.close(); - } - catch (Exception ignored) { - // No-op. - } - } - /** * Quietly releases file lock ignoring all possible exceptions. * @@ -3288,69 +3210,6 @@ public static boolean joinThreads(Iterable workers, @Nullable return retval; } - /** - * Cancels given runnable. - * - * @param w Worker to cancel - it's no-op if runnable is {@code null}. - */ - public static void cancel(@Nullable GridWorker w) { - if (w != null) - w.cancel(); - } - - /** - * Cancels collection of runnables. - * - * @param ws Collection of workers - it's no-op if collection is {@code null}. - */ - public static void cancel(Iterable ws) { - if (ws != null) - for (GridWorker w : ws) - w.cancel(); - } - - /** - * Joins runnable. - * - * @param w Worker to join. - * @param log The logger to possible exception. - * @return {@code true} if worker has not been interrupted, {@code false} if it was interrupted. - */ - public static boolean join(@Nullable GridWorker w, @Nullable IgniteLogger log) { - if (w != null) - try { - w.join(); - } - catch (InterruptedException ignore) { - warn(log, "Got interrupted while waiting for completion of runnable: " + w); - - Thread.currentThread().interrupt(); - - return false; - } - - return true; - } - - /** - * Joins given collection of runnables. - * - * @param ws Collection of workers to join. - * @param log The logger to possible exceptions. - * @return {@code true} if none of the worker have been interrupted, - * {@code false} if at least one was interrupted. - */ - public static boolean join(Iterable ws, IgniteLogger log) { - boolean retval = true; - - if (ws != null) - for (GridWorker w : ws) - if (!join(w, log)) - retval = false; - - return retval; - } - /** * Shutdowns given {@code ExecutorService} and wait for executor service to stop. * @@ -4880,49 +4739,6 @@ public static JMException jmException(Throwable e) { return new JMException(e.getMessage()); } - /** - * Unwraps closure exceptions. - * - * @param t Exception. - * @return Unwrapped exception. - */ - public static Exception unwrap(Throwable t) { - assert t != null; - - while (true) { - if (t instanceof Error) - throw (Error)t; - - if (t instanceof GridClosureException) { - t = ((GridClosureException)t).unwrap(); - - continue; - } - - return (Exception)t; - } - } - - /** - * Casts the passed {@code Throwable t} to {@link IgniteCheckedException}.
      - * If {@code t} is a {@link GridClosureException}, it is unwrapped and then cast to {@link IgniteCheckedException}. - * If {@code t} is an {@link IgniteCheckedException}, it is returned. - * If {@code t} is not a {@link IgniteCheckedException}, a new {@link IgniteCheckedException} caused by {@code t} - * is returned. - * - * @param t Throwable to cast. - * @return {@code t} cast to {@link IgniteCheckedException}. - */ - public static IgniteCheckedException cast(Throwable t) { - assert t != null; - - t = unwrap(t); - - return t instanceof IgniteCheckedException - ? (IgniteCheckedException)t - : new IgniteCheckedException(t); - } - /** * Checks if class loader is an internal P2P class loader. * @@ -5153,23 +4969,6 @@ public static void awaitQuiet(CyclicBarrier barrier) { Thread.currentThread().interrupt(); } - /** - * Sleeps for given number of milliseconds. - * - * @param ms Time to sleep. - * @throws IgniteInterruptedCheckedException Wrapped {@link InterruptedException}. - */ - public static void sleep(long ms) throws IgniteInterruptedCheckedException { - try { - Thread.sleep(ms); - } - catch (InterruptedException e) { - Thread.currentThread().interrupt(); - - throw new IgniteInterruptedCheckedException(e); - } - } - /** * Joins worker. * @@ -5648,30 +5447,6 @@ public static void removeJavaNoOpLogger(Collection rmvHnds) { } } - /** - * Gets absolute value for integer. If integer is {@link Integer#MIN_VALUE}, then {@code 0} is returned. - * - * @param i Integer. - * @return Absolute value. - */ - public static int safeAbs(int i) { - i = Math.abs(i); - - return i < 0 ? 0 : i; - } - - /** - * Gets absolute value for long. If argument is {@link Long#MIN_VALUE}, then {@code 0} is returned. - * - * @param i Argument. - * @return Absolute value. - */ - public static long safeAbs(long i) { - i = Math.abs(i); - - return i < 0 ? 0 : i; - } - /** * When {@code long} value given is positive returns that value, otherwise returns provided default value. * @@ -7289,31 +7064,6 @@ private static Collection doInParallel( return results; } - /** - * Utility method to add the given throwable error to the given throwable root error. If the given - * suppressed throwable is an {@code Error}, but the root error is not, will change the root to the {@code Error}. - * - * @param root Root error to add suppressed error to. - * @param err Error to add. - * @return New root error. - */ - public static T addSuppressed(T root, T err) { - assert err != null; - - if (root == null) - return err; - - if (err instanceof Error && !(root instanceof Error)) { - err.addSuppressed(root); - - root = err; - } - else - root.addSuppressed(err); - - return root; - } - /** * @return {@code true} if local node is coordinator. */ @@ -7450,30 +7200,6 @@ public static Runnable wrapIgniteFuture(Runnable r, GridFutureAdapter fut) { }; } - /** - * Safely write buffer fully to blocking socket channel. - * Will throw assert if non blocking channel passed. - * - * @param sockCh WritableByteChannel. - * @param buf Buffer. - * @throws IOException IOException. - */ - public static void writeFully(SocketChannel sockCh, ByteBuffer buf) throws IOException { - int totalWritten = 0; - - assert sockCh.isBlocking() : "SocketChannel should be in blocking mode " + sockCh; - - while (buf.hasRemaining()) { - int written = sockCh.write(buf); - - if (written < 0) - throw new IOException("Error writing buffer to channel " + - "[written = " + written + ", buf " + buf + ", totalWritten = " + totalWritten + "]"); - - totalWritten += written; - } - } - /** * @return New identity hash set. */ @@ -7896,35 +7622,16 @@ public static BinaryContext binaryContext( ) { BinaryConfiguration bcfg = cfg.getBinaryConfiguration() == null ? new BinaryConfiguration() : cfg.getBinaryConfiguration(); - return useTestBinaryCtx - ? new TestBinaryContext( - metaHnd, - marsh, - cfg.getIgniteInstanceName(), - cfg.getClassLoader(), - bcfg.getSerializer(), - bcfg.getIdMapper(), - bcfg.getNameMapper(), - bcfg.getTypeConfigurations(), - CU.affinityFields(cfg), - bcfg.isCompactFooter(), - CU::affinityFieldName, - log - ) - : new BinaryContext( - metaHnd, - marsh, - cfg.getIgniteInstanceName(), - cfg.getClassLoader(), - bcfg.getSerializer(), - bcfg.getIdMapper(), - bcfg.getNameMapper(), - bcfg.getTypeConfigurations(), - CU.affinityFields(cfg), - bcfg.isCompactFooter(), - CU::affinityFieldName, - log - ); + return BinaryUtils.binaryContext( + metaHnd, + marsh, + cfg.getIgniteInstanceName(), + cfg.getClassLoader(), + bcfg, + CU.affinityFields(cfg), + BinaryUtils::affinityFieldName, + log + ); } /** @@ -8000,106 +7707,6 @@ public static void prepareAffinityField(BinaryObjectBuilder builder, CacheObject } } - /** - * Creates thread with given worker. - * - * @param worker Runnable to create thread with. - */ - public static IgniteThread newThread(GridWorker worker) { - return new IgniteThread(worker.igniteInstanceName(), worker.name(), worker); - } - - /** */ - @SuppressWarnings("PublicInnerClass") - public static class TestBinaryContext extends BinaryContext { - /** */ - private List listeners; - - /** */ - public TestBinaryContext( - BinaryMetadataHandler metaHnd, - @Nullable BinaryMarshaller marsh, - @Nullable String igniteInstanceName, - @Nullable ClassLoader clsLdr, - @Nullable BinarySerializer dfltSerializer, - @Nullable BinaryIdMapper idMapper, - @Nullable BinaryNameMapper nameMapper, - @Nullable Collection typeCfgs, - Map affFlds, - boolean compactFooter, - Function, String> affFldNameProvider, - IgniteLogger log - ) { - super( - metaHnd, - marsh, - igniteInstanceName, - clsLdr, - dfltSerializer, - idMapper, - nameMapper, - typeCfgs, - affFlds, - compactFooter, - affFldNameProvider, - log - ); - } - - - /** {@inheritDoc} */ - @Nullable @Override public BinaryType metadata(int typeId) throws BinaryObjectException { - BinaryType metadata = super.metadata(typeId); - - if (listeners != null) { - for (TestBinaryContextListener listener : listeners) - listener.onAfterMetadataRequest(typeId, metadata); - } - - return metadata; - } - - /** {@inheritDoc} */ - @Override public void updateMetadata(int typeId, BinaryMetadata meta, boolean failIfUnregistered) throws BinaryObjectException { - if (listeners != null) { - for (TestBinaryContextListener listener : listeners) - listener.onBeforeMetadataUpdate(typeId, meta); - } - - super.updateMetadata(typeId, meta, failIfUnregistered); - } - - /** */ - public interface TestBinaryContextListener { - /** - * @param typeId Type id. - * @param type Type. - */ - void onAfterMetadataRequest(int typeId, BinaryType type); - - /** - * @param typeId Type id. - * @param metadata Metadata. - */ - void onBeforeMetadataUpdate(int typeId, BinaryMetadata metadata); - } - - /** @param lsnr Listener. */ - public void addListener(TestBinaryContextListener lsnr) { - if (listeners == null) - listeners = new ArrayList<>(); - - if (!listeners.contains(lsnr)) - listeners.add(lsnr); - } - - /** */ - public void clearAllListener() { - if (listeners != null) - listeners.clear(); - } - } - /** */ public static final IgniteDataTransferObjectSerializer EMPTY_DTO_SERIALIZER = new IgniteDataTransferObjectSerializer() { /** {@inheritDoc} */ @@ -8136,4 +7743,68 @@ public static DiscoveryCustomMessage unwrapCustomMessage(DiscoverySpiCustomMessa return msg instanceof SecurityAwareCustomMessageWrapper ? ((SecurityAwareCustomMessageWrapper)msg).delegate() : (DiscoveryCustomMessage)msg; } + + /** + * Sets the received/sent bytes and per-session queue-size metric consumers on the given NIO server builder, + * creating the underlying metrics in the provided registry. + * + * @param builder NIO server builder. + * @param mreg Metric registry. + * @return The given builder for chaining. + */ + public static GridNioServer.Builder setNioServerMetrics(GridNioServer.Builder builder, MetricRegistryImpl mreg) { + return builder + .receivedBytesMetric(mreg.longAdderMetric( + GridNioServer.RECEIVED_BYTES_METRIC_NAME, GridNioServer.RECEIVED_BYTES_METRIC_DESC)::add) + .sentBytesMetric(mreg.longAdderMetric( + GridNioServer.SENT_BYTES_METRIC_NAME, GridNioServer.SENT_BYTES_METRIC_DESC)::add) + .outboundMessagesQueueSizeMetric(mreg.longAdderMetric( + GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME, + GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC)::add) + .maxMessagesQueueSizeMetric(mreg.maxValueMetric( + GridNioServer.MAX_MESSAGES_QUEUE_SIZE_METRIC_NAME, + GridNioServer.MAX_MESSAGES_QUEUE_SIZE_METRIC_DESC, 60_000, 5)::update); + } + + /** + * Registers the active TCP sessions count metric in the given registry, backed by the NIO server. + * + * @param srv NIO server. + * @param mreg Metric registry. + */ + public static void registerNioServerMetrics(GridNioServer srv, GridNioFilter[] filters, MetricRegistryImpl mreg) { + boolean sslEnabled = Arrays.stream(filters).anyMatch(filter -> filter instanceof GridNioSslFilter); + + mreg.register(GridNioServer.SSL_ENABLED_METRIC_NAME, () -> sslEnabled, "Whether SSL is enabled"); + mreg.register(GridNioServer.SESSIONS_CNT_METRIC_NAME, srv::activeTcpSessionsCount, "Active TCP sessions count."); + } + + /** + * Creates an SSL NIO filter, wiring its metrics from the given registry. + * + * @param sslCtx SSL context. + * @param directBuf Direct buffer flag. + * @param order Byte order. + * @param log Logger to use. + * @param mreg Optional metric registry; if {@code null}, the filter is created without metrics. + * @return SSL NIO filter. + */ + public static GridNioSslFilter sslFilter( + SSLContext sslCtx, + boolean directBuf, + ByteOrder order, + IgniteLogger log, + @Nullable MetricRegistryImpl mreg + ) { + LongConsumer handshakeDuration = mreg == null ? null : mreg.histogram( + GridNioSslFilter.SSL_HANDSHAKE_DURATION_HISTOGRAM_METRIC_NAME, + new long[] {250, 500, 1000}, + "SSL handshake duration in milliseconds.")::value; + + Runnable rejectedSesCnt = mreg == null ? null : mreg.intMetric( + GridNioSslFilter.SSL_REJECTED_SESSIONS_CNT_METRIC_NAME, + "TCP sessions count that were rejected due to SSL errors.")::increment; + + return new GridNioSslFilter(sslCtx, directBuf, order, log, handshakeDuration, rejectedSesCnt); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java index f4aeb18fd2882..3d0ce062f4f75 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/DistributedProcess.java @@ -24,7 +24,6 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; -import java.util.function.Function; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cluster.ClusterNode; @@ -97,7 +96,7 @@ public class DistributedProcess { public DistributedProcess( GridKernalContext ctx, DistributedProcessType type, - Function> exec, + BiFunction> exec, CI3, Map> finish ) { this(ctx, type, exec, finish, (id, req) -> new InitMessage<>(id, type, req, false)); @@ -113,7 +112,7 @@ public DistributedProcess( public DistributedProcess( GridKernalContext ctx, DistributedProcessType type, - Function> exec, + BiFunction> exec, CI3, Map> finish, BiFunction> initMsgFactory ) { @@ -150,7 +149,7 @@ public DistributedProcess( initCoordinator(p, topVer); try { - IgniteInternalFuture fut = exec.apply((I)msg.request()); + IgniteInternalFuture fut = exec.apply(msg.processId(), (I)msg.request()); fut.listen(() -> { if (fut.error() != null) @@ -499,6 +498,26 @@ public enum DistributedProcessType { /** * Snapshot partitions validation. */ - CHECK_SNAPSHOT_PARTS + CHECK_SNAPSHOT_PARTS, + + /** + * Cluster version Rolling Upgrade enable process. + */ + RU_ENABLE, + + /** + * Cluster version finalization prepare phase. + */ + RU_PREPARE_VERSION_FINALIZATION, + + /** + * Cluster version finalization complete phase. + */ + RU_COMPLETE_VERSION_FINALIZATION, + + /** + * Cluster version finalization abort process. + */ + RU_ABORT_VERSION_FINALIZATION, } } diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java index d5f834f90244e..e5aaa737c3445 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java @@ -27,239 +27,239 @@ @MXBeanDescription("MBean that provides access to aggregated cluster metrics.") public interface ClusterMetricsMXBean extends ClusterMetrics { /** {@inheritDoc} */ - @Override @MXBeanDescription("Last update time of this node metrics.") - public long getLastUpdateTime(); + @MXBeanDescription("Last update time of this node metrics.") + @Override public long getLastUpdateTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Maximum number of jobs that ever ran concurrently on this node.") - public int getMaximumActiveJobs(); + @MXBeanDescription("Maximum number of jobs that ever ran concurrently on this node.") + @Override public int getMaximumActiveJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Number of currently active jobs concurrently executing on the node.") - public int getCurrentActiveJobs(); + @MXBeanDescription("Number of currently active jobs concurrently executing on the node.") + @Override public int getCurrentActiveJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Average number of active jobs concurrently executing on the node.") - public float getAverageActiveJobs(); + @MXBeanDescription("Average number of active jobs concurrently executing on the node.") + @Override public float getAverageActiveJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Maximum number of waiting jobs this node had.") - public int getMaximumWaitingJobs(); + @MXBeanDescription("Maximum number of waiting jobs this node had.") + @Override public int getMaximumWaitingJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Number of queued jobs currently waiting to be executed.") - public int getCurrentWaitingJobs(); + @MXBeanDescription("Number of queued jobs currently waiting to be executed.") + @Override public int getCurrentWaitingJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Average number of waiting jobs this node had queued.") - public float getAverageWaitingJobs(); + @MXBeanDescription("Average number of waiting jobs this node had queued.") + @Override public float getAverageWaitingJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Maximum number of jobs rejected at once during a single collision resolution operation.") - public int getMaximumRejectedJobs(); + @MXBeanDescription("Maximum number of jobs rejected at once during a single collision resolution operation.") + @Override public int getMaximumRejectedJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Number of jobs rejected after more recent collision resolution operation.") - public int getCurrentRejectedJobs(); + @MXBeanDescription("Number of jobs rejected after more recent collision resolution operation.") + @Override public int getCurrentRejectedJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Average number of jobs this node rejects during collision resolution operations.") - public float getAverageRejectedJobs(); + @MXBeanDescription("Average number of jobs this node rejects during collision resolution operations.") + @Override public float getAverageRejectedJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription( + @MXBeanDescription( "Total number of jobs this node rejects during collision resolution operations since node startup.") - public int getTotalRejectedJobs(); + @Override public int getTotalRejectedJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Maximum number of cancelled jobs this node ever had running concurrently.") - public int getMaximumCancelledJobs(); + @MXBeanDescription("Maximum number of cancelled jobs this node ever had running concurrently.") + @Override public int getMaximumCancelledJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Number of cancelled jobs that are still running.") - public int getCurrentCancelledJobs(); + @MXBeanDescription("Number of cancelled jobs that are still running.") + @Override public int getCurrentCancelledJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Average number of cancelled jobs this node ever had running concurrently.") - public float getAverageCancelledJobs(); + @MXBeanDescription("Average number of cancelled jobs this node ever had running concurrently.") + @Override public float getAverageCancelledJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Total number of cancelled jobs since node startup.") - public int getTotalCancelledJobs(); + @MXBeanDescription("Total number of cancelled jobs since node startup.") + @Override public int getTotalCancelledJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Total number of jobs handled by the node.") - public int getTotalExecutedJobs(); + @MXBeanDescription("Total number of jobs handled by the node.") + @Override public int getTotalExecutedJobs(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Total time all finished jobs takes to execute on the node.") - public long getTotalJobsExecutionTime(); + @MXBeanDescription("Total time all finished jobs takes to execute on the node.") + @Override public long getTotalJobsExecutionTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Maximum time a job ever spent waiting in a queue to be executed.") - public long getMaximumJobWaitTime(); + @MXBeanDescription("Maximum time a job ever spent waiting in a queue to be executed.") + @Override public long getMaximumJobWaitTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Current wait time of oldest job.") - public long getCurrentJobWaitTime(); + @MXBeanDescription("Current wait time of oldest job.") + @Override public long getCurrentJobWaitTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Average time jobs spend waiting in the queue to be executed.") - public double getAverageJobWaitTime(); + @MXBeanDescription("Average time jobs spend waiting in the queue to be executed.") + @Override public double getAverageJobWaitTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Time it took to execute the longest job on the node.") - public long getMaximumJobExecuteTime(); + @MXBeanDescription("Time it took to execute the longest job on the node.") + @Override public long getMaximumJobExecuteTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Longest time a current job has been executing for.") - public long getCurrentJobExecuteTime(); + @MXBeanDescription("Longest time a current job has been executing for.") + @Override public long getCurrentJobExecuteTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Average time a job takes to execute on the node.") - public double getAverageJobExecuteTime(); + @MXBeanDescription("Average time a job takes to execute on the node.") + @Override public double getAverageJobExecuteTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Total number of tasks handled by the node.") - public int getTotalExecutedTasks(); + @MXBeanDescription("Total number of tasks handled by the node.") + @Override public int getTotalExecutedTasks(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Total time this node spent executing jobs.") - public long getTotalBusyTime(); + @MXBeanDescription("Total time this node spent executing jobs.") + @Override public long getTotalBusyTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Total time this node spent idling (not executing any jobs).") - public long getTotalIdleTime(); + @MXBeanDescription("Total time this node spent idling (not executing any jobs).") + @Override public long getTotalIdleTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Time this node spend idling since executing last job.") - public long getCurrentIdleTime(); + @MXBeanDescription("Time this node spend idling since executing last job.") + @Override public long getCurrentIdleTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Percentage of time this node is busy executing jobs vs. idling.") - public float getBusyTimePercentage(); + @MXBeanDescription("Percentage of time this node is busy executing jobs vs. idling.") + @Override public float getBusyTimePercentage(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Percentage of time this node is idling vs. executing jobs.") - public float getIdleTimePercentage(); + @MXBeanDescription("Percentage of time this node is idling vs. executing jobs.") + @Override public float getIdleTimePercentage(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The number of CPUs available to the Java Virtual Machine.") - public int getTotalCpus(); + @MXBeanDescription("The number of CPUs available to the Java Virtual Machine.") + @Override public int getTotalCpus(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The system load average; or a negative value if not available.") - public double getCurrentCpuLoad(); + @MXBeanDescription("The system load average; or a negative value if not available.") + @Override public double getCurrentCpuLoad(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Average of CPU load values over all metrics kept in the history.") - public double getAverageCpuLoad(); + @MXBeanDescription("Average of CPU load values over all metrics kept in the history.") + @Override public double getAverageCpuLoad(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Average time spent in GC since the last update.") - public double getCurrentGcCpuLoad(); + @MXBeanDescription("Average time spent in GC since the last update.") + @Override public double getCurrentGcCpuLoad(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The initial size of memory in bytes; -1 if undefined.") - public long getHeapMemoryInitialized(); + @MXBeanDescription("The initial size of memory in bytes; -1 if undefined.") + @Override public long getHeapMemoryInitialized(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Current heap size that is used for object allocation.") - public long getHeapMemoryUsed(); + @MXBeanDescription("Current heap size that is used for object allocation.") + @Override public long getHeapMemoryUsed(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The amount of committed memory in bytes.") - public long getHeapMemoryCommitted(); + @MXBeanDescription("The amount of committed memory in bytes.") + @Override public long getHeapMemoryCommitted(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The maximum amount of memory in bytes; -1 if undefined.") - public long getHeapMemoryMaximum(); + @MXBeanDescription("The maximum amount of memory in bytes; -1 if undefined.") + @Override public long getHeapMemoryMaximum(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The total amount of memory in bytes; -1 if undefined.") - public long getHeapMemoryTotal(); + @MXBeanDescription("The total amount of memory in bytes; -1 if undefined.") + @Override public long getHeapMemoryTotal(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The initial size of memory in bytes; -1 if undefined.") - public long getNonHeapMemoryInitialized(); + @MXBeanDescription("The initial size of memory in bytes; -1 if undefined.") + @Override public long getNonHeapMemoryInitialized(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Current non-heap memory size that is used by Java VM.") - public long getNonHeapMemoryUsed(); + @MXBeanDescription("Current non-heap memory size that is used by Java VM.") + @Override public long getNonHeapMemoryUsed(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Amount of non-heap memory in bytes that is committed for the JVM to use.") - public long getNonHeapMemoryCommitted(); + @MXBeanDescription("Amount of non-heap memory in bytes that is committed for the JVM to use.") + @Override public long getNonHeapMemoryCommitted(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Maximum amount of non-heap memory in bytes that can " + + @MXBeanDescription("Maximum amount of non-heap memory in bytes that can " + "be used for memory management. -1 if undefined.") - public long getNonHeapMemoryMaximum(); + @Override public long getNonHeapMemoryMaximum(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Total amount of non-heap memory in bytes that can " + + @MXBeanDescription("Total amount of non-heap memory in bytes that can " + "be used for memory management. -1 if undefined.") - public long getNonHeapMemoryTotal(); + @Override public long getNonHeapMemoryTotal(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Uptime of the JVM in milliseconds.") - public long getUpTime(); + @MXBeanDescription("Uptime of the JVM in milliseconds.") + @Override public long getUpTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Start time of the JVM in milliseconds.") - public long getStartTime(); + @MXBeanDescription("Start time of the JVM in milliseconds.") + @Override public long getStartTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Current number of live threads.") - public int getCurrentThreadCount(); + @MXBeanDescription("Current number of live threads.") + @Override public int getCurrentThreadCount(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The peak live thread count.") - public int getMaximumThreadCount(); + @MXBeanDescription("The peak live thread count.") + @Override public int getMaximumThreadCount(); /** {@inheritDoc} */ - @Override @MXBeanDescription("The total number of threads started.") - public long getTotalStartedThreadCount(); + @MXBeanDescription("The total number of threads started.") + @Override public long getTotalStartedThreadCount(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Current number of live daemon threads.") - public int getCurrentDaemonThreadCount(); + @MXBeanDescription("Current number of live daemon threads.") + @Override public int getCurrentDaemonThreadCount(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Last data version.") - public long getLastDataVersion(); + @MXBeanDescription("Last data version.") + @Override public long getLastDataVersion(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Sent messages count.") - public int getSentMessagesCount(); + @MXBeanDescription("Sent messages count.") + @Override public int getSentMessagesCount(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Sent bytes count.") - public long getSentBytesCount(); + @MXBeanDescription("Sent bytes count.") + @Override public long getSentBytesCount(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Received messages count.") - public int getReceivedMessagesCount(); + @MXBeanDescription("Received messages count.") + @Override public int getReceivedMessagesCount(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Received bytes count.") - public long getReceivedBytesCount(); + @MXBeanDescription("Received bytes count.") + @Override public long getReceivedBytesCount(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Outbound messages queue size.") - public int getOutboundMessagesQueueSize(); + @MXBeanDescription("Outbound messages queue size.") + @Override public int getOutboundMessagesQueueSize(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Start time of the grid node in milliseconds.") - public long getNodeStartTime(); + @MXBeanDescription("Start time of the grid node in milliseconds.") + @Override public long getNodeStartTime(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Total number of nodes.") - public int getTotalNodes(); + @MXBeanDescription("Total number of nodes.") + @Override public int getTotalNodes(); /** {@inheritDoc} */ - @Override @MXBeanDescription("Current PME duration in milliseconds.") - public long getCurrentPmeDuration(); + @MXBeanDescription("Current PME duration in milliseconds.") + @Override public long getCurrentPmeDuration(); /** * Get count of total baseline nodes. diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationMetricsListener.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationMetricsListener.java index 2fb542ceb8be2..4bf17f1a969fd 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationMetricsListener.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationMetricsListener.java @@ -44,6 +44,8 @@ import static java.util.stream.Collectors.toMap; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.SEPARATOR; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; +import static org.apache.ignite.internal.util.nio.GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC; +import static org.apache.ignite.internal.util.nio.GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME; import static org.apache.ignite.internal.util.nio.GridNioServer.RECEIVED_BYTES_METRIC_DESC; import static org.apache.ignite.internal.util.nio.GridNioServer.RECEIVED_BYTES_METRIC_NAME; import static org.apache.ignite.internal.util.nio.GridNioServer.SENT_BYTES_METRIC_DESC; @@ -105,6 +107,9 @@ public class TcpCommunicationMetricsListener { /** Received messages count metric. */ private final LongAdderMetric rcvdMsgsMetric; + /** Outbound messages queue size metric. */ + private final LongAdderMetric outboundMessagesQueueSizeMetric; + /** Counters of sent and received messages by direct type. */ private final IntMap> msgCntrsByType; @@ -146,6 +151,11 @@ public TcpCommunicationMetricsListener(Ignite ignite, IgniteSpiContext spiCtx) { sentMsgsMetric = mreg.longAdderMetric(SENT_MESSAGES_METRIC_NAME, SENT_MESSAGES_METRIC_DESC); rcvdMsgsMetric = mreg.longAdderMetric(RECEIVED_MESSAGES_METRIC_NAME, RECEIVED_MESSAGES_METRIC_DESC); + outboundMessagesQueueSizeMetric = mreg.longAdderMetric( + OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME, + OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC + ); + spiCtx.addMetricRegistryCreationListener(mreg -> { // Metrics for the specific nodes or other communication metrics. if (!TcpCommunicationSpi.isCommunicationMetrics(mreg.name())) @@ -276,6 +286,15 @@ public long receivedBytesCount() { return rcvdBytesMetric.value(); } + /** + * Gets outbound messages queue size. + * + * @return Outbound messages queue size. + */ + public int outboundMessagesQueueSize() { + return (int)outboundMessagesQueueSizeMetric.value(); + } + /** * Gets received messages counts (grouped by type). * diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java index 3078e20a0e9fc..216219cb5a6e5 100755 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java @@ -411,9 +411,10 @@ public static boolean isCommunicationMetrics(String metricName) { /** {@inheritDoc} */ @Override public int getOutboundMessagesQueueSize() { - GridNioServer srv = nioSrvWrapper.nio(); + if (metricsLsnr == null) + return 0; - return srv != null ? srv.outboundMessagesQueueSize() : 0; + return metricsLsnr.outboundMessagesQueueSize(); } /** {@inheritDoc} */ @@ -616,7 +617,7 @@ private void dumpInfo(StringBuilder sb, UUID dstNodeId) { ctxInitLatch, client, igniteExSupplier, - new CommunicationListener() { + new CommunicationListener<>() { @Override public void onMessage(UUID nodeId, Message msg, IgniteRunnable msgC) { notifyListener(nodeId, msg, msgC); } @@ -651,7 +652,7 @@ private void dumpInfo(StringBuilder sb, UUID dstNodeId) { getWorkersRegistry(ignite), ignite instanceof IgniteEx ? ((IgniteEx)ignite).context().metric() : null, this::createTcpClient, - new CommunicationListenerEx() { + new CommunicationListenerEx<>() { @Override public void onMessage(UUID nodeId, Message msg, IgniteRunnable msgC) { notifyListener(nodeId, msg, msgC); } @@ -1160,17 +1161,6 @@ public void simulateNodeFailure() { "]"; } - /** - * Concatenates the two parameter bytes to form a message type value. - * - * @param b0 The first byte. - * @param b1 The second byte. - * @return Message type. - */ - public static short makeMessageType(byte b0, byte b1) { - return (short)((b1 & 0xFF) << 8 | b0 & 0xFF); - } - /** * @param ignite Ignite. */ diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java index df7935c6c2f41..eb90f002a240f 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java @@ -56,6 +56,7 @@ import org.apache.ignite.internal.managers.GridManager; import org.apache.ignite.internal.managers.tracing.GridTracingManager; import org.apache.ignite.internal.processors.metric.GridMetricManager; +import org.apache.ignite.internal.processors.metric.MetricRegistryImpl; import org.apache.ignite.internal.processors.tracing.Tracing; import org.apache.ignite.internal.util.GridConcurrentFactory; import org.apache.ignite.internal.util.IgniteExceptionRegistry; @@ -909,7 +910,7 @@ private MessageFactory get() { filters.add(new GridConnectionBytesVerifyFilter(log)); if (stateProvider.isSslEnabled()) { - GridNioSslFilter sslFilter = new GridNioSslFilter( + GridNioSslFilter sslFilter = U.sslFilter( igniteCfg.getSslContextFactory().create(), true, ByteOrder.LITTLE_ENDIAN, @@ -924,6 +925,11 @@ private MessageFactory get() { filters.add(sslFilter); } + GridNioFilter[] filtersArr = filters.toArray(new GridNioFilter[filters.size()]); + + MetricRegistryImpl mreg = metricMgr != null ? + metricMgr.registry(COMMUNICATION_METRICS_GROUP_NAME) : null; + GridNioServer.Builder builder = GridNioServer.builder() .address(cfg.localHost()) .port(port) @@ -941,7 +947,7 @@ private MessageFactory get() { .directMode(true) .writeTimeout(cfg.socketWriteTimeout()) .selectorSpins(cfg.selectorSpins()) - .filters(filters.toArray(new GridNioFilter[filters.size()])) + .filters(filtersArr) .writerFactory(writerFactory) .skipRecoveryPredicate(skipRecoveryPred) .messageQueueSizeListener(queueSizeMonitor) @@ -949,13 +955,17 @@ private MessageFactory get() { .readWriteSelectorsAssign(cfg.usePairedConnections()) .messageFactory(msgFactory); - if (metricMgr != null) { - builder.workerListener(workersRegistry) - .metricRegistry(metricMgr.registry(COMMUNICATION_METRICS_GROUP_NAME)); + if (mreg != null) { + builder.workerListener(workersRegistry); + + U.setNioServerMetrics(builder, mreg); } GridNioServer srvr = builder.build(); + if (mreg != null) + U.registerNioServerMetrics(srvr, filtersArr, mreg); + cfg.boundTcpPort(port); // Ack Port the TCP server was bound to. diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/TcpHandshakeExecutor.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/TcpHandshakeExecutor.java index 7a609d2f7ebdf..612ef1418f257 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/TcpHandshakeExecutor.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/TcpHandshakeExecutor.java @@ -39,8 +39,8 @@ import org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessageSerializer; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.util.CommonUtils.makeMessageType; import static org.apache.ignite.plugin.extensions.communication.Message.DIRECT_TYPE_SIZE; -import static org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.makeMessageType; import static org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage.NEED_WAIT; /** diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/messages/RecoveryLastReceivedMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/messages/RecoveryLastReceivedMessage.java index 354635bc4a2a7..0405c570b00e3 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/messages/RecoveryLastReceivedMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/messages/RecoveryLastReceivedMessage.java @@ -18,7 +18,6 @@ package org.apache.ignite.spi.communication.tcp.messages; import org.apache.ignite.internal.Order; -import org.apache.ignite.internal.direct.stream.DirectByteBufferStream; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.plugin.extensions.communication.Message; @@ -41,7 +40,7 @@ public class RecoveryLastReceivedMessage implements Message { /** * Message body size in bytes. In worst case it uses 10 bytes for serialization. * - * @see DirectByteBufferStream#writeLong(long). + * @see org.apache.ignite.internal.direct.stream.DirectByteBufferStream#writeLong(long). */ private static final int MESSAGE_SIZE = 10; diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java index 58e41738265d6..a2f3af751afda 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java @@ -23,6 +23,7 @@ import java.util.Set; import java.util.UUID; import org.apache.ignite.internal.GridComponent; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.plugin.extensions.communication.Message; import org.jetbrains.annotations.Nullable; @@ -59,11 +60,17 @@ public interface GridDiscoveryData { /** @return ID fo the joining node. */ UUID joiningNodeId(); - /** @return Common for all cluster nodes discovery data that is sent to the joining node. */ - Serializable commonData(); + /** + * @param Data type. + * @return Common for all cluster nodes discovery data that is sent to the joining node. + */ + T commonData(); - /** @return Discovery data that is mapped to the particular cluster node and sent to the joining node. */ - Map nodeSpecificData(); + /** + * @param Data type. + * @return Discovery data that is mapped to the particular cluster node and sent to the joining node. + */ + Map nodeSpecificData(); } /** @@ -87,7 +94,7 @@ private final class JoiningNodeDiscoveryDataImpl implements JoiningNodeDiscovery @Override @Nullable public T joiningNodeData() { Message dataMsg = joiningNodeData.get(cmpId); - return dataMsg instanceof ObjectData ? ObjectData.unwrap(dataMsg) : (T)dataMsg; + return SerializableDataBagItemWrapper.unwrapIfNecessary(dataMsg); } /** @@ -106,7 +113,7 @@ private final class GridDiscoveryDataImpl implements GridDiscoveryData { private int cmpId; /** */ - private Map nodeSpecificData + private Map nodeSpecificData = new LinkedHashMap<>(DiscoveryDataBag.this.nodeSpecificData.size()); /** {@inheritDoc} */ @@ -115,16 +122,16 @@ private final class GridDiscoveryDataImpl implements GridDiscoveryData { } /** {@inheritDoc} */ - @Override @Nullable public Serializable commonData() { + @Override @Nullable public T commonData() { if (commonData != null) - return commonData.get(cmpId); + return SerializableDataBagItemWrapper.unwrapIfNecessary(commonData.get(cmpId)); return null; } /** {@inheritDoc} */ - @Override public Map nodeSpecificData() { - return nodeSpecificData; + @Override public Map nodeSpecificData() { + return F.viewReadOnly(nodeSpecificData, SerializableDataBagItemWrapper::unwrapIfNecessary); } /** @@ -142,7 +149,7 @@ private void componentId(int cmpId) { private void reinitNodeSpecData(int cmpId) { nodeSpecificData.clear(); - for (Map.Entry> e : DiscoveryDataBag.this.nodeSpecificData.entrySet()) { + for (Map.Entry> e : DiscoveryDataBag.this.nodeSpecificData.entrySet()) { if (e.getValue() != null && e.getValue().containsKey(cmpId)) nodeSpecificData.put(e.getKey(), e.getValue().get(cmpId)); } @@ -156,7 +163,7 @@ private void reinitNodeSpecData(int cmpId) { private static final UUID DEFAULT_KEY = null; /** */ - private UUID joiningNodeId; + private final UUID joiningNodeId; /** * Component IDs with already initialized common discovery data. @@ -164,13 +171,13 @@ private void reinitNodeSpecData(int cmpId) { private Set cmnDataInitializedCmps; /** */ - private Map joiningNodeData = new HashMap<>(); + private final Map joiningNodeData = new HashMap<>(); /** */ - private Map commonData = new HashMap<>(); + private final Map commonData = new HashMap<>(); /** */ - private Map> nodeSpecificData = new LinkedHashMap<>(); + private final Map> nodeSpecificData = new LinkedHashMap<>(); /** */ private JoiningNodeDiscoveryDataImpl newJoinerData; @@ -246,7 +253,7 @@ public JoiningNodeDiscoveryData newJoinerDiscoveryData(int cmpId) { * @param data Serializable data. */ public void addJoiningNodeData(Integer cmpId, Serializable data) { - joiningNodeData.put(cmpId, new ObjectData(data)); + joiningNodeData.put(cmpId, new SerializableDataBagItemWrapper(data)); } /** @@ -259,19 +266,35 @@ public void addJoiningNodeData(Integer cmpId, Message data) { /** * @param cmpId Component ID. - * @param data Data. + * @param data Serializable data. */ public void addGridCommonData(Integer cmpId, Serializable data) { + commonData.put(cmpId, new SerializableDataBagItemWrapper(data)); + } + + /** + * @param cmpId Component ID. + * @param data Message data. + */ + public void addGridCommonData(Integer cmpId, Message data) { commonData.put(cmpId, data); } /** * @param cmpId Component ID. - * @param data Data. + * @param data Serializable data. */ public void addNodeSpecificData(Integer cmpId, Serializable data) { + addNodeSpecificData(cmpId, new SerializableDataBagItemWrapper(data)); + } + + /** + * @param cmpId Component ID. + * @param data Message data. + */ + public void addNodeSpecificData(Integer cmpId, Message data) { if (!nodeSpecificData.containsKey(DEFAULT_KEY)) - nodeSpecificData.put(DEFAULT_KEY, new HashMap()); + nodeSpecificData.put(DEFAULT_KEY, new HashMap<>()); nodeSpecificData.get(DEFAULT_KEY).put(cmpId, data); } @@ -296,14 +319,14 @@ public void joiningNodeData(Map joinNodeData) { /** * @param cmnData Cmn data. */ - public void commonData(Map cmnData) { + public void commonData(Map cmnData) { commonData.putAll(cmnData); } /** * @param nodeSpecData Node specific data. */ - public void nodeSpecificData(Map> nodeSpecData) { + public void nodeSpecificData(Map> nodeSpecData) { nodeSpecificData.putAll(nodeSpecData); } @@ -316,12 +339,12 @@ public Map joiningNodeData() { * @return Discovery data for each Ignite component that is aggregated from the cluster nodes and sent to the * joining node. */ - public Map commonData() { + public Map commonData() { return commonData; } /** @return Discovery data that belongs to the current cluster node and is sent to the joining node. */ - @Nullable public Map localNodeSpecificData() { + @Nullable public Map localNodeSpecificData() { return nodeSpecificData.get(DEFAULT_KEY); } diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/ObjectData.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/SerializableDataBagItemWrapper.java similarity index 64% rename from modules/core/src/main/java/org/apache/ignite/spi/discovery/ObjectData.java rename to modules/core/src/main/java/org/apache/ignite/spi/discovery/SerializableDataBagItemWrapper.java index f9da59bffe415..7e3bc16ed43e1 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/ObjectData.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/SerializableDataBagItemWrapper.java @@ -29,8 +29,8 @@ import org.apache.ignite.plugin.extensions.communication.Message; import org.jetbrains.annotations.Nullable; -/** Wrapper message for serializable data. */ -public class ObjectData implements MarshallableMessage { +/** Wrapper message for serializable data in a {@link DiscoveryDataBag}. */ +public class SerializableDataBagItemWrapper implements MarshallableMessage { /** */ @GridToStringInclude private Serializable data; @@ -40,16 +40,41 @@ public class ObjectData implements MarshallableMessage { @Order(0) byte[] dataBytes; + /** Unmarshalling error. */ + IgniteCheckedException unmarshallError; + /** */ - public ObjectData() {} + public SerializableDataBagItemWrapper() {} /** * @param data Original data. */ - public ObjectData(Serializable data) { + public SerializableDataBagItemWrapper(Serializable data) { this.data = data; } + /** + * @param msg Message. + * @param Type of data. + * + * @return Original message or data unwrapped from an SerializableDataBagItemWrapper wrapper. + */ + static @Nullable T unwrapIfNecessary(@Nullable Message msg) { + if (msg == null) + return null; + + return msg instanceof SerializableDataBagItemWrapper ? ((SerializableDataBagItemWrapper)msg).unwrap() : (T)msg; + } + + /** + * @param Type of data. + * + * @return Original data unwrapped from a message. + */ + private T unwrap() { + return (T)(data); + } + /** {@inheritDoc} */ @Override public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { if (data != null) @@ -59,24 +84,24 @@ public ObjectData(Serializable data) { /** {@inheritDoc} */ @Override public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { if (dataBytes != null) { - data = U.unmarshal(marsh, dataBytes, clsLdr); + try { + data = U.unmarshal(marsh, dataBytes, clsLdr); - dataBytes = null; + dataBytes = null; + } + catch (IgniteCheckedException e) { + unmarshallError = e; + } } } - /** - * @param msg Message. - * @param Type of data. - * - * @return Original data unwrapped from a message. - */ - public static T unwrap(@Nullable Message msg) { - return msg != null ? (T)(((ObjectData)msg).data) : null; + /** @return Unmarshalling error. */ + public IgniteCheckedException unmarshallError() { + return unmarshallError; } /** {@inheritDoc} */ @Override public String toString() { - return S.toString(ObjectData.class, this); + return S.toString(SerializableDataBagItemWrapper.class, this); } } diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java index a0e1a20048786..86a4f190026d2 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java @@ -70,6 +70,7 @@ import org.apache.ignite.internal.processors.tracing.messages.SpanContainer; import org.apache.ignite.internal.processors.tracing.messages.TraceableMessage; import org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable; +import org.apache.ignite.internal.thread.context.Scope; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.F; @@ -1310,6 +1311,8 @@ private class SocketWriter extends IgniteSpiThread { * @param msg Message. */ private void sendMessage(TcpDiscoveryAbstractMessage msg) { + msg.opCtxMsg = operationCtxDispatcher.collectDistributedAttributes(); + synchronized (mux) { queue.add(msg); @@ -1757,251 +1760,255 @@ private MessageWorker(IgniteLogger log) { blockingSectionEnd(); } - if (msg instanceof JoinTimeout) { - int joinCnt0 = ((JoinTimeout)msg).joinCnt; + TcpDiscoveryAbstractMessage dm = msg instanceof TcpDiscoveryAbstractMessage + ? (TcpDiscoveryAbstractMessage)msg + : null; - if (joinCnt == joinCnt0) { - if (state == STARTING) { - joinError(new IgniteSpiException("Join process timed out, did not receive response for " + - "join request (consider increasing 'joinTimeout' configuration property) " + - "[joinTimeout=" + spi.joinTimeout + ", sock=" + currSock + ']')); + try (Scope ignored = operationCtxDispatcher.restoreDistributedAttributes(dm == null ? null : dm.opCtxMsg)) { + if (msg instanceof JoinTimeout) { + int joinCnt0 = ((JoinTimeout)msg).joinCnt; - break; - } - else if (state == DISCONNECTED) { - if (log.isDebugEnabled()) - log.debug("Failed to reconnect, local node segmented " + - "[joinTimeout=" + spi.joinTimeout + ']'); + if (joinCnt == joinCnt0) { + if (state == STARTING) { + joinError(new IgniteSpiException("Join process timed out, did not receive response for " + + "join request (consider increasing 'joinTimeout' configuration property) " + + "[joinTimeout=" + spi.joinTimeout + ", sock=" + currSock + ']')); + + break; + } + else if (state == DISCONNECTED) { + if (log.isDebugEnabled()) + log.debug("Failed to reconnect, local node segmented " + + "[joinTimeout=" + spi.joinTimeout + ']'); - state = SEGMENTED; + state = SEGMENTED; - notifyDiscovery( - EVT_NODE_SEGMENTED, topVer, locNode, allVisibleNodes(), null); + notifyDiscovery( + EVT_NODE_SEGMENTED, topVer, locNode, allVisibleNodes(), null); + } } } - } - else if (msg == SPI_STOP) { - boolean connected = state == CONNECTED; + else if (msg == SPI_STOP) { + boolean connected = state == CONNECTED; - state = STOPPED; + state = STOPPED; - assert spi.getSpiContext().isStopping(); + assert spi.getSpiContext().isStopping(); - if (connected && currSock != null) { - TcpDiscoveryNodeLeftMessage leftMsg = new TcpDiscoveryNodeLeftMessage(getLocalNodeId()); + if (connected && currSock != null) { + TcpDiscoveryNodeLeftMessage leftMsg = new TcpDiscoveryNodeLeftMessage(getLocalNodeId()); - leftMsg.client(true); + leftMsg.client(true); - Span rootSpan = tracing.create(TraceableMessagesTable.traceName(leftMsg.getClass())) - .addTag(SpanTags.tag(SpanTags.EVENT_NODE, SpanTags.ID), () -> locNode.id().toString()) - .addTag(SpanTags.tag(SpanTags.EVENT_NODE, SpanTags.CONSISTENT_ID), - () -> locNode.consistentId().toString()) - .addLog(() -> "Created"); + Span rootSpan = tracing.create(TraceableMessagesTable.traceName(leftMsg.getClass())) + .addTag(SpanTags.tag(SpanTags.EVENT_NODE, SpanTags.ID), () -> locNode.id().toString()) + .addTag(SpanTags.tag(SpanTags.EVENT_NODE, SpanTags.CONSISTENT_ID), + () -> locNode.consistentId().toString()) + .addLog(() -> "Created"); - leftMsg.spanContainer().serializedSpanBytes(tracing.serialize(rootSpan)); + leftMsg.spanContainer().serializedSpanBytes(tracing.serialize(rootSpan)); - sockWriter.sendMessage(leftMsg); + sockWriter.sendMessage(leftMsg); - rootSpan.addLog(() -> "Sent").end(); + rootSpan.addLog(() -> "Sent").end(); + } + else + leaveLatch.countDown(); } - else - leaveLatch.countDown(); - } - else if (msg == SPI_RECONNECT) { - if (state == CONNECTED) { - if (reconnector != null) { - reconnector.cancel(); - reconnector.join(); + else if (msg == SPI_RECONNECT) { + if (state == CONNECTED) { + if (reconnector != null) { + reconnector.cancel(); + reconnector.join(); - reconnector = null; - } + reconnector = null; + } - sockWriter.forceLeave(); - sockReader.forceStopRead(); + sockWriter.forceLeave(); + sockReader.forceStopRead(); - currSock = null; + currSock = null; - queue.clear(); + queue.clear(); - onDisconnected(); + onDisconnected(); - UUID newId = UUID.randomUUID(); + UUID newId = UUID.randomUUID(); - U.quietAndWarn(log, "Local node will try to reconnect to cluster with new id due " + - "to network problems [newId=" + newId + - ", prevId=" + locNode.id() + - ", locNode=" + locNode + ']'); + U.quietAndWarn(log, "Local node will try to reconnect to cluster with new id due " + + "to network problems [newId=" + newId + + ", prevId=" + locNode.id() + + ", locNode=" + locNode + ']'); - locNode.onClientDisconnected(newId); + locNode.onClientDisconnected(newId); - throttleClientReconnect(); + throttleClientReconnect(); - tryJoin(); + tryJoin(); + } } - } - else if (msg instanceof TcpDiscoveryNodeFailedMessage && - ((TcpDiscoveryNodeFailedMessage)msg).failedNodeId().equals(locNode.id())) { - TcpDiscoveryNodeFailedMessage msg0 = (TcpDiscoveryNodeFailedMessage)msg; + else if (msg instanceof TcpDiscoveryNodeFailedMessage && + ((TcpDiscoveryNodeFailedMessage)msg).failedNodeId().equals(locNode.id())) { + TcpDiscoveryNodeFailedMessage msg0 = (TcpDiscoveryNodeFailedMessage)msg; - assert msg0.force() : msg0; + assert msg0.force() : msg0; - forceFailMsg = msg0; - } - else if (msg instanceof SocketClosedMessage) { - if (((SocketClosedMessage)msg).sock == currSock) { - Socket sock = currSock.sock; + forceFailMsg = msg0; + } + else if (msg instanceof SocketClosedMessage) { + if (((SocketClosedMessage)msg).sock == currSock) { + Socket sock = currSock.sock; - InetSocketAddress prevAddr = new InetSocketAddress(sock.getInetAddress(), sock.getPort()); + InetSocketAddress prevAddr = new InetSocketAddress(sock.getInetAddress(), sock.getPort()); - currSock = null; + currSock = null; - boolean join = joinLatch.getCount() > 0; + boolean join = joinLatch.getCount() > 0; - if (spi.getSpiContext().isStopping() || state == SEGMENTED) { - leaveLatch.countDown(); + if (spi.getSpiContext().isStopping() || state == SEGMENTED) { + leaveLatch.countDown(); - if (join) { - joinError(new IgniteSpiException("Failed to connect to cluster: socket closed.")); + if (join) { + joinError(new IgniteSpiException("Failed to connect to cluster: socket closed.")); - break; - } - } - else { - if (forceFailMsg != null) { - if (log.isDebugEnabled()) { - log.debug("Connection closed, local node received force fail message, " + - "will not try to restore connection"); + break; } - - queue.addFirst(SPI_RECONNECT_FAILED); } else { - if (log.isDebugEnabled()) - log.debug("Connection closed, will try to restore connection."); + if (forceFailMsg != null) { + if (log.isDebugEnabled()) { + log.debug("Connection closed, local node received force fail message, " + + "will not try to restore connection"); + } - assert reconnector == null; + queue.addFirst(SPI_RECONNECT_FAILED); + } + else { + if (log.isDebugEnabled()) + log.debug("Connection closed, will try to restore connection."); + + assert reconnector == null; - reconnector = new Reconnector(join, prevAddr); - reconnector.start(); + reconnector = new Reconnector(join, prevAddr); + reconnector.start(); + } } } } - } - else if (msg == SPI_RECONNECT_FAILED) { - if (reconnector != null) { - reconnector.cancel(); - reconnector.join(); - - reconnector = null; - } - else - assert forceFailMsg != null; + else if (msg == SPI_RECONNECT_FAILED) { + if (reconnector != null) { + reconnector.cancel(); + reconnector.join(); - if (spi.isClientReconnectDisabled()) { - if (state != SEGMENTED && state != STOPPED) { - if (forceFailMsg != null) { - U.quietAndWarn(log, "Local node was dropped from cluster due to network problems " + - "[nodeInitiatedFail=" + forceFailMsg.creatorNodeId() + - ", msg=" + forceFailMsg.warning() + ']'); - } + reconnector = null; + } + else + assert forceFailMsg != null; + + if (spi.isClientReconnectDisabled()) { + if (state != SEGMENTED && state != STOPPED) { + if (forceFailMsg != null) { + U.quietAndWarn(log, "Local node was dropped from cluster due to network problems " + + "[nodeInitiatedFail=" + forceFailMsg.creatorNodeId() + + ", msg=" + forceFailMsg.warning() + ']'); + } - if (log.isDebugEnabled()) { - log.debug("Failed to restore closed connection, reconnect disabled, " + - "local node segmented [networkTimeout=" + spi.netTimeout + ']'); - } + if (log.isDebugEnabled()) { + log.debug("Failed to restore closed connection, reconnect disabled, " + + "local node segmented [networkTimeout=" + spi.netTimeout + ']'); + } - state = SEGMENTED; + state = SEGMENTED; - notifyDiscovery( - EVT_NODE_SEGMENTED, topVer, locNode, allVisibleNodes(), null); - } - } - else { - if (state == STARTING || state == CONNECTED) { - if (log.isDebugEnabled()) { - log.debug("Failed to restore closed connection, will try to reconnect " + - "[networkTimeout=" + spi.netTimeout + - ", joinTimeout=" + spi.joinTimeout + - ", failMsg=" + forceFailMsg + ']'); + notifyDiscovery( + EVT_NODE_SEGMENTED, topVer, locNode, allVisibleNodes(), null); } - - onDisconnected(); } + else { + if (state == STARTING || state == CONNECTED) { + if (log.isDebugEnabled()) { + log.debug("Failed to restore closed connection, will try to reconnect " + + "[networkTimeout=" + spi.netTimeout + + ", joinTimeout=" + spi.joinTimeout + + ", failMsg=" + forceFailMsg + ']'); + } - UUID newId = UUID.randomUUID(); + onDisconnected(); + } - if (forceFailMsg != null) { - long delay = IgniteSystemProperties.getLong(IGNITE_DISCO_FAILED_CLIENT_RECONNECT_DELAY, - DFLT_DISCO_FAILED_CLIENT_RECONNECT_DELAY); + UUID newId = UUID.randomUUID(); - if (delay > 0) { - U.quietAndWarn(log, "Local node was dropped from cluster due to network problems, " + - "will try to reconnect with new id after " + delay + "ms (reconnect delay " + - "can be changed using IGNITE_DISCO_FAILED_CLIENT_RECONNECT_DELAY system " + - "property) [" + - "newId=" + newId + - ", prevId=" + locNode.id() + - ", locNode=" + locNode + - ", nodeInitiatedFail=" + forceFailMsg.creatorNodeId() + - ", msg=" + forceFailMsg.warning() + ']'); + if (forceFailMsg != null) { + long delay = IgniteSystemProperties.getLong(IGNITE_DISCO_FAILED_CLIENT_RECONNECT_DELAY, + DFLT_DISCO_FAILED_CLIENT_RECONNECT_DELAY); + + if (delay > 0) { + U.quietAndWarn(log, "Local node was dropped from cluster due to network problems, " + + "will try to reconnect with new id after " + delay + "ms (reconnect delay " + + "can be changed using IGNITE_DISCO_FAILED_CLIENT_RECONNECT_DELAY system " + + "property) [" + + "newId=" + newId + + ", prevId=" + locNode.id() + + ", locNode=" + locNode + + ", nodeInitiatedFail=" + forceFailMsg.creatorNodeId() + + ", msg=" + forceFailMsg.warning() + ']'); + + Thread.sleep(delay); + } + else { + U.quietAndWarn(log, "Local node was dropped from cluster due to network problems, " + + "will try to reconnect with new id [" + + "newId=" + newId + + ", prevId=" + locNode.id() + + ", locNode=" + locNode + + ", nodeInitiatedFail=" + forceFailMsg.creatorNodeId() + + ", msg=" + forceFailMsg.warning() + ']'); + } - Thread.sleep(delay); + forceFailMsg = null; } - else { - U.quietAndWarn(log, "Local node was dropped from cluster due to network problems, " + - "will try to reconnect with new id [" + - "newId=" + newId + - ", prevId=" + locNode.id() + - ", locNode=" + locNode + - ", nodeInitiatedFail=" + forceFailMsg.creatorNodeId() + - ", msg=" + forceFailMsg.warning() + ']'); + else if (log.isInfoEnabled()) { + log.info("Client node disconnected from cluster, will try to reconnect with new id " + + "[newId=" + newId + ", prevId=" + locNode.id() + ", locNode=" + locNode + ']'); } - forceFailMsg = null; - } - else if (log.isInfoEnabled()) { - log.info("Client node disconnected from cluster, will try to reconnect with new id " + - "[newId=" + newId + ", prevId=" + locNode.id() + ", locNode=" + locNode + ']'); - } + locNode.onClientDisconnected(newId); - locNode.onClientDisconnected(newId); - - tryJoin(); + tryJoin(); + } } - } - else { - TcpDiscoveryAbstractMessage discoMsg = (TcpDiscoveryAbstractMessage)msg; - - if (joining()) { - IgniteSpiException err = null; + else { + if (joining()) { + IgniteSpiException err = null; - if (discoMsg instanceof TcpDiscoveryDuplicateIdMessage) - err = spi.duplicateIdError((TcpDiscoveryDuplicateIdMessage)msg); - else if (discoMsg instanceof TcpDiscoveryAuthFailedMessage) - err = spi.authenticationFailedError((TcpDiscoveryAuthFailedMessage)msg); - //TODO: https://issues.apache.org/jira/browse/IGNITE-9829 - else if (discoMsg instanceof TcpDiscoveryCheckFailedMessage) - err = spi.checkFailedError((TcpDiscoveryCheckFailedMessage)msg); + if (dm instanceof TcpDiscoveryDuplicateIdMessage) + err = spi.duplicateIdError((TcpDiscoveryDuplicateIdMessage)msg); + else if (dm instanceof TcpDiscoveryAuthFailedMessage) + err = spi.authenticationFailedError((TcpDiscoveryAuthFailedMessage)msg); + //TODO: https://issues.apache.org/jira/browse/IGNITE-9829 + else if (dm instanceof TcpDiscoveryCheckFailedMessage) + err = spi.checkFailedError((TcpDiscoveryCheckFailedMessage)msg); - if (err != null) { - if (state == DISCONNECTED) { - U.error(log, "Failed to reconnect, segment local node.", err); + if (err != null) { + if (state == DISCONNECTED) { + U.error(log, "Failed to reconnect, segment local node.", err); - state = SEGMENTED; + state = SEGMENTED; - notifyDiscovery( - EVT_NODE_SEGMENTED, topVer, locNode, allVisibleNodes(), null); - } - else - joinError(err); + notifyDiscovery( + EVT_NODE_SEGMENTED, topVer, locNode, allVisibleNodes(), null); + } + else + joinError(err); - cancel(); + cancel(); - break; + break; + } } - } - processDiscoveryMessage((TcpDiscoveryAbstractMessage)msg); + processDiscoveryMessage(dm); + } } } } diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java index 82c012c2a1a94..c95bba54b6c14 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java @@ -95,6 +95,7 @@ import org.apache.ignite.internal.processors.tracing.messages.SpanContainer; import org.apache.ignite.internal.processors.tracing.messages.TraceableMessage; import org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable; +import org.apache.ignite.internal.thread.context.Scope; import org.apache.ignite.internal.thread.pool.IgniteThreadPoolExecutor; import org.apache.ignite.internal.util.GridBoundedLinkedHashSet; import org.apache.ignite.internal.util.GridConcurrentHashSet; @@ -2581,36 +2582,6 @@ void add(TcpDiscoveryAbstractMessage msg) { if (addedMsg.gridDiscoveryData() != null) addedMsg.clearDiscoveryData(); } - else if (msg instanceof TcpDiscoveryNodeAddFinishedMessage) { - TcpDiscoveryNodeAddFinishedMessage addFinishMsg = (TcpDiscoveryNodeAddFinishedMessage)msg; - - if (addFinishMsg.clientDiscoData() != null) { - addFinishMsg = new TcpDiscoveryNodeAddFinishedMessage(addFinishMsg); - - msg = addFinishMsg; - - DiscoveryDataPacket discoData = addFinishMsg.clientDiscoData(); - - Set mrgdCmnData = new HashSet<>(); - Set mrgdSpecData = new HashSet<>(); - - boolean allMerged = false; - - for (TcpDiscoveryAbstractMessage msg0 : msgs) { - - if (msg0 instanceof TcpDiscoveryNodeAddFinishedMessage) { - DiscoveryDataPacket existingDiscoData = - ((TcpDiscoveryNodeAddFinishedMessage)msg0).clientDiscoData(); - - if (existingDiscoData != null) - allMerged = discoData.mergeDataFrom(existingDiscoData, mrgdCmnData, mrgdSpecData); - } - - if (allMerged) - break; - } - } - } else if (msg instanceof TcpDiscoveryNodeLeftMessage) clearClientAddFinished(msg.creatorNodeId()); else if (msg instanceof TcpDiscoveryNodeFailedMessage) @@ -2978,11 +2949,14 @@ protected class RingMessageWorker extends MessageWorker notifiedDiscovery = ThreadLocal.withInitial(() -> false); - /** - * @param log Logger. - */ - protected RingMessageWorker(IgniteLogger log) { - super("tcp-disco-msg-worker-[]", log, 10, getWorkerRegistry(spi)); + /** */ + RingMessageWorker(IgniteLogger log) { + this(log, new LinkedBlockingDeque<>()); + } + + /** */ + protected RingMessageWorker(IgniteLogger log, BlockingDeque queue) { + super("tcp-disco-msg-worker-[]", log, 10, getWorkerRegistry(spi), queue); setBeforeEachPollAction(() -> { updateHeartbeat(); @@ -3046,8 +3020,10 @@ void addMessage(TcpDiscoveryAbstractMessage msg, boolean ignoreHighPriority, boo return; } - if (msg instanceof TraceableMessage) { - TraceableMessage tMsg = (TraceableMessage)msg; + if (!fromSocket) + msg.opCtxMsg = operationCtxDispatcher.collectDistributedAttributes(); + + if (msg instanceof TraceableMessage tMsg) { // If we read this message from socket. if (fromSocket) @@ -3173,11 +3149,8 @@ protected void runTasks() { task.run(); } - /** {@inheritDoc} */ - @Override protected void processMessage(TcpDiscoveryAbstractMessage msg) { - if (msg == WAKEUP) - return; - + /** */ + private void processMessage0(TcpDiscoveryAbstractMessage msg) { notifiedDiscovery.set(false); if (msg instanceof TraceableMessage) { @@ -3315,6 +3288,16 @@ else if (msg instanceof TcpDiscoveryAuthFailedMessage) } } + /** {@inheritDoc} */ + @Override protected void processMessage(TcpDiscoveryAbstractMessage msg) { + if (msg == WAKEUP) + return; + + try (Scope ignored = operationCtxDispatcher.restoreDistributedAttributes(msg.opCtxMsg)) { + processMessage0(msg); + } + } + /** * Processes authentication failed message. * @@ -4768,9 +4751,17 @@ private IgniteNodeValidationResult validateByIgniteComponents(TcpDiscoveryJoinRe /** */ private IgniteNodeValidationResult validateByIgniteComponentsWithJoiningNodeData(TcpDiscoveryJoinRequestMessage req) { - DiscoveryDataBag data = req.gridDiscoveryData().bagWithJoiningNodeData(); + DiscoveryDataPacket packet = req.gridDiscoveryData(); - return spi.getSpiContext().validateNode(req.node(), data); + try { + DiscoveryDataBag dataBag = packet.bagWithJoiningNodeData(spi.ignite().log(), + spi.ignite().configuration().isClientMode()); + + return spi.getSpiContext().validateNode(req.node(), dataBag); + } + catch (IgniteCheckedException e) { + return new IgniteNodeValidationResult(req.node().id(), e.getMessage()); + } } /** */ @@ -7787,9 +7778,15 @@ private class ClientMessageWorker extends MessageWorker() + ); this.sock = sock; this.clientNodeId = clientNodeId; @@ -8116,7 +8113,7 @@ private MessageWorkerThread(W worker, IgniteLogger log) { */ private abstract class MessageWorker extends GridWorker { /** Message queue. */ - protected final BlockingDeque queue = new LinkedBlockingDeque<>(); + protected final BlockingDeque queue; /** Polling timeout. */ private final long pollingTimeout; @@ -8129,15 +8126,18 @@ private abstract class MessageWorker extends GridWorker { * @param log Logger. * @param pollingTimeout Messages polling timeout. * @param lsnr Listener for life-cycle events. + * @param queue The queue used for holding messages and handing off to worker thread. */ protected MessageWorker( String name, IgniteLogger log, long pollingTimeout, - @Nullable GridWorkerListener lsnr + @Nullable GridWorkerListener lsnr, + BlockingDeque queue ) { super(spi.ignite().name(), name, log, lsnr); + this.queue = queue; this.pollingTimeout = pollingTimeout; } diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java index 789f3d0adb107..25ad69c147fea 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java @@ -43,6 +43,7 @@ import org.apache.ignite.internal.processors.cluster.NodeMetricsMessage; import org.apache.ignite.internal.processors.tracing.NoopTracing; import org.apache.ignite.internal.processors.tracing.Tracing; +import org.apache.ignite.internal.thread.context.OperationContextDispatcher; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.LT; import org.apache.ignite.internal.util.typedef.internal.U; @@ -139,6 +140,9 @@ abstract class TcpDiscoveryImpl { /** Tracing. */ protected Tracing tracing; + /** Distributed operation context dispatcher. */ + protected final OperationContextDispatcher operationCtxDispatcher; + /** * @param spi Adapter. */ @@ -151,6 +155,8 @@ abstract class TcpDiscoveryImpl { tracing = ((IgniteEx)spi.ignite()).context().tracing(); else tracing = new NoopTracing(); + + operationCtxDispatcher = ((IgniteEx)spi.ignite()).context().operationContextDispatcher(); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryIoSession.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryIoSession.java index b8fc471493069..d054080e4c648 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryIoSession.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryIoSession.java @@ -35,6 +35,7 @@ import org.apache.ignite.internal.direct.DirectMessageReader; import org.apache.ignite.internal.direct.DirectMessageWriter; import org.apache.ignite.internal.managers.communication.UnknownMessageException; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.marshaller.jdk.JdkMarshaller; @@ -44,8 +45,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.makeMessageType; - /** * Handles I/O operations between discovery nodes in the cluster. This class encapsulates the socket connection used * by the {@link TcpDiscoverySpi} to exchange discovery protocol messages between nodes. @@ -150,7 +149,7 @@ T readMessage() throws IgniteCheckedException, IOException { byte b0 = (byte)in.read(); byte b1 = (byte)in.read(); - short msgType = makeMessageType(b0, b1); + short msgType = CommonUtils.makeMessageType(b0, b1); Message msg; diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java index a7f68fb1cf542..5594e77395b5c 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java @@ -445,7 +445,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements IgniteDiscovery protected IgniteLogger log; /** */ - protected TcpDiscoveryImpl impl; + TcpDiscoveryImpl impl; /** */ private boolean clientReconnectDisabled; @@ -2068,21 +2068,14 @@ DiscoveryDataPacket collectExchangeData(DiscoveryDataPacket dataPacket) { assert dataPacket != null; assert dataPacket.joiningNodeId() != null; - //create data bag, pass it to exchange.collect DiscoveryDataBag dataBag = dataPacket.bagForDataCollection(); exchange.collect(dataBag); - //marshall collected bag into packet, return packet if (dataPacket.joiningNodeId().equals(locNode.id())) dataPacket.addJoiningNodeData(dataBag); else - dataPacket.marshalGridNodeData( - dataBag, - locNode.id(), - marshaller(), - ignite.configuration().getNetworkCompressionLevel(), - log); + dataPacket.addNodeData(dataBag, locNode.id()); return dataPacket; } @@ -2097,22 +2090,21 @@ protected void onExchange(DiscoveryDataPacket dataPacket, ClassLoader clsLdr) { DiscoveryDataBag dataBag; - if (dataPacket.joiningNodeId().equals(locNode.id())) { - try { - dataBag = dataPacket.unmarshalGridData(marshaller(), clsLdr, locNode.clientRouterNodeId() != null, log); - } - catch (IgniteCheckedException e) { - if (ignite() instanceof IgniteEx) { - FailureProcessor failure = ((IgniteEx)ignite()).context().failure(); - - failure.process(new FailureContext(CRITICAL_ERROR, e)); - } + try { + if (dataPacket.joiningNodeId().equals(locNode.id())) + dataBag = dataPacket.bagWithNodeData(ignite.log(), ignite.configuration().isClientMode()); + else + dataBag = dataPacket.bagWithJoiningNodeData(ignite.log(), ignite.configuration().isClientMode()); + } + catch (IgniteCheckedException e) { + if (ignite() instanceof IgniteEx) { + FailureProcessor failure = ((IgniteEx)ignite()).context().failure(); - throw new IgniteException(e); + failure.process(new FailureContext(CRITICAL_ERROR, e)); } + + throw new IgniteException(e); } - else - dataBag = dataPacket.bagWithJoiningNodeData(); exchange.onExchange(dataBag); } @@ -2126,10 +2118,8 @@ protected void onExchange(DiscoveryDataPacket dataPacket, ClassLoader clsLdr) { impl.spiStart(igniteInstanceName); } - /** - * - */ - protected void initializeImpl() { + /** */ + private void initializeImpl() { if (impl != null) return; @@ -2155,7 +2145,7 @@ protected void initializeImpl() { if (sockTimeout == 0) sockTimeout = DFLT_SOCK_TIMEOUT; - impl = new ServerImpl(this, DFLT_UTLITY_POOL_SIZE, DFLT_RMT_DC_PING_POOL_SIZE); + impl = createServerTcpDiscoveryImplementation(); } metricsUpdateFreq = ignite.configuration().getMetricsUpdateFrequency(); @@ -2238,6 +2228,11 @@ protected void initializeImpl() { cfgNodeId = ignite.configuration().getNodeId(); } + /** */ + TcpDiscoveryImpl createServerTcpDiscoveryImplementation() { + return new ServerImpl(this, DFLT_UTLITY_POOL_SIZE, DFLT_RMT_DC_PING_POOL_SIZE); + } + /** {@inheritDoc} */ @Override public void spiStop() throws IgniteSpiException { if (ctxInitLatch.getCount() > 0) diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/DiscoveryDataPacket.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/DiscoveryDataPacket.java index 4ded165df7082..cd1e8c10da3d3 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/DiscoveryDataPacket.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/DiscoveryDataPacket.java @@ -16,9 +16,6 @@ */ package org.apache.ignite.spi.discovery.tcp.internal; -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -31,23 +28,19 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.internal.U; -import org.apache.ignite.marshaller.Marshaller; import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.spi.discovery.DiscoveryDataBag; +import org.apache.ignite.spi.discovery.SerializableDataBagItemWrapper; +import org.jetbrains.annotations.Nullable; +import static java.lang.Boolean.TRUE; import static org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.CONTINUOUS_PROC; /** - * Carries discovery data in marshalled form + * Carries discovery data in form of {@link Message} * and allows convenient way of converting it to and from {@link DiscoveryDataBag} objects. */ -public class DiscoveryDataPacket implements Serializable, Message { - /** Local file header signature (read as a little-endian number). */ - private static final int ZIP_HEADER_SIGNATURE = 0x04034b50; - - /** */ - private static final long serialVersionUID = 0L; - +public class DiscoveryDataPacket implements Message { /** */ @Order(0) UUID joiningNodeId; @@ -59,14 +52,19 @@ public class DiscoveryDataPacket implements Serializable, Message { /** */ @Order(2) - Map commonData = new HashMap<>(); + @Compress + Map commonData = new HashMap<>(); /** */ @Order(3) - Map> nodeSpecificData = new HashMap<>(); + @Compress + Map> nodeSpecificData = new HashMap<>(); /** */ - private transient boolean joiningNodeClient; + private boolean joiningNodeClient; + + /** Unmarshalling error, if any. */ + private IgniteCheckedException unmarshErr; /** Constructor. */ public DiscoveryDataPacket() { @@ -90,25 +88,15 @@ public UUID joiningNodeId() { /** * @param bag Bag. * @param nodeId Node id. - * @param marsh Marsh. - * @param log Logger. */ - public void marshalGridNodeData(DiscoveryDataBag bag, UUID nodeId, Marshaller marsh, - int compressionLevel, IgniteLogger log) { - marshalData(bag.commonData(), commonData, marsh, compressionLevel, log); - - Map locNodeSpecificData = bag.localNodeSpecificData(); - - if (locNodeSpecificData != null) { - Map marshLocNodeSpecificData = U.newHashMap(locNodeSpecificData.size()); - - marshalData(locNodeSpecificData, marshLocNodeSpecificData, marsh, compressionLevel, log); + public void addNodeData(DiscoveryDataBag bag, UUID nodeId) { + if (bag.commonData() != null) + commonData.putAll(bag.commonData()); - filterDuplicatedData(marshLocNodeSpecificData); + Map locNodeSpecificData = bag.localNodeSpecificData(); - if (!marshLocNodeSpecificData.isEmpty()) - nodeSpecificData.put(nodeId, marshLocNodeSpecificData); - } + if (!F.isEmpty(locNodeSpecificData)) + nodeSpecificData.put(nodeId, locNodeSpecificData); } /** @@ -120,47 +108,34 @@ public void addJoiningNodeData(DiscoveryDataBag bag) { } /** - * @param marsh Marsh. - * @param clsLdr Class loader. - * @param clientNode Client node. - * @param log Logger. + * @param log Ignite logger. + * @param client Client mode flag. + * + * @return Data bag with node data. */ - public DiscoveryDataBag unmarshalGridData( - Marshaller marsh, - ClassLoader clsLdr, - boolean clientNode, - IgniteLogger log - ) throws IgniteCheckedException { - DiscoveryDataBag dataBag = new DiscoveryDataBag(joiningNodeId, joiningNodeClient); - - if (commonData != null && !commonData.isEmpty()) - dataBag.commonData(unmarshalData(commonData, marsh, clsLdr, clientNode, log, true)); - - if (nodeSpecificData != null && !nodeSpecificData.isEmpty()) { - Map> unmarshNodeSpecData = U.newLinkedHashMap(nodeSpecificData.size()); + public DiscoveryDataBag bagWithNodeData(IgniteLogger log, Boolean client) throws IgniteCheckedException { + checkUnmarshallingErrors(log, client); - for (Map.Entry> nodeBinEntry : nodeSpecificData.entrySet()) { - Map nodeBinData = nodeBinEntry.getValue(); - - if (nodeBinData == null || nodeBinData.isEmpty()) - continue; + DiscoveryDataBag dataBag = new DiscoveryDataBag(joiningNodeId, joiningNodeClient); - unmarshNodeSpecData.put( - nodeBinEntry.getKey(), - unmarshalData(nodeBinData, marsh, clsLdr, clientNode, log, true) - ); - } + if (!F.isEmpty(commonData)) + dataBag.commonData(commonData); - dataBag.nodeSpecificData(unmarshNodeSpecData); - } + if (!F.isEmpty(nodeSpecificData)) + dataBag.nodeSpecificData(nodeSpecificData); return dataBag; } /** + * @param log Ignite logger. + * @param client Client mode flag. + * * @return Data bag with joining node data. */ - public DiscoveryDataBag bagWithJoiningNodeData() { + public DiscoveryDataBag bagWithJoiningNodeData(IgniteLogger log, @Nullable Boolean client) throws IgniteCheckedException { + checkUnmarshallingErrors(log, client); + DiscoveryDataBag dataBag = new DiscoveryDataBag(joiningNodeId, joiningNodeClient); if (!F.isEmpty(joiningNodeData)) @@ -184,199 +159,68 @@ public boolean hasDataFromNode(UUID nodeId) { } /** - * @param existingDataPacket Existing data packet. - * @param mrgdCmnDataKeys Mrgd cmn data keys. - * @param mrgdSpecifDataKeys Mrgd specif data keys. + * Dumps and throws caught unmarshalling errors. + * + * @param log Ignite logger. + * @param client Client mode flag. + * @throws IgniteCheckedException If unmarshalling errors occurs. */ - public boolean mergeDataFrom( - DiscoveryDataPacket existingDataPacket, - Collection mrgdCmnDataKeys, - Collection mrgdSpecifDataKeys - ) { - if (commonData.size() != mrgdCmnDataKeys.size()) { - for (Map.Entry e : commonData.entrySet()) { - if (!mrgdCmnDataKeys.contains(e.getKey())) { - byte[] data = existingDataPacket.commonData.get(e.getKey()); - - if (data != null && Arrays.equals(e.getValue(), data)) { - e.setValue(data); - - boolean add = mrgdCmnDataKeys.add(e.getKey()); + public void checkUnmarshallingErrors(IgniteLogger log, @Nullable Boolean client) + throws IgniteCheckedException { + if (unmarshErr != null) + throw unmarshErr; - assert add; + Iterator> dataIter = compoundDataIterator(); - if (mrgdCmnDataKeys.size() == commonData.size()) - break; - } - } - } - } + IgniteCheckedException err = null; - if (nodeSpecificData.size() != mrgdSpecifDataKeys.size()) { - for (Map.Entry> e : nodeSpecificData.entrySet()) { - if (!mrgdSpecifDataKeys.contains(e.getKey())) { - Map data = existingDataPacket.nodeSpecificData.get(e.getKey()); + while (dataIter.hasNext()) { + Map.Entry item = dataIter.next(); - if (data != null && mapsEqual(e.getValue(), data)) { - e.setValue(data); + if (item.getValue() instanceof SerializableDataBagItemWrapper wrapper) { + int cmpId = item.getKey(); - boolean add = mrgdSpecifDataKeys.add(e.getKey()); + IgniteCheckedException e = wrapper.unmarshallError(); - assert add; + if (e != null) { + if (CONTINUOUS_PROC.ordinal() == cmpId && X.hasCause(e, ClassNotFoundException.class) && TRUE.equals(client)) { + U.warn(log, "Failed to unmarshal continuous query remote filter on client node. " + + "Can be ignored."); - if (mrgdSpecifDataKeys.size() == nodeSpecificData.size()) - break; + continue; + } + else if (cmpId < GridComponent.DiscoveryDataExchangeType.VALUES.length) { + U.error(log, "Failed to unmarshal discovery data for component: " + + GridComponent.DiscoveryDataExchangeType.VALUES[cmpId], e); + } + else { + U.warn(log, "Failed to unmarshal discovery data." + + " Component " + cmpId + " is not found.", e); } - } - } - } - - return (mrgdCmnDataKeys.size() == commonData.size()) && (mrgdSpecifDataKeys.size() == nodeSpecificData.size()); - } - - /** - * @param m1 first map to compare. - * @param m2 second map to compare. - */ - private boolean mapsEqual(Map m1, Map m2) { - if (m1 == m2) - return true; - - if (m1.size() == m2.size()) { - for (Map.Entry e : m1.entrySet()) { - byte[] data = m2.get(e.getKey()); - - if (!Arrays.equals(e.getValue(), data)) - return false; - } - - return true; - } - - return false; - } - - /** - * @param src Source. - * @param marsh Marsh. - * @param clsLdr Class loader. - * @param clientNode Client node. - * @param log Logger. - * @param panic Throw unmarshalling if {@code true}. - * @throws IgniteCheckedException If {@code panic} is {@code True} and unmarshalling failed. - */ - private Map unmarshalData( - Map src, - Marshaller marsh, - ClassLoader clsLdr, - boolean clientNode, - IgniteLogger log, - boolean panic - ) throws IgniteCheckedException { - Map res = U.newHashMap(src.size()); - - for (Map.Entry binEntry : src.entrySet()) { - try { - Serializable compData = isZipped(binEntry.getValue()) ? - U.unmarshalZip(marsh, binEntry.getValue(), clsLdr) : - U.unmarshal(marsh, binEntry.getValue(), clsLdr); - res.put(binEntry.getKey(), compData); - } - catch (IgniteCheckedException e) { - if (CONTINUOUS_PROC.ordinal() == binEntry.getKey() && - X.hasCause(e, ClassNotFoundException.class) && clientNode - ) { - U.warn(log, "Failed to unmarshal continuous query remote filter on client node. Can be ignored."); - continue; - } - else if (binEntry.getKey() < GridComponent.DiscoveryDataExchangeType.VALUES.length) { - U.error(log, - "Failed to unmarshal discovery data for component: " + - GridComponent.DiscoveryDataExchangeType.VALUES[binEntry.getKey()], - e - ); - } - else { - U.warn(log, "Failed to unmarshal discovery data." + - " Component " + binEntry.getKey() + " is not found."); + if (err == null) + err = e; + else + err.addSuppressed(e); } - - if (panic) - throw e; } } - return res; - } - - /** - * @param val Value to check. - * @return {@code true} if value is zipped. - */ - private boolean isZipped(byte[] val) { - return val != null && val.length > 3 && makeInt(val) == ZIP_HEADER_SIGNATURE; - } - - /** - * Make int from first 4 bytes in little-endian byte order. - * - * @param b Source of bytes. - * @return Made int. - */ - private static int makeInt(byte[] b) { - return (((b[3]) << 24) | - ((b[2] & 0xff) << 16) | - ((b[1] & 0xff) << 8) | - ((b[0] & 0xff))); - } + if (err != null) { + unmarshErr = err; - /** - * @param src Source. - * @param target Target. - * @param marsh Marsh. - * @param log Logger. - */ - private void marshalData( - Map src, - Map target, - Marshaller marsh, - int compressionLevel, - IgniteLogger log - ) { - // may happen if nothing was collected from components, - // corresponding map (for common data or for node specific data) left null - if (src == null) - return; - - for (Map.Entry entry : src.entrySet()) { - try { - target.put(entry.getKey(), U.zip(U.marshal(marsh, entry.getValue()), compressionLevel)); - } - catch (IgniteCheckedException e) { - U.error(log, "Failed to marshal discovery data " + - "[comp=" + entry.getKey() + ", data=" + entry.getValue() + ']', e); - } + throw err; } } - /** */ - private void filterDuplicatedData(Map discoData) { - for (Map existingData : nodeSpecificData.values()) { - Iterator> it = discoData.entrySet().iterator(); - - while (it.hasNext()) { - Map.Entry discoDataEntry = it.next(); - - byte[] curData = existingData.get(discoDataEntry.getKey()); - - if (Arrays.equals(curData, discoDataEntry.getValue())) - it.remove(); - } - - if (discoData.isEmpty()) - break; - } + /** @return Iterator through all messages, stored in DataPacket. */ + private Iterator> compoundDataIterator() { + return F.concat(joiningNodeData.entrySet().iterator(), + commonData.entrySet().iterator(), + nodeSpecificData.values() + .stream() + .flatMap(m -> m.entrySet().stream()) + .iterator()); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/InetSocketAddressMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/InetSocketAddressMessage.java index f23e36f200d27..d76279fb28082 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/InetSocketAddressMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/InetSocketAddressMessage.java @@ -52,7 +52,6 @@ public int port() { return port; } - /** {@inheritDoc} */ @Override public String toString() { return S.toString(InetSocketAddressMessage.class, this); diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractMessage.java index 7a97763c36b25..5f09498060e2d 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractMessage.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; +import org.apache.ignite.internal.OperationContextMessage; import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.tostring.GridToStringInclude; @@ -76,6 +77,11 @@ public abstract class TcpDiscoveryAbstractMessage implements Message { @Order(4) Set failedNodes; + /** Operation context attributes message. */ + @GridToStringInclude + @Order(5) + public @Nullable OperationContextMessage opCtxMsg; + /** * Default no-arg constructor for {@link Externalizable} interface. */ @@ -100,6 +106,7 @@ protected TcpDiscoveryAbstractMessage(TcpDiscoveryAbstractMessage msg) { verifierNodeId = msg.verifierNodeId; topVer = msg.topVer; flags = msg.flags; + opCtxMsg = msg.opCtxMsg; } /** diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties index 4e14099e871c2..431e7ee68b9b7 100644 --- a/modules/core/src/main/resources/META-INF/classnames.properties +++ b/modules/core/src/main/resources/META-INF/classnames.properties @@ -705,7 +705,6 @@ org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager$CheckpointS org.apache.ignite.internal.managers.checkpoint.GridCheckpointRequest org.apache.ignite.internal.managers.communication.GridIoManager$ConcurrentHashMap0 org.apache.ignite.internal.managers.communication.GridIoMessage -org.apache.ignite.internal.managers.communication.GridIoSecurityAwareMessage org.apache.ignite.internal.managers.communication.GridIoUserMessage org.apache.ignite.internal.managers.communication.IgniteIoTestMessage org.apache.ignite.internal.managers.communication.SessionChannelMessage diff --git a/modules/core/src/main/resources/ignite.properties b/modules/core/src/main/resources/ignite-build-info.properties similarity index 100% rename from modules/core/src/main/resources/ignite.properties rename to modules/core/src/main/resources/ignite-build-info.properties diff --git a/modules/core/src/test/java/org/apache/ignite/cache/affinity/rendezvous/MdcAffinityBackupFilterSelfTest.java b/modules/core/src/test/java/org/apache/ignite/cache/affinity/rendezvous/MdcAffinityBackupFilterSelfTest.java index a45f3ccd90124..97c1949458400 100644 --- a/modules/core/src/test/java/org/apache/ignite/cache/affinity/rendezvous/MdcAffinityBackupFilterSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/cache/affinity/rendezvous/MdcAffinityBackupFilterSelfTest.java @@ -314,6 +314,8 @@ private IgniteEx startClusterAcrossDataCenters(String[] dcIds, int nodesPerDc) t lastNode = startGrid(nodeIdx++); } + System.clearProperty(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + return lastNode; } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridReleaseTypeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridReleaseTypeSelfTest.java deleted file mode 100644 index bc9771858de58..0000000000000 --- a/modules/core/src/test/java/org/apache/ignite/internal/GridReleaseTypeSelfTest.java +++ /dev/null @@ -1,525 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.function.UnaryOperator; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.IgniteException; -import org.apache.ignite.Ignition; -import org.apache.ignite.cluster.ClusterState; -import org.apache.ignite.configuration.DataStorageConfiguration; -import org.apache.ignite.configuration.IgniteConfiguration; -import org.apache.ignite.internal.util.function.ThrowableSupplier; -import org.apache.ignite.internal.util.lang.IgnitePair; -import org.apache.ignite.internal.util.lang.RunnableX; -import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.X; -import org.apache.ignite.lang.IgniteProductVersion; -import org.apache.ignite.spi.IgniteSpiException; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; -import org.apache.ignite.testframework.GridTestUtils; -import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -import static org.apache.ignite.testframework.GridTestUtils.assertThrows; -import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; -import static org.junit.Assume.assumeTrue; - -/** - * Test Rolling Upgrade release types. - */ -@RunWith(Parameterized.class) -public class GridReleaseTypeSelfTest extends GridCommonAbstractTest { - /** */ - private String nodeVer; - - /** - * Indicates whether the tested node is started as a client. - * This flag is used to run all test cases for both client and server node configurations. - */ - @Parameterized.Parameter - public boolean client; - - /** Persistence. */ - @Parameterized.Parameter(1) - public boolean persistence; - - /** @return Test parameters. */ - @Parameterized.Parameters(name = "client={0}, persistence={1}") - public static Collection parameters() { - return GridTestUtils.cartesianProduct(List.of(false, true), List.of(false, true)); - } - - /** {@inheritDoc} */ - @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { - IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); - - TcpDiscoverySpi discoSpi = new TcpDiscoverySpi() { - @Override public void setNodeAttributes(Map attrs, - IgniteProductVersion ver) { - super.setNodeAttributes(attrs, ver); - - attrs.put(IgniteNodeAttributes.ATTR_BUILD_VER, nodeVer); - } - }; - - discoSpi.setIpFinder(sharedStaticIpFinder); - - cfg.setDiscoverySpi(discoSpi); - - DataStorageConfiguration storageCfg = new DataStorageConfiguration(); - - storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(persistence); - - cfg.setDataStorageConfiguration(storageCfg); - - return cfg; - } - - /** {@inheritDoc} */ - @Override protected void afterTest() throws Exception { - stopAllGrids(); - cleanPersistenceDir(); - } - - /** */ - @Test - public void testTwoConflictVersions() { - testConflictVersions("2.18.0", "2.16.0", client); - testConflictVersions("2.21.0", "2.23.1", client); - testConflictVersions("2.20.1", "2.20.2", client); - } - - /** */ - @Test - public void testThreeConflictVersions() throws Exception { - testConflictVersionsWithRollingUpgrade("2.18.0", "2.18.1", "2.18.2", client, "2.18.1"); - - testConflictVersionsWithRollingUpgrade("2.18.0", "2.18.1", "2.17.2", client, "2.18.1"); - - testConflictVersionsWithRollingUpgrade("2.18.1", "2.19.0", "2.19.1", client, "2.19.0"); - - testConflictVersionsWithRollingUpgrade("2.18.1", "2.18.2", "2.18.0", client, "2.18.2"); - } - - /** */ - @Test - public void testTwoCompatibleVersions() throws Exception { - testCompatibleVersions("2.18.0", "2.18.0", client, null); - testCompatibleVersions("2.19.2", "2.19.2", client, null); - - testCompatibleVersions("2.18.0", "2.18.1", client, "2.18.1"); - testCompatibleVersions("2.18.2", "2.19.0", client, "2.19.0"); - } - - /** */ - @Test - public void testThreeCompatibleVersions() throws Exception { - testCompatibleVersions("2.18.0", "2.18.0", "2.18.0", client, null); - testCompatibleVersions("2.18.2", "2.18.2", "2.18.2", client, null); - - testCompatibleVersions("2.18.0", "2.18.1", "2.18.1", client, "2.18.1"); - testCompatibleVersions("2.18.1", "2.19.0", "2.18.1", client, "2.19.0"); - } - - /** */ - @Test - public void testForwardRollingUpgrade() throws Exception { - doTestRollingUpgrade("2.18.0", "2.18.1", false); - } - - /** */ - @Test - public void testForceRollingUpgrade() throws Exception { - doTestRollingUpgrade("2.18.0", "2.19.1", true); - } - - /** Performs full rolling upgrade scenario. */ - private void doTestRollingUpgrade(String curVer, String targetVer, boolean force) throws Exception { - IgniteEx ign0 = startGrid(0, curVer, false); - IgniteEx ign1 = startGrid(1, curVer, client); - IgniteEx ign2 = startGrid(2, curVer, client); - - assertClusterSize(3); - - assertRemoteRejected(() -> startGrid(3, targetVer, client)); - - configureRollingUpgradeVersion(ign0, targetVer, force); - - for (int i = 0; i < 3; i++) { - int finalI = i; - assertTrue(waitForCondition(() -> grid(finalI).context().rollingUpgrade().enabled(), getTestTimeout())); - } - - ign2.close(); - - assertClusterSize(2); - - startGrid(2, targetVer, client); - - assertClusterSize(3); - - ign1.close(); - - assertClusterSize(2); - - startGrid(1, targetVer, client); - - assertClusterSize(3); - - ign0.close(); - - assertClusterSize(2); - - startGrid(0, targetVer, false); - - assertClusterSize(3); - - if (client) - grid(0).context().rollingUpgrade().disable(); - else - grid(2).context().rollingUpgrade().disable(); - - for (int i = 0; i < 3; i++) { - if (!grid(i).localNode().isClient()) - assertFalse(grid(i).context().rollingUpgrade().enabled()); - } - - assertRemoteRejected(() -> startGrid(3, curVer, client)); - } - - /** */ - @Test - public void testJoiningNodeFailed() throws Exception { - int joinTimeout = 5_000; - - IgniteEx ign0 = startGrid(0, "2.18.0", false, - cfg -> { - ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setJoinTimeout(joinTimeout); - return cfg; - }); - - configureRollingUpgradeVersion(ign0, "2.18.1"); - - RunnableX runnableX = () -> startGrid(1, "2.18.1", false, - cfg -> { - TcpDiscoverySpi oldSpi = (TcpDiscoverySpi)cfg.getDiscoverySpi(); - - TcpDiscoverySpi newSpi = new TcpDiscoverySpi() { - @Override public void setNodeAttributes(Map attrs, IgniteProductVersion ver) { - super.setNodeAttributes(attrs, ver); - - attrs.put(IgniteNodeAttributes.ATTR_BUILD_VER, nodeVer); - attrs.put(IgniteNodeAttributes.ATTR_MARSHALLER, "null"); - } - }; - - newSpi.setIpFinder(oldSpi.getIpFinder()); - - return cfg.setDiscoverySpi(newSpi); - }); - - Throwable e = assertThrows(log, runnableX, IgniteException.class, null); - - assertTrue(X.hasCause(e, "Local node's marshaller differs from remote node's marshaller", IgniteSpiException.class)); - - ign0.context().rollingUpgrade().disable(); - - assertFalse(ign0.context().rollingUpgrade().enabled()); - } - - /** */ - @Test - public void testJoiningNodeLeft() throws Exception { - IgniteEx ign0 = startGrid(0, "2.18.0", false, cfg -> { - ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setJoinTimeout(0); - return cfg; - }); - - configureRollingUpgradeVersion(ign0, "2.18.1"); - - try (IgniteEx ignore = startGrid(1, "2.18.1", false)) { - assertClusterSize(2); - } - - assertClusterSize(1); - - ign0.context().rollingUpgrade().disable(); - } - - /** */ - @Test - public void testCoordinatorChange() throws Exception { - IgniteEx ign0 = startGrid(0, "2.18.0", false); - IgniteEx ign1 = startGrid(1, "2.18.0", false); - - configureRollingUpgradeVersion(ign0, "2.19.0"); - - startGrid(2, "2.19.0", false); - - assertClusterSize(3); - - ign0.close(); - ign1.close(); - - assertClusterSize(1); - - startGrid(0, "2.18.0", client); - startGrid(1, "2.19.0", client); - - assertClusterSize(3); - - assertRemoteRejected(() -> startGrid(4, "2.20.0", client)); - - assertClusterSize(3); - } - - /** */ - @Test - public void testNodeRestart() throws Exception { - assumeTrue("Distributed metastorage is only preserved across restarts when persistence is enabled", persistence); - - for (int i = 0; i < 3; i++) - startGrid(i, "2.18.0", false); - - assertClusterSize(3); - - configureRollingUpgradeVersion(grid(0), "2.18.1"); - - for (int i = 0; i < 3; i++) - grid(i).close(); - - assertClusterSize(0); - - for (int i = 0; i < 3; i++) - startGrid(i, "2.18.0", false); - - assertClusterSize(3); - - for (int i = 0; i < 3; i++) { - assertTrue(grid(i).context().rollingUpgrade().enabled()); - - IgnitePair stored = grid(i).context().rollingUpgrade().versions(); - - assertEquals(F.pair(IgniteProductVersion.fromString("2.18.0"), IgniteProductVersion.fromString("2.18.1")), stored); - } - } - - /** */ - @Test - public void testRollingUpgradeProcessorVersionCheck() throws Exception { - IgniteEx grid0 = startGrid(0, "2.18.0", false); - startGrid(1, "2.18.0", client); - - assertClusterSize(2); - - assertEnablingFails(grid0, "3.0.0", "Major versions are different"); - assertEnablingFails(grid0, "2.19.2", "Minor version can only be incremented by 1"); - assertEnablingFails(grid0, "2.18.2", "Patch version can only be incremented by 1"); - - IgnitePair newPair = F.pair(IgniteProductVersion.fromString("2.18.0"), - IgniteProductVersion.fromString("2.19.0")); - - grid0.context().rollingUpgrade().enable(newPair.get2(), false); - - assertEnablingFails(grid0, "2.18.1", "Rolling upgrade is already enabled with a different current and target version"); - - for (int i = 0; i < 2; i++) { - assertTrue(waitForCondition(grid(i).context().rollingUpgrade()::enabled, getTestTimeout())); - - assertEquals(newPair, grid(i).context().rollingUpgrade().versions()); - } - } - - /** - * Checks that enabling rolling upgrade fails with expected error message. - * - * @param ex Ex. - * @param ver New version. - * @param errMsg Expected error message. - */ - private void assertEnablingFails(IgniteEx ex, String ver, String errMsg) { - Throwable e = assertThrows(log, - () -> ex.context().rollingUpgrade().enable(IgniteProductVersion.fromString(ver), false), - IgniteException.class, - null); - - assertTrue(e.getMessage().contains(errMsg)); - } - - /** - * Checks that disabling rolling upgrade fails with expected error message. - * - * @param ex Ex. - * @param errMsg Expected error message. - */ - private void assertDisablingFails(IgniteEx ex, String errMsg) { - Throwable e = assertThrows(log, - () -> ex.context().rollingUpgrade().disable(), - IgniteException.class, - null); - - assertTrue(e.getMessage().contains(errMsg)); - } - - /** Tests that starting a node with rejected version fails with remote rejection. */ - private void testConflictVersions(String acceptedVer, String rejVer, boolean client) { - ThrowableSupplier sup = () -> { - IgniteEx ign = startGrid(0, acceptedVer, false); - - startGrid(1, rejVer, client, cfg -> { - TcpDiscoverySpi spi = (TcpDiscoverySpi)cfg.getDiscoverySpi(); - - // Decrease network timeout to reduce waiting time for node failure - // after it has been rejected by the coordinator due to version conflict. - spi.setNetworkTimeout(1_000); - - return cfg; - }); - - return ign; - }; - - assertRemoteRejected(sup); - - stopAllGrids(); - } - - /** Checks that the third grid is not compatible when rolling upgrade version is set. */ - private void testConflictVersionsWithRollingUpgrade(String acceptedVer1, String acceptedVer2, String rejVer, - boolean client, String rollUpVer) throws Exception { - ThrowableSupplier sup = () -> { - IgniteEx ign = startGrid(0, acceptedVer1, false); - - configureRollingUpgradeVersion(ign, rollUpVer); - - startGrid(1, acceptedVer2, client); - - startGrid(2, rejVer, client); - - return ign; - }; - - assertRemoteRejected(sup); - - stopAllGrids(); - - cleanPersistenceDir(); - } - - /** Checks that remote node rejected due to incompatible version. */ - private void assertRemoteRejected(ThrowableSupplier gridStart) { - Throwable e = assertThrows(log, gridStart::get, IgniteCheckedException.class, null); - - assertTrue(X.hasCause(e, "Remote node rejected due to incompatible version for cluster join", IgniteSpiException.class)); - } - - /** Tests two compatible grids. */ - private void testCompatibleVersions(String acceptedVer1, - String acceptedVer2, - boolean client, - String rollUpVerCheck) throws Exception { - IgniteEx grid = startGrid(0, acceptedVer1, false); - - if (rollUpVerCheck != null) - configureRollingUpgradeVersion(grid, rollUpVerCheck); - - startGrid(1, acceptedVer2, client); - - assertClusterSize(2); - - stopAllGrids(); - - if (persistence) - cleanPersistenceDir(); - } - - /** Tests three compatible grids. */ - private void testCompatibleVersions( - String acceptedVer1, - String acceptedVer2, - String acceptedVer3, - boolean client, - String rollUpVerCheck - ) throws Exception { - IgniteEx grid = startGrid(0, acceptedVer1, false); - - if (rollUpVerCheck != null) - configureRollingUpgradeVersion(grid, rollUpVerCheck); - - startGrid(1, acceptedVer2, client); - startGrid(2, acceptedVer3, client); - - assertClusterSize(3); - - stopAllGrids(); - - if (persistence) - cleanPersistenceDir(); - } - - /** Starts grid with required version. */ - private IgniteEx startGrid(int idx, String ver, boolean isClient) throws Exception { - return startGrid(idx, ver, isClient, null); - } - - /** Starts grid with required version and custom configuration. */ - private IgniteEx startGrid(int idx, String ver, boolean isClient, UnaryOperator cfgOp) throws Exception { - nodeVer = ver; - - IgniteEx ign = isClient ? startClientGrid(idx, cfgOp) : startGrid(idx, cfgOp); - - if (persistence) - ign.cluster().state(ClusterState.ACTIVE); - - return ign; - } - - /** */ - private void configureRollingUpgradeVersion(IgniteEx grid, String ver) throws IgniteCheckedException { - configureRollingUpgradeVersion(grid, ver, false); - } - - /** - * @param ver Version for rolling upgrade support. - * @param force Force rolling upgrade. - */ - private void configureRollingUpgradeVersion(IgniteEx grid, String ver, boolean force) throws IgniteCheckedException { - if (ver == null) { - grid.context().rollingUpgrade().disable(); - return; - } - - IgniteProductVersion target = IgniteProductVersion.fromString(ver); - - grid.context().rollingUpgrade().enable(target, force); - } - - /** - * @param size Expected cluster size. - */ - private void assertClusterSize(int size) throws IgniteInterruptedCheckedException { - assertTrue("Expected cluster size: " + size + ", but was: " + Ignition.allGrids().size(), - waitForCondition(() -> Ignition.allGrids().size() == size, getTestTimeout())); - } -} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java index 6a76831a79bbe..6f724f526e500 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.binary; +import java.io.ByteArrayOutputStream; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; @@ -753,6 +754,28 @@ public void testDeclaredBodyEnum() throws Exception { assertTrue(obj.type == DeclaredBodyEnum.TWO); } + /** + * Marshalling into an {@link java.io.OutputStream} must produce exactly the same bytes as marshalling into an array. + * + * @throws Exception If failed. + */ + @Test + public void testMarshalToStreamMatchesArray() throws Exception { + BinaryMarshaller marsh = binaryMarshaller(); + + for (Object obj : new Object[] {null, "string", 42, simpleObject()}) { + byte[] arr = marsh.marshal(obj); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + marsh.marshal(obj, out); + + assertArrayEquals("Mismatch for " + obj, arr, out.toByteArray()); + + assertEquals(obj, marsh.unmarshal(out.toByteArray(), null)); + } + } + /** * @throws Exception If failed. */ diff --git a/modules/core/src/test/java/org/apache/ignite/internal/codegen/MessageProcessorTest.java b/modules/core/src/test/java/org/apache/ignite/internal/codegen/MessageProcessorTest.java index e1e2e38dbbf5c..8fb559b9aac85 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/codegen/MessageProcessorTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/codegen/MessageProcessorTest.java @@ -36,6 +36,7 @@ import org.apache.ignite.internal.Order; import org.apache.ignite.internal.cache.query.QueryIndexMessage; import org.apache.ignite.internal.util.CommonUtils; +import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.plugin.extensions.communication.Message; @@ -363,13 +364,14 @@ static Compilation compile(Processor proc, String... srcFiles) { for (String srcFile: srcFiles) input.add(javaFile(srcFile)); - File igniteCoreJar = jarForClass(Message.class); + File igniteCoreJar = jarForClass(IgniteUtils.class); File igniteCodegenJar = jarForClass(Order.class); File igniteBinaryApiJar = jarForClass(IgniteUuid.class); File igniteCommonsJar = jarForClass(CommonUtils.class); + File igniteNioJar = jarForClass(Message.class); return Compiler.javac() - .withClasspath(F.asList(igniteCoreJar, igniteCodegenJar, igniteBinaryApiJar, igniteCommonsJar)) + .withClasspath(F.asList(igniteCoreJar, igniteCodegenJar, igniteBinaryApiJar, igniteCommonsJar, igniteNioJar)) .withProcessors(proc) .compile(input); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java index 4c5a786c7e862..40004815c5265 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java @@ -25,6 +25,8 @@ import java.util.function.Supplier; import org.apache.commons.lang3.StringUtils; import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.plugin.extensions.communication.Message; @@ -541,6 +543,106 @@ public void testIgniteProductVersion() { } } + /** */ + @Test + public void testGridCacheVersion() { + try { + GridCacheVersion ver = new GridCacheVersion(2, 20, 8198, 4); + + readWriteGridCacheVersion(ver); + readWriteGridCacheVersion(null); + + buff.limit(0); + + readWriteGridCacheVersion(ver); + readWriteGridCacheVersion(null); + + buff.limit(6); + + readWriteGridCacheVersion(ver); + readWriteGridCacheVersion(null); + + } + finally { + buff.limit(buff.capacity()); + } + } + + /** */ + @Test + public void testGridCacheVersionEx() { + try { + GridCacheVersionEx ver = new GridCacheVersionEx(1, 2, 3, new GridCacheVersion(2, 20, 8198, 4)); + + assertTrue(ver.conflictVersion().dataCenterId() != 0); + + readWriteGridCacheVersion(ver); + readWriteGridCacheVersion(null); + + buff.limit(0); + + readWriteGridCacheVersion(ver); + readWriteGridCacheVersion(null); + + buff.limit(6); + + readWriteGridCacheVersion(ver); + readWriteGridCacheVersion(null); + + } + finally { + buff.limit(buff.capacity()); + } + } + + /** */ + private void readWriteGridCacheVersion(GridCacheVersion ver) { + DirectByteBufferStream writeStream = createStream(buff); + DirectByteBufferStream readStream = createStream(buff); + + int startLimit = buff.limit(); + int iter = 0; + + do { + writeStream.writeGridCacheVersion(ver); + + if (buff.limit() < buff.capacity()) + buff.limit(buff.limit() + 1); + else + buff.limit(buff.capacity()); + + assertTrue("Must be done earlier", iter++ < buff.capacity()); + } while (!writeStream.lastFinished()); + + buff.rewind(); + buff.limit(startLimit); + + GridCacheVersion ver1; + + iter = 0; + + do { + ver1 = readStream.readGridCacheVersion(); + + if (buff.limit() < buff.capacity()) + buff.limit(buff.limit() + 1); + else + buff.limit(buff.capacity()); + + assertTrue("Must be done earlier", iter++ < buff.capacity()); + } while (!readStream.lastFinished()); + + assertEquals(ver, ver1); + + if (ver instanceof GridCacheVersionEx) { + assertEquals(ver.conflictVersion(), ver1.conflictVersion()); + assertEquals(ver.conflictVersion().dataCenterId(), ver1.conflictVersion().dataCenterId()); + } + + buff.rewind(); + buff.limit(startLimit); + } + /** */ private void readWriteIgniteProductVersion(IgniteProductVersion ver) { DirectByteBufferStream writeStream = createStream(buff); @@ -552,14 +654,12 @@ private void readWriteIgniteProductVersion(IgniteProductVersion ver) { do { writeStream.writeIgniteProductVersion(ver); - if (iter == 0 && buff.limit() < buff.capacity()) - buff.limit(buff.limit() + 4); - else if (iter == 1 && buff.limit() < buff.capacity()) - buff.limit(buff.limit() + 10); + if (buff.limit() < buff.capacity()) + buff.limit(buff.limit() + 1); else buff.limit(buff.capacity()); - assertTrue("Must be done earlier", iter++ < 10); + assertTrue("Must be done earlier", iter++ < 100); } while (!writeStream.lastFinished()); buff.rewind(); @@ -572,14 +672,12 @@ else if (iter == 1 && buff.limit() < buff.capacity()) do { ver1 = readStream.readIgniteProductVersion(); - if (iter == 0 && buff.limit() < buff.capacity()) - buff.limit(buff.limit() + 4); - else if (iter == 1 && buff.limit() < buff.capacity()) - buff.limit(buff.limit() + 10); + if (buff.limit() < buff.capacity()) + buff.limit(buff.limit() + 1); else buff.limit(buff.capacity()); - assertTrue("Must be done earlier", iter++ < 10); + assertTrue("Must be done earlier", iter++ < 100); } while (!readStream.lastFinished()); assertEquals(ver, ver1); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/AbstractMessageSerializationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/AbstractMessageSerializationTest.java index 82d3d96ba0f16..4f76c87312f6c 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/managers/AbstractMessageSerializationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/AbstractMessageSerializationTest.java @@ -29,6 +29,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.KeyCacheObject; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.lang.IgniteUuid; @@ -316,6 +317,11 @@ private boolean writeField(Class type) { return writeField(IgniteProductVersion.class); } + /** {@inheritDoc} */ + @Override public boolean writeGridCacheVersion(GridCacheVersion ver) { + return writeField(GridCacheVersion.class); + } + /** {@inheritDoc} */ @Override public boolean isHeaderWritten() { return true; @@ -584,6 +590,13 @@ private void readField(Class type) { return null; } + /** {@inheritDoc} */ + @Override public GridCacheVersion readGridCacheVersion() { + readField(GridCacheVersion.class); + + return null; + } + /** {@inheritDoc} */ @Override public boolean isLastRead() { if (position <= capacity) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/JmxExporterSpiTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/JmxExporterSpiTest.java index 67d90fe45a95b..36b457963d5dc 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/metric/JmxExporterSpiTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/JmxExporterSpiTest.java @@ -64,8 +64,8 @@ import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectAllTypes; import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectEnum; import org.apache.ignite.internal.client.thin.ProtocolVersion; -import org.apache.ignite.internal.metric.SystemViewSelfTest.TestPredicate; -import org.apache.ignite.internal.metric.SystemViewSelfTest.TestTransformer; +import org.apache.ignite.internal.metric.SystemViewQueriesTest.TestPredicate; +import org.apache.ignite.internal.metric.SystemViewQueriesTest.TestTransformer; import org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager; import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorage; import org.apache.ignite.internal.processors.metric.GridMetricManager; @@ -91,8 +91,8 @@ import static org.apache.ignite.internal.managers.systemview.ScanQuerySystemView.SCAN_QRY_SYS_VIEW; import static org.apache.ignite.internal.managers.systemview.SystemViewMBean.FILTER_OPERATION; import static org.apache.ignite.internal.managers.systemview.SystemViewMBean.VIEWS; -import static org.apache.ignite.internal.metric.SystemViewSelfTest.TEST_PREDICATE; -import static org.apache.ignite.internal.metric.SystemViewSelfTest.TEST_TRANSFORMER; +import static org.apache.ignite.internal.metric.SystemViewQueriesTest.TEST_PREDICATE; +import static org.apache.ignite.internal.metric.SystemViewQueriesTest.TEST_TRANSFORMER; import static org.apache.ignite.internal.processors.cache.CacheMetricsImpl.CACHE_METRICS; import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHES_VIEW; import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHE_GRPS_VIEW; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewAbstractTest.java new file mode 100644 index 0000000000000..8a6c2ae2d2e79 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewAbstractTest.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + +/** Abstract base class for system view tests. */ +public abstract class SystemViewAbstractTest extends GridCommonAbstractTest { + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + cleanPersistenceDir(); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + super.afterTestsStopped(); + + cleanPersistenceDir(); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewBinaryMetaTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewBinaryMetaTest.java new file mode 100644 index 0000000000000..f9970b050395b --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewBinaryMetaTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.lang.reflect.Field; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectAllTypes; +import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectEnum; +import org.apache.ignite.spi.systemview.view.BinaryMetadataView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl.BINARY_METADATA_VIEW; + +/** Tests for {@link SystemView} for binary meta. */ +public class SystemViewBinaryMetaTest extends SystemViewAbstractTest { + /** */ + @Test + public void testBinaryMeta() throws Exception { + try (IgniteEx g = startGrid(0)) { + IgniteCache c1 = g.createCache("test-cache"); + IgniteCache c2 = g.createCache("test-enum-cache"); + + c1.put(1, new TestObjectAllTypes()); + c2.put(1, TestObjectEnum.A); + + SystemView view = g.context().systemView().view(BINARY_METADATA_VIEW); + + assertNotNull(view); + assertEquals(2, view.size()); + + for (BinaryMetadataView meta : view) { + if (TestObjectEnum.class.getName().contains(meta.typeName())) { + assertTrue(meta.isEnum()); + + assertEquals(0, meta.fieldsCount()); + } + else { + assertFalse(meta.isEnum()); + + Field[] fields = TestObjectAllTypes.class.getDeclaredFields(); + + assertEquals(fields.length, meta.fieldsCount()); + + for (Field field : fields) + assertTrue(meta.fields().contains(field.getName())); + } + } + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewCacheTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewCacheTest.java new file mode 100644 index 0000000000000..94028e0996b46 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewCacheTest.java @@ -0,0 +1,221 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import javax.cache.expiry.CreatedExpiryPolicy; +import javax.cache.expiry.Duration; +import javax.cache.expiry.EternalExpiryPolicy; +import javax.cache.expiry.ModifiedExpiryPolicy; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.lang.IgnitePredicate; +import org.apache.ignite.spi.systemview.view.CacheGroupIoView; +import org.apache.ignite.spi.systemview.view.CacheGroupView; +import org.apache.ignite.spi.systemview.view.CacheView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHES_VIEW; +import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHE_GRPS_VIEW; +import static org.apache.ignite.internal.processors.cache.GridCacheProcessor.CACHE_GRP_IO_VIEW; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; + +/** Tests for {@link SystemView} for caches. */ +public class SystemViewCacheTest extends SystemViewAbstractTest { + /** Tests work of {@link SystemView} for caches. */ + @Test + public void testCachesView() throws Exception { + try (IgniteEx g = startGrid()) { + Set cacheNames = new HashSet<>(Arrays.asList("cache-1", "cache-2")); + + for (String name : cacheNames) + g.createCache(name); + + SystemView caches = g.context().systemView().view(CACHES_VIEW); + + assertEquals(g.context().cache().cacheDescriptors().size(), F.size(caches.iterator())); + + for (CacheView row : caches) + cacheNames.remove(row.cacheName()); + + assertTrue(cacheNames.toString(), cacheNames.isEmpty()); + } + } + + /** Tests work of {@link SystemView} for cache groups. */ + @Test + public void testCacheGroupsView() throws Exception { + try (IgniteEx g = startGrid()) { + Set grpNames = new HashSet<>(Arrays.asList("grp-1", "grp-2")); + + for (String grpName : grpNames) + g.createCache(new CacheConfiguration<>("cache-" + grpName).setGroupName(grpName)); + + SystemView grps = g.context().systemView().view(CACHE_GRPS_VIEW); + + assertEquals(g.context().cache().cacheGroupDescriptors().size(), F.size(grps.iterator())); + + for (CacheGroupView row : grps) + grpNames.remove(row.cacheGroupName()); + + assertTrue(grpNames.toString(), grpNames.isEmpty()); + } + } + + /** Tests work of {@link SystemView} for cache expiry policy info with in-memory configuration. */ + @Test + public void testCacheViewExpiryPolicyWithInMemory() throws Exception { + testCacheViewExpiryPolicy(false); + } + + /** Tests work of {@link SystemView} for cache expiry policy info with persist configuration. */ + @Test + public void testCacheViewExpiryPolicyWithPersist() throws Exception { + testCacheViewExpiryPolicy(true); + } + + /** Tests work of {@link SystemView} for cache groups expiry policy info. */ + private void testCacheViewExpiryPolicy(boolean withPersistence) throws Exception { + try (IgniteEx g = !withPersistence ? startGrid() : startGrid(getConfiguration().setDataStorageConfiguration( + new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration().setPersistenceEnabled(true) + )))) { + + if (withPersistence) + g.cluster().state(ClusterState.ACTIVE); + + String eternalCacheName = "eternalCache"; + String createdCacheName = "createdCache"; + String eagerTtlCacheName = "eagerTtlCache"; + String withoutGrpCacheName = "withoutGrpCache"; + String dfltCacheName = "defaultCache"; + + CacheConfiguration eternalCache = new CacheConfiguration(eternalCacheName) + .setGroupName("group1") + .setExpiryPolicyFactory(EternalExpiryPolicy.factoryOf()); + + CacheConfiguration createdCache = new CacheConfiguration(createdCacheName) + .setGroupName("group2") + .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, 500L))); + + CacheConfiguration eagerTtlCache = new CacheConfiguration(eagerTtlCacheName) + .setGroupName("group2") + .setEagerTtl(false) + .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, 500L))); + + CacheConfiguration withoutGrpCache = new CacheConfiguration(withoutGrpCacheName) + .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, 500L))); + + CacheConfiguration dfltCache = new CacheConfiguration(dfltCacheName) + .setGroupName("group3"); + + g.createCache(eternalCache); + g.createCache(createdCache); + g.createCache(eagerTtlCache); + g.createCache(withoutGrpCache); + g.createCache(dfltCache); + + SystemView caches = g.context().systemView().view(CACHES_VIEW); + + for (CacheView row : caches) { + switch (row.cacheName()) { + case "defaultCache": + case "eternalCache": + assertEquals("No", row.hasExpiringEntries()); + + g.cache(row.cacheName()).put(0, 0); + + assertEquals("No", row.hasExpiringEntries()); + + g.cache(row.cacheName()) + .withExpiryPolicy(new CreatedExpiryPolicy(new Duration(TimeUnit.MILLISECONDS, 200L))) + .put(1, 1); + + assertEquals("Yes", row.hasExpiringEntries()); + assertTrue(waitForCondition(() -> "No".equals(row.hasExpiringEntries()), getTestTimeout())); + + break; + + case "withoutGrpCache": + case "createdCache": + assertEquals("No", row.hasExpiringEntries()); + + g.cache(row.cacheName()).put(0, 0); + + assertEquals("Yes", row.hasExpiringEntries()); + assertTrue(waitForCondition(() -> "No".equals(row.hasExpiringEntries()), getTestTimeout())); + + g.cache(row.cacheName()) + .withExpiryPolicy(new ModifiedExpiryPolicy(new Duration(TimeUnit.MILLISECONDS, 200L))) + .put(1, 1); + + assertEquals("Yes", row.hasExpiringEntries()); + assertTrue(waitForCondition(() -> "No".equals(row.hasExpiringEntries()), getTestTimeout())); + + if (row.cacheName().equals(createdCacheName)) { + g.cache(eagerTtlCacheName).put(2, 2); + assertEquals("No", row.hasExpiringEntries()); + } + + break; + + case "eagerTtlCache": + assertEquals("Unknown", row.hasExpiringEntries()); + + break; + } + } + } + } + + /** Tests work of {@link SystemView} for cache group I/O operations. */ + @Test + public void testCacheGroupIo() throws Exception { + cleanPersistenceDir(); + + try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration( + new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration().setPersistenceEnabled(true)))) + ) { + ignite.cluster().state(ClusterState.ACTIVE); + + IgniteCache cache = ignite.createCache("cache"); + + cache.put(0, 0); + cache.get(0); + + SystemView view = ignite.context().systemView().view(CACHE_GRP_IO_VIEW); + + CacheGroupIoView row = F.find(view, null, + (IgnitePredicate)r -> "cache".equals(r.cacheGroupName())); + + assertNotNull(row); + assertTrue(row.logicalReads() > 0); + assertTrue(row.insertedBytes() > 0); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClientTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClientTest.java new file mode 100644 index 0000000000000..f1448d74f770e --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClientTest.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.sql.Connection; +import java.util.Iterator; +import java.util.Properties; +import org.apache.ignite.IgniteJdbcThinDriver; +import org.apache.ignite.Ignition; +import org.apache.ignite.client.Config; +import org.apache.ignite.client.IgniteClient; +import org.apache.ignite.configuration.ClientConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.client.thin.ProtocolVersion; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcConnectionContext; +import org.apache.ignite.internal.systemview.ClientConnectionAttributeViewWalker; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.spi.systemview.view.ClientConnectionAttributeView; +import org.apache.ignite.spi.systemview.view.ClientConnectionView; +import org.apache.ignite.spi.systemview.view.FiltrableSystemView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.apache.ignite.testframework.GridTestUtils; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_ATTR_VIEW; +import static org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_VIEW; +import static org.apache.ignite.internal.util.lang.GridFunc.identity; + +/** Tests for {@link SystemView} for clients. */ +public class SystemViewClientTest extends SystemViewAbstractTest { + /** */ + @Test + public void testClientsConnections() throws Exception { + try (IgniteEx g0 = startGrid(0)) { + String host = g0.configuration().getClientConnectorConfiguration().getHost(); + + if (host == null) + host = g0.configuration().getLocalHost(); + + int port = g0.configuration().getClientConnectorConfiguration().getPort(); + + SystemView conns = g0.context().systemView().view(CLI_CONN_VIEW); + + try (IgniteClient cli = Ignition.startClient(new ClientConfiguration().setAddresses(host + ":" + port))) { + assertEquals(1, conns.size()); + + ClientConnectionView cliConn = conns.iterator().next(); + + assertEquals("THIN", cliConn.type()); + assertEquals(cliConn.localAddress().getHostName(), cliConn.remoteAddress().getHostName()); + assertEquals(g0.configuration().getClientConnectorConfiguration().getPort(), + cliConn.localAddress().getPort()); + assertEquals(cliConn.version(), ProtocolVersion.LATEST_VER.toString()); + + try (Connection conn = + new IgniteJdbcThinDriver().connect("jdbc:ignite:thin://" + host, new Properties())) { + assertEquals(2, conns.size()); + assertEquals(1, F.size(jdbcConnectionsIterator(conns))); + + ClientConnectionView jdbcConn = jdbcConnectionsIterator(conns).next(); + + assertEquals("JDBC", jdbcConn.type()); + assertEquals(jdbcConn.localAddress().getHostName(), jdbcConn.remoteAddress().getHostName()); + assertEquals(g0.configuration().getClientConnectorConfiguration().getPort(), + jdbcConn.localAddress().getPort()); + assertEquals(jdbcConn.version(), JdbcConnectionContext.CURRENT_VER.asString()); + } + } + + boolean res = GridTestUtils.waitForCondition(() -> conns.size() == 0, 5_000); + + assertTrue(res); + } + } + + /** */ + @Test + public void testClientConnectionAttributes() throws Exception { + try (IgniteEx g0 = startGrid(0)) { + SystemView view = g0.context().systemView().view(CLI_CONN_ATTR_VIEW); + + try ( + IgniteClient cl1 = Ignition.startClient(new ClientConfiguration().setAddresses(Config.SERVER) + .setUserAttributes(F.asMap("attr1", "val1", "attr2", "val2"))); + IgniteClient cl2 = Ignition.startClient(new ClientConfiguration().setAddresses(Config.SERVER) + .setUserAttributes(F.asMap("attr1", "val2"))); + IgniteClient cl3 = Ignition.startClient(new ClientConfiguration().setAddresses(Config.SERVER)) + ) { + assertEquals(3, F.size(view.iterator())); + + assertEquals(1, F.size(view.iterator(), row -> + "attr1".equals(row.name()) && "val1".equals(row.value()))); + + // Test filtering. + assertTrue(view instanceof FiltrableSystemView); + + Iterator iter = ((FiltrableSystemView)view) + .iterator(F.asMap(ClientConnectionAttributeViewWalker.NAME_FILTER, "attr1")); + + assertEquals(2, F.size(iter)); + + iter = ((FiltrableSystemView)view).iterator( + F.asMap(ClientConnectionAttributeViewWalker.NAME_FILTER, "attr2")); + + assertTrue(iter.hasNext()); + + long connId = iter.next().connectionId(); + + assertFalse(iter.hasNext()); + + iter = ((FiltrableSystemView)view).iterator( + F.asMap(ClientConnectionAttributeViewWalker.CONNECTION_ID_FILTER, connId)); + + assertEquals(2, F.size(iter)); + } + } + } + + /** */ + private Iterator jdbcConnectionsIterator(SystemView conns) { + return F.iterator(conns.iterator(), identity(), true, v -> "JDBC".equals(v.type())); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewComputeTaskTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewComputeTaskTest.java new file mode 100644 index 0000000000000..e7f388d5f9104 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewComputeTaskTest.java @@ -0,0 +1,349 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteCompute; +import org.apache.ignite.IgniteException; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.compute.ComputeJob; +import org.apache.ignite.compute.ComputeJobResult; +import org.apache.ignite.compute.ComputeJobResultPolicy; +import org.apache.ignite.compute.ComputeTask; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.processors.task.GridInternal; +import org.apache.ignite.lang.IgniteCallable; +import org.apache.ignite.lang.IgniteClosure; +import org.apache.ignite.lang.IgniteRunnable; +import org.apache.ignite.lang.IgniteUuid; +import org.apache.ignite.spi.systemview.view.ComputeJobView; +import org.apache.ignite.spi.systemview.view.ComputeTaskView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.apache.ignite.testframework.GridTestUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.job.GridJobProcessor.JOBS_VIEW; +import static org.apache.ignite.internal.processors.task.GridTaskProcessor.TASKS_VIEW; +import static org.apache.ignite.testframework.GridTestUtils.runAsync; + +/** Tests for {@link SystemView} for compute tasks. */ +public class SystemViewComputeTaskTest extends SystemViewAbstractTest { + /** */ + private static CountDownLatch jobStartedLatch; + + /** */ + private static CountDownLatch releaseJobLatch; + + /** Tests work of {@link SystemView} for compute grid {@link IgniteCompute#broadcastAsync(IgniteRunnable)} call. */ + @Test + public void testComputeBroadcast() throws Exception { + CyclicBarrier barrier = new CyclicBarrier(6); + + try (IgniteEx g1 = startGrid(0)) { + SystemView tasks = g1.context().systemView().view(TASKS_VIEW); + + for (int i = 0; i < 5; i++) { + g1.compute().broadcastAsync(() -> { + try { + barrier.await(); + barrier.await(); + } + catch (InterruptedException | BrokenBarrierException e) { + throw new RuntimeException(e); + } + }); + } + + barrier.await(); + + assertEquals(5, tasks.size()); + + ComputeTaskView t = tasks.iterator().next(); + + assertFalse(t.internal()); + assertNull(t.affinityCacheName()); + assertEquals(-1, t.affinityPartitionId()); + assertTrue(t.taskClassName().startsWith(getClass().getName())); + assertTrue(t.taskName().startsWith(getClass().getName())); + assertEquals(g1.localNode().id(), t.taskNodeId()); + assertEquals("0", t.userVersion()); + + barrier.await(); + } + } + + /** Tests work of {@link SystemView} for compute grid {@link IgniteCompute#runAsync(IgniteRunnable)} call. */ + @Test + public void testComputeRunnable() throws Exception { + CyclicBarrier barrier = new CyclicBarrier(2); + + try (IgniteEx g1 = startGrid(0)) { + SystemView tasks = g1.context().systemView().view(TASKS_VIEW); + + g1.compute().runAsync(() -> { + try { + barrier.await(); + barrier.await(); + } + catch (InterruptedException | BrokenBarrierException e) { + throw new RuntimeException(e); + } + }); + + barrier.await(); + + assertEquals(1, tasks.size()); + + ComputeTaskView t = tasks.iterator().next(); + + assertFalse(t.internal()); + assertNull(t.affinityCacheName()); + assertEquals(-1, t.affinityPartitionId()); + assertTrue(t.taskClassName().startsWith(getClass().getName())); + assertTrue(t.taskName().startsWith(getClass().getName())); + assertEquals(g1.localNode().id(), t.taskNodeId()); + assertEquals("0", t.userVersion()); + + barrier.await(); + } + } + + /** Tests work of {@link SystemView} for compute grid {@link IgniteCompute#apply(IgniteClosure, Object)} call. */ + @Test + public void testComputeApply() throws Exception { + CyclicBarrier barrier = new CyclicBarrier(2); + + try (IgniteEx g1 = startGrid(0)) { + SystemView tasks = g1.context().systemView().view(TASKS_VIEW); + + GridTestUtils.runAsync(() -> { + g1.compute().apply(x -> { + try { + barrier.await(); + barrier.await(); + } + catch (InterruptedException | BrokenBarrierException e) { + throw new RuntimeException(e); + } + + return 0; + }, 1); + }); + + barrier.await(); + + assertEquals(1, tasks.size()); + + ComputeTaskView t = tasks.iterator().next(); + + assertFalse(t.internal()); + assertNull(t.affinityCacheName()); + assertEquals(-1, t.affinityPartitionId()); + assertTrue(t.taskClassName().startsWith(getClass().getName())); + assertTrue(t.taskName().startsWith(getClass().getName())); + assertEquals(g1.localNode().id(), t.taskNodeId()); + assertEquals("0", t.userVersion()); + + barrier.await(); + } + } + + /** + * Tests work of {@link SystemView} for compute grid + * {@link IgniteCompute#affinityCallAsync(String, Object, IgniteCallable)} call. + */ + @Test + public void testComputeAffinityCall() throws Exception { + CyclicBarrier barrier = new CyclicBarrier(2); + + try (IgniteEx g1 = startGrid(0)) { + SystemView tasks = g1.context().systemView().view(TASKS_VIEW); + + IgniteCache cache = g1.createCache("test-cache"); + + cache.put(1, 1); + + g1.compute().affinityCallAsync("test-cache", 1, () -> { + try { + barrier.await(); + barrier.await(); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + + return 0; + }); + + barrier.await(); + + assertEquals(1, tasks.size()); + + ComputeTaskView t = tasks.iterator().next(); + + assertFalse(t.internal()); + assertEquals("test-cache", t.affinityCacheName()); + assertEquals(1, t.affinityPartitionId()); + assertTrue(t.taskClassName().startsWith(getClass().getName())); + assertTrue(t.taskName().startsWith(getClass().getName())); + assertEquals(g1.localNode().id(), t.taskNodeId()); + assertEquals("0", t.userVersion()); + + barrier.await(); + } + } + + /** */ + @Test + public void testComputeTask() throws Exception { + doTestComputeTask(false); + } + + /** */ + @Test + public void testInternalComputeTask() throws Exception { + doTestComputeTask(true); + } + + /** */ + private void doTestComputeTask(boolean internal) throws Exception { + int gridCnt = 3; + + IgniteEx g1 = startGrids(gridCnt); + + try { + IgniteCache cache = g1.createCache("test-cache"); + + cache.put(1, 1); + + for (int i = 0; i < gridCnt; i++) { + IgniteEx grid = grid(i); + + SystemView tasks = grid.context().systemView().view(TASKS_VIEW); + + jobStartedLatch = new CountDownLatch(3); + releaseJobLatch = new CountDownLatch(1); + + IgniteInternalFuture fut + = runAsync(() -> grid.compute().execute(internal ? new InternalTask() : new UserTask(), 1)); + + assertTrue(jobStartedLatch.await(30_000, TimeUnit.MILLISECONDS)); + + try { + assertEquals(1, tasks.size()); + + ComputeTaskView t = tasks.iterator().next(); + + assertEquals("Expecting to see " + (internal ? "internal" : "user") + " task", internal, t.internal()); + assertNull(t.affinityCacheName()); + assertEquals(-1, t.affinityPartitionId()); + assertTrue(t.taskClassName().startsWith(getClass().getName())); + assertTrue(t.taskName().startsWith(getClass().getName())); + assertEquals(grid.localNode().id(), t.taskNodeId()); + assertEquals("0", t.userVersion()); + + checkJobs(gridCnt, internal, t.sessionId()); + } + finally { + releaseJobLatch.countDown(); + } + + fut.get(getTestTimeout(), TimeUnit.MILLISECONDS); + } + } + finally { + stopAllGrids(); + } + } + + /** */ + private void checkJobs(int gridCnt, boolean internal, IgniteUuid sesId) { + for (int i = 0; i < gridCnt; i++) { + SystemView jobs = grid(i).context().systemView().view(JOBS_VIEW); + + assertTrue("Expecting to see " + (internal ? "internal" : "user") + " job", jobs.size() > 0); + + ComputeJobView job = jobs.iterator().next(); + + assertEquals(sesId, job.sessionId()); + assertEquals("Expecting to see " + (internal ? "internal" : "user") + " job", internal, job.isInternal()); + } + + releaseJobLatch.countDown(); + } + + /** */ + private static class UserTask implements ComputeTask { + /** {@inheritDoc} */ + @Override public @NotNull Map map( + List subgrid, + @Nullable Object arg + ) throws IgniteException { + return subgrid.stream().collect(Collectors.toMap(k -> new UserJob(), Function.identity())); + } + + /** {@inheritDoc} */ + @Override public ComputeJobResultPolicy result(ComputeJobResult res, List rcvd) throws IgniteException { + return ComputeJobResultPolicy.WAIT; + } + + /** {@inheritDoc} */ + @Nullable @Override public Object reduce(List results) throws IgniteException { + return 1; + } + + /** */ + private static class UserJob implements ComputeJob { + /** {@inheritDoc} */ + @Override public void cancel() { + // No-op. + } + + /** {@inheritDoc} */ + @Override public Object execute() throws IgniteException { + jobStartedLatch.countDown(); + + try { + assertTrue(releaseJobLatch.await(30_000, TimeUnit.MILLISECONDS)); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + + return 1; + } + } + } + + /** */ + @GridInternal + public static class InternalTask extends UserTask { + // No-op. + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewConfigurationTest.java new file mode 100644 index 0000000000000..35574e996aa46 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewConfigurationTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.HashMap; +import java.util.Map; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.spi.systemview.view.ConfigurationView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.events.EventType.EVT_CONSISTENCY_VIOLATION; +import static org.apache.ignite.internal.IgniteKernal.CFG_VIEW; +import static org.apache.ignite.internal.util.IgniteUtils.MB; + +/** Tests for {@link SystemView} for configuration. */ +public class SystemViewConfigurationTest extends SystemViewAbstractTest { + /** */ + @Test + public void testConfigurationView() throws Exception { + long expMaxSize = 10 * MB; + + String expName = "my-instance"; + + String expDrName = "my-dr"; + + IgniteConfiguration icfg = getConfiguration(expName) + .setIncludeEventTypes(EVT_CONSISTENCY_VIOLATION) + .setDataStorageConfiguration(new DataStorageConfiguration() + .setDefaultDataRegionConfiguration( + new DataRegionConfiguration() + .setLazyMemoryAllocation(false)) + .setDataRegionConfigurations( + new DataRegionConfiguration() + .setName(expDrName) + .setMaxSize(expMaxSize))); + + try (IgniteEx ignite = startGrid(icfg)) { + Map viewContent = new HashMap<>(); + + ignite.context().systemView().view(CFG_VIEW) + .forEach(view -> viewContent.put(view.name(), view.value())); + + assertEquals(expName, viewContent.get("IgniteInstanceName")); + assertEquals( + "false", + viewContent.get("DataStorageConfiguration.DefaultDataRegionConfiguration.LazyMemoryAllocation") + ); + assertEquals(expDrName, viewContent.get("DataStorageConfiguration.DataRegionConfigurations[0].Name")); + assertEquals( + Long.toString(expMaxSize), + viewContent.get("DataStorageConfiguration.DataRegionConfigurations[0].MaxSize") + ); + assertEquals( + CacheAtomicityMode.TRANSACTIONAL.name(), + viewContent.get("CacheConfiguration[0].AtomicityMode") + ); + assertTrue(viewContent.containsKey("AddressResolver")); + assertNull(viewContent.get("AddressResolver")); + assertEquals("[" + EVT_CONSISTENCY_VIOLATION + ']', viewContent.get("IncludeEventTypes")); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewDSTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewDSTest.java new file mode 100644 index 0000000000000..05abbf428576b --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewDSTest.java @@ -0,0 +1,704 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import org.apache.ignite.IgniteAtomicLong; +import org.apache.ignite.IgniteAtomicReference; +import org.apache.ignite.IgniteAtomicSequence; +import org.apache.ignite.IgniteAtomicStamped; +import org.apache.ignite.IgniteCountDownLatch; +import org.apache.ignite.IgniteLock; +import org.apache.ignite.IgniteQueue; +import org.apache.ignite.IgniteSemaphore; +import org.apache.ignite.IgniteSet; +import org.apache.ignite.configuration.AtomicConfiguration; +import org.apache.ignite.configuration.CollectionConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.typedef.internal.CU; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.apache.ignite.spi.systemview.view.datastructures.AtomicLongView; +import org.apache.ignite.spi.systemview.view.datastructures.AtomicReferenceView; +import org.apache.ignite.spi.systemview.view.datastructures.AtomicSequenceView; +import org.apache.ignite.spi.systemview.view.datastructures.AtomicStampedView; +import org.apache.ignite.spi.systemview.view.datastructures.CountDownLatchView; +import org.apache.ignite.spi.systemview.view.datastructures.QueueView; +import org.apache.ignite.spi.systemview.view.datastructures.ReentrantLockView; +import org.apache.ignite.spi.systemview.view.datastructures.SemaphoreView; +import org.apache.ignite.spi.systemview.view.datastructures.SetView; +import org.junit.Test; + +import static org.apache.ignite.configuration.AtomicConfiguration.DFLT_ATOMIC_SEQUENCE_RESERVE_SIZE; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.DEFAULT_DS_GROUP_NAME; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.DEFAULT_VOLATILE_DS_GROUP_NAME; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.LATCHES_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.LOCKS_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.LONGS_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.QUEUES_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.REFERENCES_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.SEMAPHORES_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.SEQUENCES_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.SETS_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.STAMPED_VIEW; +import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.VOLATILE_DATA_REGION_NAME; +import static org.apache.ignite.testframework.GridTestUtils.runAsync; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; + +/** Tests for {@link SystemView} for data structures. */ +public class SystemViewDSTest extends SystemViewAbstractTest { + /** */ + @Test + public void testAtomicSequence() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + IgniteAtomicSequence s1 = g0.atomicSequence("seq-1", 42, true); + IgniteAtomicSequence s2 = g0.atomicSequence("seq-2", + new AtomicConfiguration().setBackups(1).setGroupName("my-group"), 43, true); + + s1.batchSize(42); + + SystemView seqs0 = g0.context().systemView().view(SEQUENCES_VIEW); + SystemView seqs1 = g1.context().systemView().view(SEQUENCES_VIEW); + + assertEquals(2, seqs0.size()); + assertEquals(0, seqs1.size()); + + for (AtomicSequenceView s : seqs0) { + if ("seq-1".equals(s.name())) { + assertEquals(42, s.value()); + assertEquals(42, s.batchSize()); + assertEquals(DEFAULT_DS_GROUP_NAME, s.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), s.groupId()); + + long val = s1.addAndGet(42); + + assertEquals(val, s.value()); + assertFalse(s.removed()); + } + else { + assertEquals("seq-2", s.name()); + assertEquals(DFLT_ATOMIC_SEQUENCE_RESERVE_SIZE, s.batchSize()); + assertEquals(43, s.value()); + assertEquals("my-group", s.groupName()); + assertEquals(CU.cacheId("my-group"), s.groupId()); + assertFalse(s.removed()); + + s2.close(); + + assertTrue(waitForCondition(s::removed, getTestTimeout())); + } + } + + g1.atomicSequence("seq-1", 42, true); + + assertEquals(1, seqs1.size()); + + AtomicSequenceView s = seqs1.iterator().next(); + + assertEquals(DFLT_ATOMIC_SEQUENCE_RESERVE_SIZE + 42, s.value()); + assertEquals(DFLT_ATOMIC_SEQUENCE_RESERVE_SIZE, s.batchSize()); + assertEquals(DEFAULT_DS_GROUP_NAME, s.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), s.groupId()); + assertFalse(s.removed()); + + s1.close(); + + assertTrue(waitForCondition(s::removed, getTestTimeout())); + + assertEquals(0, seqs0.size()); + assertEquals(0, seqs1.size()); + } + } + + /** */ + @Test + public void testAtomicLongs() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + IgniteAtomicLong l1 = g0.atomicLong("long-1", 42, true); + IgniteAtomicLong l2 = g0.atomicLong("long-2", + new AtomicConfiguration().setBackups(1).setGroupName("my-group"), 43, true); + + SystemView longs0 = g0.context().systemView().view(LONGS_VIEW); + SystemView longs1 = g1.context().systemView().view(LONGS_VIEW); + + assertEquals(2, longs0.size()); + assertEquals(0, longs1.size()); + + for (AtomicLongView l : longs0) { + if ("long-1".equals(l.name())) { + assertEquals(42, l.value()); + assertEquals(DEFAULT_DS_GROUP_NAME, l.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), l.groupId()); + + long val = l1.addAndGet(42); + + assertEquals(val, l.value()); + assertFalse(l.removed()); + } + else { + assertEquals("long-2", l.name()); + assertEquals(43, l.value()); + assertEquals("my-group", l.groupName()); + assertEquals(CU.cacheId("my-group"), l.groupId()); + assertFalse(l.removed()); + + l2.close(); + + assertTrue(waitForCondition(l::removed, getTestTimeout())); + } + } + + g1.atomicLong("long-1", 42, true); + + assertEquals(1, longs1.size()); + + AtomicLongView l = longs1.iterator().next(); + + assertEquals(84, l.value()); + assertEquals(DEFAULT_DS_GROUP_NAME, l.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), l.groupId()); + assertFalse(l.removed()); + + l1.close(); + + assertTrue(waitForCondition(l::removed, getTestTimeout())); + + assertEquals(0, longs0.size()); + assertEquals(0, longs1.size()); + } + } + + /** */ + @Test + public void testAtomicReference() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + IgniteAtomicReference l1 = g0.atomicReference("ref-1", "str1", true); + IgniteAtomicReference l2 = g0.atomicReference("ref-2", + new AtomicConfiguration().setBackups(1).setGroupName("my-group"), 43, true); + + SystemView refs0 = g0.context().systemView().view(REFERENCES_VIEW); + SystemView refs1 = g1.context().systemView().view(REFERENCES_VIEW); + + assertEquals(2, refs0.size()); + assertEquals(0, refs1.size()); + + for (AtomicReferenceView r : refs0) { + if ("ref-1".equals(r.name())) { + assertEquals("str1", r.value()); + assertEquals(DEFAULT_DS_GROUP_NAME, r.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), r.groupId()); + + l1.set("str2"); + + assertEquals("str2", r.value()); + assertFalse(r.removed()); + } + else { + assertEquals("ref-2", r.name()); + assertEquals("43", r.value()); + assertEquals("my-group", r.groupName()); + assertEquals(CU.cacheId("my-group"), r.groupId()); + assertFalse(r.removed()); + + l2.close(); + + assertTrue(waitForCondition(r::removed, getTestTimeout())); + } + } + + g1.atomicReference("ref-1", "str3", true); + + assertEquals(1, refs1.size()); + + AtomicReferenceView l = refs1.iterator().next(); + + assertEquals("str2", l.value()); + assertEquals(DEFAULT_DS_GROUP_NAME, l.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), l.groupId()); + assertFalse(l.removed()); + + l1.close(); + + assertTrue(waitForCondition(l::removed, getTestTimeout())); + + assertEquals(0, refs0.size()); + assertEquals(0, refs1.size()); + } + } + + /** */ + @Test + public void testAtomicStamped() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + IgniteAtomicStamped s1 = g0.atomicStamped("s-1", "str0", 1, true); + IgniteAtomicStamped s2 = g0.atomicStamped("s-2", + new AtomicConfiguration().setBackups(1).setGroupName("my-group"), "str1", 43, true); + + SystemView stamps0 = g0.context().systemView().view(STAMPED_VIEW); + SystemView stamps1 = g1.context().systemView().view(STAMPED_VIEW); + + assertEquals(2, stamps0.size()); + assertEquals(0, stamps1.size()); + + for (AtomicStampedView s : stamps0) { + if ("s-1".equals(s.name())) { + assertEquals("str0", s.value()); + assertEquals("1", s.stamp()); + assertEquals(DEFAULT_DS_GROUP_NAME, s.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), s.groupId()); + + s1.set("str2", 2); + + assertEquals("str2", s.value()); + assertEquals("2", s.stamp()); + assertFalse(s.removed()); + } + else { + assertEquals("s-2", s.name()); + assertEquals("str1", s.value()); + assertEquals("43", s.stamp()); + assertEquals("my-group", s.groupName()); + assertEquals(CU.cacheId("my-group"), s.groupId()); + assertFalse(s.removed()); + + s2.close(); + + assertTrue(waitForCondition(s::removed, getTestTimeout())); + } + } + + g1.atomicStamped("s-1", "str3", 3, true); + + assertEquals(1, stamps1.size()); + + AtomicStampedView l = stamps1.iterator().next(); + + assertEquals("str2", l.value()); + assertEquals("2", l.stamp()); + assertEquals(DEFAULT_DS_GROUP_NAME, l.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), l.groupId()); + assertFalse(l.removed()); + + s1.close(); + + assertTrue(l.removed()); + + assertEquals(0, stamps0.size()); + assertEquals(0, stamps1.size()); + } + } + + /** */ + @Test + public void testCountDownLatch() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + IgniteCountDownLatch l1 = g0.countDownLatch("c1", 3, false, true); + IgniteCountDownLatch l2 = g0.countDownLatch("c2", 1, true, true); + + SystemView latches0 = g0.context().systemView().view(LATCHES_VIEW); + SystemView latches1 = g1.context().systemView().view(LATCHES_VIEW); + + assertEquals(2, latches0.size()); + assertEquals(0, latches1.size()); + + String grpName = DEFAULT_VOLATILE_DS_GROUP_NAME + "@" + VOLATILE_DATA_REGION_NAME; + + for (CountDownLatchView l : latches0) { + if ("c1".equals(l.name())) { + assertEquals(3, l.count()); + assertEquals(3, l.initialCount()); + assertFalse(l.autoDelete()); + + l1.countDown(); + + assertEquals(2, l.count()); + assertEquals(3, l.initialCount()); + assertFalse(l.removed()); + } + else { + assertEquals("c2", l.name()); + assertEquals(1, l.count()); + assertEquals(1, l.initialCount()); + assertTrue(l.autoDelete()); + assertFalse(l.removed()); + + l2.countDown(); + l2.close(); + + assertTrue(waitForCondition(l::removed, getTestTimeout())); + } + + assertEquals(grpName, l.groupName()); + assertEquals(CU.cacheId(grpName), l.groupId()); + } + + IgniteCountDownLatch l3 = g1.countDownLatch("c1", 10, true, true); + + assertEquals(1, latches1.size()); + + CountDownLatchView l = latches1.iterator().next(); + + assertEquals(2, l.count()); + assertEquals(3, l.initialCount()); + assertEquals(grpName, l.groupName()); + assertEquals(CU.cacheId(grpName), l.groupId()); + assertFalse(l.removed()); + assertFalse(l.autoDelete()); + + l3.countDown(); + l3.countDown(); + l3.close(); + + assertTrue(waitForCondition(l::removed, getTestTimeout())); + + assertEquals(0, latches0.size()); + assertEquals(0, latches1.size()); + } + } + + /** */ + @Test + public void testSemaphores() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + IgniteSemaphore s1 = g0.semaphore("s1", 3, false, true); + IgniteSemaphore s2 = g0.semaphore("s2", 1, true, true); + + SystemView semaphores0 = g0.context().systemView().view(SEMAPHORES_VIEW); + SystemView semaphores1 = g1.context().systemView().view(SEMAPHORES_VIEW); + + assertEquals(2, semaphores0.size()); + assertEquals(0, semaphores1.size()); + + String grpName = DEFAULT_VOLATILE_DS_GROUP_NAME + "@" + VOLATILE_DATA_REGION_NAME; + + IgniteInternalFuture acquirePermitFut = null; + + for (SemaphoreView s : semaphores0) { + if ("s1".equals(s.name())) { + assertEquals(3, s.availablePermits()); + assertFalse(s.hasQueuedThreads()); + assertEquals(0, s.queueLength()); + assertFalse(s.failoverSafe()); + assertFalse(s.broken()); + assertFalse(s.removed()); + + acquirePermitFut = runAsync(() -> { + s1.acquire(2); + + try { + Thread.sleep(getTestTimeout()); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + finally { + s1.release(2); + } + }); + + assertTrue(waitForCondition(() -> s.availablePermits() == 1, getTestTimeout())); + assertTrue(s.hasQueuedThreads()); + assertEquals(1, s.queueLength()); + } + else { + assertEquals(1, s.availablePermits()); + assertFalse(s.hasQueuedThreads()); + assertEquals(0, s.queueLength()); + assertTrue(s.failoverSafe()); + assertFalse(s.broken()); + assertFalse(s.removed()); + + s2.close(); + + assertTrue(waitForCondition(s::removed, getTestTimeout())); + } + + assertEquals(grpName, s.groupName()); + assertEquals(CU.cacheId(grpName), s.groupId()); + } + + IgniteSemaphore l3 = g1.semaphore("s1", 10, true, true); + + assertEquals(1, semaphores1.size()); + + SemaphoreView s = semaphores1.iterator().next(); + + assertEquals(1, s.availablePermits()); + assertTrue(s.hasQueuedThreads()); + assertEquals(1, s.queueLength()); + assertFalse(s.failoverSafe()); + assertFalse(s.broken()); + assertFalse(s.removed()); + + acquirePermitFut.cancel(); + assertTrue(waitForCondition(() -> s.availablePermits() == 3, getTestTimeout())); + + l3.close(); + + assertTrue(waitForCondition(s::removed, getTestTimeout())); + + assertEquals(0, semaphores0.size()); + assertEquals(0, semaphores1.size()); + } + } + + /** */ + @Test + public void testLocks() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + IgniteLock l1 = g0.reentrantLock("l1", false, true, true); + IgniteLock l2 = g0.reentrantLock("l2", true, false, true); + + SystemView locks0 = g0.context().systemView().view(LOCKS_VIEW); + SystemView locks1 = g1.context().systemView().view(LOCKS_VIEW); + + assertEquals(2, locks0.size()); + assertEquals(0, locks1.size()); + + String grpName = DEFAULT_VOLATILE_DS_GROUP_NAME + "@" + VOLATILE_DATA_REGION_NAME; + + IgniteInternalFuture lockFut = null; + + Runnable lockNSleep = () -> { + l1.lock(); + + try { + Thread.sleep(getTestTimeout()); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + finally { + l1.unlock(); + } + }; + + for (ReentrantLockView l : locks0) { + if ("l1".equals(l.name())) { + assertFalse(l.locked()); + assertFalse(l.hasQueuedThreads()); + assertFalse(l.failoverSafe()); + assertTrue(l.fair()); + assertFalse(l.broken()); + assertFalse(l.removed()); + + lockFut = runAsync(lockNSleep); + + assertTrue(waitForCondition(l::locked, getTestTimeout())); + } + else { + assertFalse(l.hasQueuedThreads()); + assertTrue(l.failoverSafe()); + assertFalse(l.fair()); + assertFalse(l.broken()); + assertFalse(l.removed()); + + l2.close(); + + assertTrue(waitForCondition(l::removed, getTestTimeout())); + } + + assertEquals(grpName, l.groupName()); + assertEquals(CU.cacheId(grpName), l.groupId()); + } + + IgniteLock l3 = g1.reentrantLock("l1", true, false, true); + + assertEquals(1, locks1.size()); + + ReentrantLockView s = locks1.iterator().next(); + + assertTrue(s.locked()); + assertFalse(s.hasQueuedThreads()); + assertFalse(s.failoverSafe()); + assertTrue(s.fair()); + assertFalse(s.broken()); + assertFalse(s.removed()); + + lockFut.cancel(); + + assertTrue(waitForCondition(() -> !s.locked(), getTestTimeout())); + assertFalse(s.hasQueuedThreads()); + + l3.close(); + + assertTrue(waitForCondition(s::removed, getTestTimeout())); + + assertEquals(0, locks0.size()); + assertEquals(0, locks1.size()); + } + } + + /** */ + @Test + public void testQueue() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + + IgniteQueue q0 = g0.queue("queue-1", 42, new CollectionConfiguration() + .setCollocated(true) + .setBackups(1) + .setGroupName("my-group")); + IgniteQueue q1 = g0.queue("queue-2", 0, new CollectionConfiguration()); + + SystemView queues0 = g0.context().systemView().view(QUEUES_VIEW); + SystemView queues1 = g1.context().systemView().view(QUEUES_VIEW); + + assertEquals(2, queues0.size()); + assertEquals(0, queues1.size()); + + for (QueueView q : queues0) { + if ("queue-1".equals(q.name())) { + assertNotNull(q.id()); + assertEquals("queue-1", q.name()); + assertEquals(42, q.capacity()); + assertTrue(q.bounded()); + assertTrue(q.collocated()); + assertEquals("my-group", q.groupName()); + assertEquals(CU.cacheId("my-group"), q.groupId()); + assertFalse(q.removed()); + assertEquals(0, q.size()); + + q0.add("first"); + + assertEquals(1, q.size()); + } + else { + assertNotNull(q.id()); + assertEquals("queue-2", q.name()); + assertEquals(Integer.MAX_VALUE, q.capacity()); + assertFalse(q.bounded()); + assertFalse(q.collocated()); + assertEquals(DEFAULT_DS_GROUP_NAME, q.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), q.groupId()); + assertFalse(q.removed()); + assertEquals(0, q.size()); + + q1.close(); + + assertTrue(waitForCondition(q::removed, getTestTimeout())); + } + } + + IgniteQueue q2 = g1.queue("queue-1", 42, new CollectionConfiguration() + .setCollocated(true) + .setBackups(1) + .setGroupName("my-group")); + + assertEquals(1, queues1.size()); + + QueueView q = queues1.iterator().next(); + + assertNotNull(q.id()); + assertEquals("queue-1", q.name()); + assertEquals(42, q.capacity()); + assertTrue(q.bounded()); + assertTrue(q.collocated()); + assertEquals("my-group", q.groupName()); + assertEquals(CU.cacheId("my-group"), q.groupId()); + assertFalse(q.removed()); + assertEquals(1, q.size()); + + q2.close(); + + assertTrue(waitForCondition(q::removed, getTestTimeout())); + + assertEquals(0, queues0.size()); + assertEquals(0, queues1.size()); + } + } + + /** */ + @Test + public void testSet() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1)) { + + IgniteSet s0 = g0.set("set-1", new CollectionConfiguration() + .setCollocated(true) + .setBackups(1) + .setGroupName("my-group")); + IgniteSet s1 = g0.set("set-2", new CollectionConfiguration()); + + SystemView sets0 = g0.context().systemView().view(SETS_VIEW); + SystemView sets1 = g1.context().systemView().view(SETS_VIEW); + + assertEquals(2, sets0.size()); + assertEquals(0, sets1.size()); + + for (SetView q : sets0) { + if ("set-1".equals(q.name())) { + assertNotNull(q.id()); + assertEquals("set-1", q.name()); + assertTrue(q.collocated()); + assertEquals("my-group", q.groupName()); + assertEquals(CU.cacheId("my-group"), q.groupId()); + assertFalse(q.removed()); + assertEquals(0, q.size()); + + s0.add("first"); + + assertEquals(1, q.size()); + } + else { + assertNotNull(q.id()); + assertEquals("set-2", q.name()); + assertFalse(q.collocated()); + assertEquals(DEFAULT_DS_GROUP_NAME, q.groupName()); + assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), q.groupId()); + assertFalse(q.removed()); + assertEquals(0, q.size()); + + s1.close(); + + assertTrue(waitForCondition(q::removed, getTestTimeout())); + } + } + + IgniteSet s2 = g1.set("set-1", new CollectionConfiguration() + .setCollocated(true) + .setBackups(1) + .setGroupName("my-group")); + + assertEquals(1, sets1.size()); + + SetView s = sets1.iterator().next(); + + assertNotNull(s.id()); + assertEquals("set-1", s.name()); + assertTrue(s.collocated()); + assertEquals("my-group", s.groupName()); + assertEquals(CU.cacheId("my-group"), s.groupId()); + assertFalse(s.removed()); + assertEquals(1, s.size()); + + s2.close(); + + assertTrue(waitForCondition(s::removed, getTestTimeout())); + + assertEquals(0, sets0.size()); + assertEquals(0, sets1.size()); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewExecutorsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewExecutorsTest.java new file mode 100644 index 0000000000000..bd11b1b2d61b4 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewExecutorsTest.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.Iterator; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.thread.pool.IgniteStripedExecutor; +import org.apache.ignite.spi.systemview.view.StripedExecutorTaskView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.pool.PoolProcessor.STREAM_POOL_QUEUE_VIEW; +import static org.apache.ignite.internal.processors.pool.PoolProcessor.SYS_POOL_QUEUE_VIEW; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; + +/** Tests for {@link SystemView} for executors. */ +public class SystemViewExecutorsTest extends SystemViewAbstractTest { + /** */ + @Test + public void testStripedExecutors() throws Exception { + try (IgniteEx g = startGrid(0)) { + checkStripeExecutorView(g.context().pools().getStripedExecutorService(), + g.context().systemView().view(SYS_POOL_QUEUE_VIEW), + "sys"); + + checkStripeExecutorView(g.context().pools().getDataStreamerExecutorService(), + g.context().systemView().view(STREAM_POOL_QUEUE_VIEW), + "data-streamer"); + } + } + + /** + * Checks striped executor system view. + * + * @param execSvc Striped executor. + * @param view System view. + * @param poolName Executor name. + */ + private void checkStripeExecutorView(IgniteStripedExecutor execSvc, SystemView view, + String poolName) throws Exception { + CountDownLatch latch = new CountDownLatch(1); + + execSvc.execute(0, new TestRunnable(latch, 0)); + execSvc.execute(0, new TestRunnable(latch, 1)); + execSvc.execute(1, new TestRunnable(latch, 2)); + execSvc.execute(1, new TestRunnable(latch, 3)); + + try { + boolean res = waitForCondition(() -> view.size() == 2, 5_000); + + assertTrue(res); + + Iterator iter = view.iterator(); + + assertTrue(iter.hasNext()); + + StripedExecutorTaskView row0 = iter.next(); + + assertEquals(0, row0.stripeIndex()); + assertEquals(TestRunnable.class.getSimpleName() + '1', row0.description()); + assertEquals(poolName + "-stripe-0", row0.threadName()); + assertEquals(TestRunnable.class.getName(), row0.taskName()); + + assertTrue(iter.hasNext()); + + StripedExecutorTaskView row1 = iter.next(); + + assertEquals(1, row1.stripeIndex()); + assertEquals(TestRunnable.class.getSimpleName() + '3', row1.description()); + assertEquals(poolName + "-stripe-1", row1.threadName()); + assertEquals(TestRunnable.class.getName(), row1.taskName()); + } + finally { + latch.countDown(); + } + } + + /** Test runnable. */ + public static class TestRunnable implements Runnable { + /** */ + private final CountDownLatch latch; + + /** */ + private final int idx; + + /** */ + public TestRunnable(CountDownLatch latch, int idx) { + this.latch = latch; + this.idx = idx; + } + + /** {@inheritDoc} */ + @Override public void run() { + try { + latch.await(5, TimeUnit.SECONDS); + } + catch (InterruptedException e) { + throw new IgniteException(e); + } + } + + /** {@inheritDoc} */ + @Override public String toString() { + return getClass().getSimpleName() + idx; + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewMetastorageTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewMetastorageTest.java new file mode 100644 index 0000000000000..16a3174868c7c --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewMetastorageTest.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.Iterator; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager; +import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorage; +import org.apache.ignite.internal.systemview.MetastorageViewWalker; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.lang.IgnitePredicate; +import org.apache.ignite.spi.systemview.view.FiltrableSystemView; +import org.apache.ignite.spi.systemview.view.MetastorageView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.cache.persistence.DataStorageMetricsImpl.DATASTORAGE_METRIC_PREFIX; +import static org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.METASTORE_VIEW; +import static org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageImpl.DISTRIBUTED_METASTORE_VIEW; +import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; + +/** Tests for {@link SystemView} for metastorage. */ +public class SystemViewMetastorageTest extends SystemViewAbstractTest { + /** */ + @Test + public void testMetastorage() throws Exception { + cleanPersistenceDir(); + + try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration( + new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration().setPersistenceEnabled(true) + )))) { + ignite.cluster().state(ClusterState.ACTIVE); + + IgniteCacheDatabaseSharedManager db = ignite.context().cache().context().database(); + + SystemView metaStoreView = ignite.context().systemView().view(METASTORE_VIEW); + + assertNotNull(metaStoreView); + + String name = "test-key"; + String val = "test-value"; + String unmarshalledName = "unmarshalled-key"; + String unmarshalledVal = "[Raw data. 0 bytes]"; + + db.checkpointReadLock(); + + try { + db.metaStorage().write(name, val); + db.metaStorage().writeRaw(unmarshalledName, new byte[0]); + } + finally { + db.checkpointReadUnlock(); + } + + assertNotNull(F.find(metaStoreView, null, + (IgnitePredicate)view -> + name.equals(view.name()) && val.equals(view.value()))); + + assertNotNull(F.find(metaStoreView, null, + (IgnitePredicate)view -> + unmarshalledName.equals(view.name()) && unmarshalledVal.equals(view.value()))); + + // Test filtering. + assertTrue(metaStoreView instanceof FiltrableSystemView); + + Iterator iter = ((FiltrableSystemView)metaStoreView) + .iterator(F.asMap(MetastorageViewWalker.NAME_FILTER, name)); + + assertTrue(iter.hasNext()); + + MetastorageView row = iter.next(); + + assertTrue(name.equals(row.name()) && val.equals(row.value())); + assertFalse(iter.hasNext()); + } + } + + /** */ + @Test + public void testDistributedMetastorage() throws Exception { + cleanPersistenceDir(); + + try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration( + new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration().setPersistenceEnabled(true) + )))) { + ignite.cluster().state(ClusterState.ACTIVE); + + String histogramName = "CheckpointBeforeLockHistogram"; + + ignite.context().metric().configureHistogram(metricName(DATASTORAGE_METRIC_PREFIX, histogramName), new long[] { 1, 2, 3}); + + DistributedMetaStorage dms = ignite.context().distributedMetastorage(); + + String name = "test-distributed-key"; + String val = "test-distributed-value"; + + dms.write(name, val); + + SystemView dmsView = ignite.context().systemView().view(DISTRIBUTED_METASTORE_VIEW); + + assertNotNull(F.find( + dmsView, + null, + (IgnitePredicate)view -> name.equals(view.name()) && val.equals(view.value())) + ); + + assertNotNull(F.find( + dmsView, + null, + (IgnitePredicate) + view -> view.name().endsWith(histogramName) && "[1, 2, 3]".equals(view.value())) + ); + + // Test filtering. + assertTrue(dmsView instanceof FiltrableSystemView); + + Iterator iter = ((FiltrableSystemView)dmsView) + .iterator(F.asMap(MetastorageViewWalker.NAME_FILTER, name)); + + assertTrue(iter.hasNext()); + + MetastorageView row = iter.next(); + + assertTrue(name.equals(row.name()) && val.equals(row.value())); + assertFalse(iter.hasNext()); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewNodesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewNodesTest.java new file mode 100644 index 0000000000000..f6036418a84fa --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewNodesTest.java @@ -0,0 +1,235 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.Iterator; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.systemview.BaselineNodeAttributeViewWalker; +import org.apache.ignite.internal.systemview.NodeAttributeViewWalker; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.spi.systemview.view.BaselineNodeAttributeView; +import org.apache.ignite.spi.systemview.view.BaselineNodeView; +import org.apache.ignite.spi.systemview.view.ClusterNodeView; +import org.apache.ignite.spi.systemview.view.FiltrableSystemView; +import org.apache.ignite.spi.systemview.view.NodeAttributeView; +import org.apache.ignite.spi.systemview.view.NodeMetricsView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.apache.ignite.testframework.junits.WithSystemProperty; +import org.junit.Test; + +import static org.apache.ignite.IgniteSystemProperties.IGNITE_DATA_CENTER_ID; +import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.NODES_SYS_VIEW; +import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.NODE_ATTRIBUTES_SYS_VIEW; +import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.NODE_METRICS_SYS_VIEW; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.BASELINE_NODES_SYS_VIEW; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.BASELINE_NODE_ATTRIBUTES_SYS_VIEW; +import static org.apache.ignite.internal.util.IgniteUtils.toStringSafe; + +/** Tests for {@link SystemView} for nodes. */ +public class SystemViewNodesTest extends SystemViewAbstractTest { + /** */ + @Test + @WithSystemProperty(key = IGNITE_DATA_CENTER_ID, value = "DC0") + public void testNodes() throws Exception { + try (IgniteEx g1 = startGrid(0)) { + SystemView views = g1.context().systemView().view(NODES_SYS_VIEW); + + assertEquals(1, views.size()); + + try (IgniteEx g2 = startGrid(1)) { + awaitPartitionMapExchange(); + + checkViewsState(views, g1.localNode(), g2.localNode()); + checkViewsState(g2.context().systemView().view(NODES_SYS_VIEW), g2.localNode(), g1.localNode()); + } + + assertEquals(1, views.size()); + } + } + + /** */ + @Test + public void testNodeAttributes() throws Exception { + try ( + IgniteEx ignite0 = startGrid(getConfiguration(getTestIgniteInstanceName(0)) + .setUserAttributes(F.asMap("name", "val0"))); + IgniteEx ignite1 = startGrid(getConfiguration(getTestIgniteInstanceName(1)) + .setUserAttributes(F.asMap("name", "val1"))) + ) { + awaitPartitionMapExchange(); + + SystemView view = ignite0.context().systemView().view(NODE_ATTRIBUTES_SYS_VIEW); + + assertEquals(ignite0.cluster().localNode().attributes().size() + + ignite1.cluster().localNode().attributes().size(), view.size()); + + assertEquals(1, F.size(view.iterator(), row -> "name".equals(row.name()) && "val0".equals(row.value()))); + assertEquals(1, F.size(view.iterator(), row -> "name".equals(row.name()) && "val1".equals(row.value()))); + + // Test filtering. + assertTrue(view instanceof FiltrableSystemView); + + Iterator iter = ((FiltrableSystemView)view) + .iterator(F.asMap(NodeAttributeViewWalker.NODE_ID_FILTER, ignite0.cluster().localNode().id())); + + assertEquals(1, F.size(iter, row -> "name".equals(row.name()) && "val0".equals(row.value()))); + + iter = ((FiltrableSystemView)view).iterator( + F.asMap(NodeAttributeViewWalker.NODE_ID_FILTER, ignite1.cluster().localNode().id().toString())); + + assertEquals(1, F.size(iter, row -> "name".equals(row.name()) && "val1".equals(row.value()))); + + iter = ((FiltrableSystemView)view).iterator( + F.asMap(NodeAttributeViewWalker.NODE_ID_FILTER, "malformed-id")); + + assertEquals(0, F.size(iter)); + + iter = ((FiltrableSystemView)view).iterator( + F.asMap(NodeAttributeViewWalker.NAME_FILTER, "name")); + + assertEquals(2, F.size(iter)); + + iter = ((FiltrableSystemView)view) + .iterator(F.asMap(NodeAttributeViewWalker.NODE_ID_FILTER, ignite0.cluster().localNode().id(), + NodeAttributeViewWalker.NAME_FILTER, "name")); + + assertEquals(1, F.size(iter)); + } + } + + /** */ + @Test + public void testNodeMetrics() throws Exception { + long ts = U.currentTimeMillis(); + + try (IgniteEx ignite0 = startGrid(0); IgniteEx ignite1 = startGrid(1)) { + awaitPartitionMapExchange(); + + SystemView view = ignite0.context().systemView().view(NODE_METRICS_SYS_VIEW); + + assertEquals(2, view.size()); + assertEquals(1, F.size(view.iterator(), row -> row.nodeId().equals(ignite0.cluster().localNode().id()))); + assertEquals(1, F.size(view.iterator(), row -> row.nodeId().equals(ignite1.cluster().localNode().id()))); + assertEquals(2, F.size(view.iterator(), row -> row.lastUpdateTime().getTime() >= ts)); + } + } + + /** */ + @Test + public void testBaselineNodes() throws Exception { + cleanPersistenceDir(); + + try ( + IgniteEx ignite0 = startGrid(getConfiguration(getTestIgniteInstanceName(0)) + .setDataStorageConfiguration(new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration().setPersistenceEnabled(true))) + .setConsistentId("consId0")); + IgniteEx ignite1 = startGrid(getConfiguration(getTestIgniteInstanceName(1)) + .setDataStorageConfiguration(new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration().setPersistenceEnabled(true))) + .setConsistentId("consId1")); + ) { + ignite0.cluster().state(ClusterState.ACTIVE); + + ignite1.close(); + + awaitPartitionMapExchange(); + + SystemView view = ignite0.context().systemView().view(BASELINE_NODES_SYS_VIEW); + + assertEquals(2, view.size()); + assertEquals(1, F.size(view.iterator(), row -> "consId0".equals(row.consistentId()) && row.online())); + assertEquals(1, F.size(view.iterator(), row -> "consId1".equals(row.consistentId()) && !row.online())); + } + } + + /** */ + @Test + public void testBaselineNodeAttributes() throws Exception { + cleanPersistenceDir(); + + try (IgniteEx ignite = startGrid(getConfiguration() + .setDataStorageConfiguration( + new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration().setName("pds").setPersistenceEnabled(true) + )) + .setUserAttributes(F.asMap("name", "val")) + .setConsistentId("consId")) + ) { + ignite.cluster().state(ClusterState.ACTIVE); + + SystemView view = ignite.context().systemView() + .view(BASELINE_NODE_ATTRIBUTES_SYS_VIEW); + + assertEquals(ignite.cluster().localNode().attributes().size(), view.size()); + + assertEquals(1, F.size(view.iterator(), row -> "consId".equals(row.nodeConsistentId()) && + "name".equals(row.name()) && "val".equals(row.value()))); + + // Test filtering. + assertTrue(view instanceof FiltrableSystemView); + + Iterator iter = ((FiltrableSystemView)view) + .iterator(F.asMap(BaselineNodeAttributeViewWalker.NODE_CONSISTENT_ID_FILTER, "consId", + BaselineNodeAttributeViewWalker.NAME_FILTER, "name")); + + assertEquals(1, F.size(iter)); + + iter = ((FiltrableSystemView)view).iterator( + F.asMap(BaselineNodeAttributeViewWalker.NODE_CONSISTENT_ID_FILTER, "consId")); + + assertEquals(1, F.size(iter, row -> "name".equals(row.name()))); + + iter = ((FiltrableSystemView)view).iterator( + F.asMap(BaselineNodeAttributeViewWalker.NAME_FILTER, "name")); + + assertEquals(1, F.size(iter)); + } + } + + /** */ + private void checkViewsState(SystemView views, ClusterNode loc, ClusterNode rmt) { + assertEquals(2, views.size()); + + for (ClusterNodeView nodeView : views) { + if (nodeView.nodeId().equals(loc.id())) + checkNodeView(nodeView, loc, true); + else + checkNodeView(nodeView, rmt, false); + } + } + + /** */ + private void checkNodeView(ClusterNodeView view, ClusterNode node, boolean isLoc) { + assertEquals(node.id(), view.nodeId()); + assertEquals(node.consistentId().toString(), view.consistentId()); + assertEquals(toStringSafe(node.addresses()), view.addresses()); + assertEquals(toStringSafe(node.hostNames()), view.hostnames()); + assertEquals(node.order(), view.nodeOrder()); + assertEquals(node.version().toString(), view.version()); + assertEquals(isLoc, view.isLocal()); + assertEquals(node.isClient(), view.isClient()); + assertEquals(node.dataCenterId(), view.dataCenterId()); + assertEquals("DC0", view.dataCenterId()); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPageListsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPageListsTest.java new file mode 100644 index 0000000000000..e2182ce77d8bb --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPageListsTest.java @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.Iterator; +import java.util.Map; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; +import org.apache.ignite.internal.processors.cache.persistence.freelist.PagesList; +import org.apache.ignite.internal.systemview.CachePagesListViewWalker; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.spi.systemview.view.CachePagesListView; +import org.apache.ignite.spi.systemview.view.FiltrableSystemView; +import org.apache.ignite.spi.systemview.view.PagesListView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.cache.GridCacheProcessor.CACHE_GRP_PAGE_LIST_VIEW; +import static org.apache.ignite.internal.processors.cache.GridCacheUtils.cacheId; +import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.DATA_REGION_PAGE_LIST_VIEW; + +/** Tests for {@link SystemView} for page lists. */ +public class SystemViewPageListsTest extends SystemViewAbstractTest { + /** */ + @Test + public void testPagesList() throws Exception { + cleanPersistenceDir(); + + try (IgniteEx ignite = startGrid(getConfiguration() + .setDataStorageConfiguration( + new DataStorageConfiguration().setDataRegionConfigurations( + new DataRegionConfiguration().setName("dr0").setMaxSize(100L * 1024 * 1024), + new DataRegionConfiguration().setName("dr1").setMaxSize(100L * 1024 * 1024) + .setPersistenceEnabled(true) + )))) { + ignite.cluster().state(ClusterState.ACTIVE); + + GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)ignite.context().cache().context() + .database(); + + int pageSize = dbMgr.pageSize(); + + dbMgr.enableCheckpoints(false).get(); + + for (int i = 0; i < 2; i++) { + IgniteCache cache = ignite.getOrCreateCache(new CacheConfiguration<>("cache" + i) + .setDataRegionName("dr" + i).setAffinity(new RendezvousAffinityFunction().setPartitions(2))); + + int key = 0; + + // Fill up different free-list buckets. + for (int j = 0; j < pageSize / 2; j++) + cache.put(key++, new byte[j + 1]); + + // Put some pages to one bucket to overflow pages cache. + for (int j = 0; j < 1000; j++) + cache.put(key++, new byte[pageSize / 2]); + } + + long dr0flPages = 0; + int dr0flStripes = 0; + + SystemView dataRegionPageLists = ignite.context().systemView().view(DATA_REGION_PAGE_LIST_VIEW); + + for (PagesListView pagesListView : dataRegionPageLists) { + if (pagesListView.name().startsWith("dr0")) { + dr0flPages += pagesListView.bucketSize(); + dr0flStripes += pagesListView.stripesCount(); + } + } + + assertTrue(dr0flPages > 0); + assertTrue(dr0flStripes > 0); + + int bucketsCnt = ((PagesList)ignite.context().cache().context().database().freeList("dr0")).bucketsCount(); + int[] bucketPagesSize = new int[bucketsCnt]; + + for (PagesListView pagesListView : dataRegionPageLists) { + int bucket = pagesListView.bucketNumber(); + + if (bucketPagesSize[bucket] == 0) { + assertTrue(bucket == 0 || pagesListView.pageFreeSpace() != 0); + bucketPagesSize[bucket] = pagesListView.pageFreeSpace(); + } + else + assertEquals(bucketPagesSize[bucket], pagesListView.pageFreeSpace()); + } + + int prev = 0; + + for (int size : bucketPagesSize) { + if (size > 0) { + assertTrue(size > prev); + prev = size; + } + } + + SystemView cacheGrpPageLists = ignite.context().systemView().view(CACHE_GRP_PAGE_LIST_VIEW); + + long dr1flPages = 0; + int dr1flStripes = 0; + int dr1flCached = 0; + + for (CachePagesListView pagesListView : cacheGrpPageLists) { + if (pagesListView.cacheGroupId() == cacheId("cache1")) { + dr1flPages += pagesListView.bucketSize(); + dr1flStripes += pagesListView.stripesCount(); + dr1flCached += pagesListView.cachedPagesCount(); + } + } + + assertTrue(dr1flPages > 0); + assertTrue(dr1flStripes > 0); + assertTrue(dr1flCached > 0); + + // Test filtering. + assertTrue(cacheGrpPageLists instanceof FiltrableSystemView); + + Iterator iter = ((FiltrableSystemView)cacheGrpPageLists).iterator(Map.of( + CachePagesListViewWalker.CACHE_GROUP_ID_FILTER, cacheId("cache1"), + CachePagesListViewWalker.PARTITION_ID_FILTER, 0, + CachePagesListViewWalker.BUCKET_NUMBER_FILTER, 0 + )); + + assertEquals(1, F.size(iter)); + + iter = ((FiltrableSystemView)cacheGrpPageLists).iterator(Map.of( + CachePagesListViewWalker.CACHE_GROUP_ID_FILTER, cacheId("cache1"), + CachePagesListViewWalker.BUCKET_NUMBER_FILTER, 0 + )); + + assertEquals(2, F.size(iter)); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPageTimestampsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPageTimestampsTest.java new file mode 100644 index 0000000000000..86f28a7b1f490 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPageTimestampsTest.java @@ -0,0 +1,228 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.concurrent.atomic.AtomicLong; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteDataStreamer; +import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.processors.metric.impl.PeriodicHistogramMetricImpl; +import org.apache.ignite.internal.util.GridTestClockTimer; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.spi.systemview.view.PagesTimestampHistogramView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.apache.ignite.testframework.GridTestUtils; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.PAGE_TS_HISTOGRAM_VIEW; + +/** Tests for {@link SystemView} for page timestamps. */ +public class SystemViewPageTimestampsTest extends SystemViewAbstractTest { + /** */ + @Test + public void testPagesTimestampHistogram() throws Exception { + int keysCnt = 50_000; + + AtomicLong curTime = new AtomicLong(System.currentTimeMillis()); + + GridTestClockTimer.timeSupplier(curTime::get); + GridTestClockTimer.update(); + + String regionName = "default"; + + DataStorageConfiguration dsCfg = new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration() + .setMaxSize(50L * 1024 * 1024) + .setPersistenceEnabled(true) + .setName(regionName) + .setMetricsEnabled(true) + ); + + cleanPersistenceDir(); + + try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration(dsCfg))) { + ignite.cluster().state(ClusterState.ACTIVE); + + CacheConfiguration ccfg1 = new CacheConfiguration<>("test-pages-ts1") + .setAffinity(new RendezvousAffinityFunction(false, 10)); + + CacheConfiguration ccfg2 = new CacheConfiguration<>("test-pages-ts2") + .setAffinity(new RendezvousAffinityFunction(false, 10)); + + IgniteCache cache1 = ignite.createCache(ccfg1); + + long ts1 = curTime.get(); + + for (int i = 0; i < 1000; i++) + cache1.put(i, i); + + long ts2 = curTime.addAndGet(PeriodicHistogramMetricImpl.DFLT_BUCKETS_INTERVAL); + GridTestClockTimer.update(); + + for (int i = 1000; i < 2000; i++) + cache1.put(i, i); + + SystemView pagesTsHistogram = + ignite.context().systemView().view(PAGE_TS_HISTOGRAM_VIEW); + + assertNotNull(pagesTsHistogram); + + long totalCnt = 0; + + for (PagesTimestampHistogramView view : pagesTsHistogram) { + if (regionName.equals(view.dataRegionName())) { + if ((ts1 >= view.intervalStart().getTime() && ts1 <= view.intervalEnd().getTime()) || + (ts2 >= view.intervalStart().getTime() && ts2 <= view.intervalEnd().getTime())) { + assertTrue("Unexpected pages count: " + view.pagesCount(), view.pagesCount() > 0); + + totalCnt += view.pagesCount(); + } + else + assertEquals(0, view.pagesCount()); + } + } + + assertTrue(totalCnt > 0); + assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), totalCnt); + + assertEquals(2, F.size(F.iterator(pagesTsHistogram, v -> v, true, v -> v.pagesCount() > 0))); + + // Check histogram after replacement. + long ts3 = curTime.addAndGet(PeriodicHistogramMetricImpl.DFLT_BUCKETS_INTERVAL); + GridTestClockTimer.update(); + + ignite.createCache(ccfg2); + + try (IgniteDataStreamer streamer = ignite.dataStreamer("test-pages-ts2")) { + for (int i = 0; i < keysCnt; i++) + streamer.addData(i, new byte[1000]); + } + + assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), + F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); + + assertFalse(F.isEmpty(F.iterator(pagesTsHistogram, v -> v, true, v -> v.pagesCount() > 0 && + v.intervalStart().getTime() <= ts3 && ts3 <= v.intervalEnd().getTime()))); + + // Check histogram after cache destroy and remove of outdated pages. + long ts4 = curTime.addAndGet(PeriodicHistogramMetricImpl.DFLT_BUCKETS_INTERVAL); + GridTestClockTimer.update(); + + ignite.destroyCache("test-pages-ts2"); + + IgniteCache cache2 = ignite.createCache(ccfg2); + + for (int i = 0; i < keysCnt; i++) { + cache1.put(i, i); + cache2.put(i, new byte[1000]); + } + + assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), + F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); + + assertFalse(F.isEmpty(F.iterator(pagesTsHistogram, v -> v, true, v -> v.pagesCount() > 0 && + v.intervalStart().getTime() <= ts4 && ts4 <= v.intervalEnd().getTime()))); + } + finally { + GridTestClockTimer.timeSupplier(GridTestClockTimer.DFLT_TIME_SUPPLIER); + } + } + + /** */ + @Test + public void testPagesTimestampHistogramAfterPartitionEviction() throws Exception { + int keysCnt = 50_000; + + String regionName = "default"; + + DataStorageConfiguration dsCfg = new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration() + .setMaxSize(50L * 1024 * 1024) + .setPersistenceEnabled(true) + .setName(regionName) + .setMetricsEnabled(true) + ); + + cleanPersistenceDir(); + + try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration(dsCfg))) { + ignite.cluster().state(ClusterState.ACTIVE); + + IgniteCache cache = ignite.createCache(new CacheConfiguration<>("test-pages-ts") + .setBackups(1).setAffinity(new RendezvousAffinityFunction(false, 10))); + + try (IgniteDataStreamer streamer = ignite.dataStreamer("test-pages-ts")) { + for (int i = 0; i < keysCnt; i++) + streamer.addData(i, new byte[1000]); + } + + startGrid(getConfiguration(getTestIgniteInstanceName(1)).setDataStorageConfiguration(dsCfg)); + startGrid(getConfiguration(getTestIgniteInstanceName(2)).setDataStorageConfiguration(dsCfg)); + + resetBaselineTopology(); + + awaitPartitionMapExchange(true, true, null); + + // Force checkpoint to invalidate evicted partitions. + forceCheckpoint(ignite); + + // Check histogram after partition eviction. + SystemView pagesTsHistogram = + ignite.context().systemView().view(PAGE_TS_HISTOGRAM_VIEW); + + assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), + F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); + + stopGrid(2); + + resetBaselineTopology(); + + // Wait until rebalance complete. + assertTrue(GridTestUtils.waitForCondition(() -> ignite.context().discovery().topologyVersionEx() + .minorTopologyVersion() >= 2, 5_000L)); + + // Check histogram after rebalance. + assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), + F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); + + stopGrid(1); + + resetBaselineTopology(); + + // Allocate some pages after eviction. + for (int i = 0; i < 10_000; i++) + cache.put(i + keysCnt, new byte[1024]); + + // Acquire some outdated pages. + for (int i = 0; i < keysCnt + 10_000; i++) + assertNotNull(cache.get(i)); + + // Check histogram after replacement of outdated pages. + assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), + F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); + } + finally { + stopAllGrids(); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPluginTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPluginTest.java new file mode 100644 index 0000000000000..7732c5f228834 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewPluginTest.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.stream.StreamSupport; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.plugin.AbstractTestPluginProvider; +import org.apache.ignite.plugin.IgnitePlugin; +import org.apache.ignite.spi.systemview.view.PluginView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor.PLUGINS_SYS_VIEW; + +/** Tests for {@link SystemView} for plugins. */ +public class SystemViewPluginTest extends SystemViewAbstractTest { + /** */ + @Test + public void testPluginView() throws Exception { + try (IgniteEx n = startGrid(getConfiguration().setPluginProviders(new TestPluginProvider()))) { + SystemView view = n.context().systemView().view(PLUGINS_SYS_VIEW); + + PluginView testPluginView = StreamSupport.stream(view.spliterator(), false) + .filter(v -> "FOR_SYS_VIEW_PLUGIN_NAME".equals(v.name())) + .findFirst() + .orElseThrow(() -> new AssertionError("Plugin not found")); + + assertEquals("FOR_SYS_VIEW_PLUGIN_NAME", testPluginView.name()); + assertEquals("FOR_SYS_VIEW_PLUGIN_INFO", testPluginView.info()); + assertEquals("42", testPluginView.version()); + assertEquals(TestPluginProvider.TestPlugin.class.getName(), testPluginView.className()); + } + } + + /** */ + private static class TestPluginProvider extends AbstractTestPluginProvider { + /** {@inheritDoc} */ + @Override public String name() { + return "FOR_SYS_VIEW_PLUGIN_NAME"; + } + + /** {@inheritDoc} */ + @Override public String version() { + return "42"; + } + + /** {@inheritDoc} */ + @Override public String info() { + return "FOR_SYS_VIEW_PLUGIN_INFO"; + } + + /** {@inheritDoc} */ + @Override public T plugin() { + return (T)new TestPlugin(); + } + + /** */ + private static class TestPlugin implements IgnitePlugin { + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewQueriesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewQueriesTest.java new file mode 100644 index 0000000000000..b444e8bb5780b --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewQueriesTest.java @@ -0,0 +1,312 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.List; +import java.util.function.Consumer; +import javax.cache.Cache; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.query.ContinuousQuery; +import org.apache.ignite.cache.query.QueryCursor; +import org.apache.ignite.cache.query.ScanQuery; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.lang.IgniteBiPredicate; +import org.apache.ignite.lang.IgniteClosure; +import org.apache.ignite.spi.systemview.view.ContinuousQueryView; +import org.apache.ignite.spi.systemview.view.ScanQueryView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.managers.systemview.ScanQuerySystemView.SCAN_QRY_SYS_VIEW; +import static org.apache.ignite.internal.processors.cache.GridCacheUtils.cacheGroupId; +import static org.apache.ignite.internal.processors.cache.GridCacheUtils.cacheId; +import static org.apache.ignite.internal.processors.continuous.GridContinuousProcessor.CQ_SYS_VIEW; +import static org.apache.ignite.internal.util.IgniteUtils.toStringSafe; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; + +/** Tests for {@link SystemView} for queries. */ +public class SystemViewQueriesTest extends SystemViewAbstractTest { + /** */ + public static final String TEST_PREDICATE = "TestPredicate"; + + /** */ + public static final String TEST_TRANSFORMER = "TestTransformer"; + + /** Tests work of {@link SystemView} for continuous queries. */ + @Test + public void testContinuousQuery() throws Exception { + try (IgniteEx originNode = startGrid(0); IgniteEx remoteNode = startGrid(1)) { + IgniteCache cache = originNode.createCache("cache-1"); + + SystemView origQrys = originNode.context().systemView().view(CQ_SYS_VIEW); + SystemView remoteQrys = remoteNode.context().systemView().view(CQ_SYS_VIEW); + + assertEquals(0, origQrys.size()); + assertEquals(0, remoteQrys.size()); + + try (QueryCursor qry = cache.query(new ContinuousQuery<>() + .setInitialQuery(new ScanQuery<>()) + .setPageSize(100) + .setTimeInterval(1000) + .setLocalListener(evts -> { + // No-op. + }) + .setRemoteFilterFactory(() -> evt -> true) + )) { + for (int i = 0; i < 100; i++) + cache.put(i, i); + + checkContinuousQueryView(originNode, origQrys, true); + checkContinuousQueryView(originNode, remoteQrys, false); + } + + assertEquals(0, origQrys.size()); + assertTrue(waitForCondition(() -> remoteQrys.size() == 0, getTestTimeout())); + } + } + + /** */ + private void checkContinuousQueryView(IgniteEx g, SystemView qrys, boolean loc) { + assertEquals(1, qrys.size()); + + for (ContinuousQueryView cq : qrys) { + assertEquals("cache-1", cq.cacheName()); + assertEquals(100, cq.bufferSize()); + assertEquals(1000, cq.interval()); + assertEquals(g.localNode().id(), cq.nodeId()); + + if (loc) + assertTrue(cq.localListener().startsWith(getClass().getName())); + else + assertNull(cq.localListener()); + + assertTrue(cq.remoteFilter().startsWith(getClass().getName())); + assertNull(cq.localTransformedListener()); + assertNull(cq.remoteTransformer()); + } + } + + /** Tests work of {@link SystemView} for local scan queries. */ + @Test + public void testLocalScanQuery() throws Exception { + try (IgniteEx g0 = startGrid(0)) { + IgniteCache cache1 = g0.createCache( + new CacheConfiguration("cache1") + .setGroupName("group1")); + + int part = g0.affinity("cache1").primaryPartitions(g0.localNode())[0]; + + List partKeys = partitionKeys(cache1, part, 11, 0); + + for (Integer key : partKeys) + cache1.put(key, key); + + SystemView qrySysView0 = g0.context().systemView().view(SCAN_QRY_SYS_VIEW); + + assertNotNull(qrySysView0); + + assertEquals(0, qrySysView0.size()); + + QueryCursor qryRes1 = cache1.query( + new ScanQuery() + .setFilter(new TestPredicate()) + .setLocal(true) + .setPartition(part) + .setPageSize(10), + new TestTransformer()); + + assertTrue(qryRes1.iterator().hasNext()); + + boolean res = waitForCondition(() -> qrySysView0.size() > 0, 5_000); + + assertTrue(res); + + ScanQueryView view = qrySysView0.iterator().next(); + + assertEquals(g0.localNode().id(), view.originNodeId()); + assertEquals(0, view.queryId()); + assertEquals("cache1", view.cacheName()); + assertEquals(cacheId("cache1"), view.cacheId()); + assertEquals(cacheGroupId("cache1", "group1"), view.cacheGroupId()); + assertEquals("group1", view.cacheGroupName()); + assertTrue(view.startTime() <= System.currentTimeMillis()); + assertTrue(view.duration() >= 0); + assertFalse(view.canceled()); + assertEquals(TEST_PREDICATE, view.filter()); + assertTrue(view.local()); + assertEquals(part, view.partition()); + assertEquals(toStringSafe(g0.context().discovery().topologyVersionEx()), view.topology()); + assertEquals(TEST_TRANSFORMER, view.transformer()); + assertFalse(view.keepBinary()); + assertNull(view.subjectId()); + assertNull(view.taskName()); + + qryRes1.close(); + + res = waitForCondition(() -> qrySysView0.size() == 0, 5_000); + + assertTrue(res); + } + } + + /** Tests work of {@link SystemView} for scan queries. */ + @Test + public void testScanQuery() throws Exception { + try (IgniteEx g0 = startGrid(0); + IgniteEx g1 = startGrid(1); + IgniteEx client1 = startClientGrid("client-1"); + IgniteEx client2 = startClientGrid("client-2")) { + + IgniteCache cache1 = client1.createCache( + new CacheConfiguration("cache1") + .setGroupName("group1")); + + IgniteCache cache2 = client2.createCache("cache2"); + + for (int i = 0; i < 100; i++) { + cache1.put(i, i); + cache2.put(i, i); + } + + SystemView qrySysView0 = g0.context().systemView().view(SCAN_QRY_SYS_VIEW); + SystemView qrySysView1 = g1.context().systemView().view(SCAN_QRY_SYS_VIEW); + + assertNotNull(qrySysView0); + assertNotNull(qrySysView1); + + assertEquals(0, qrySysView0.size()); + assertEquals(0, qrySysView1.size()); + + QueryCursor qryRes1 = cache1.query( + new ScanQuery() + .setFilter(new TestPredicate()) + .setPageSize(10), + new TestTransformer()); + + QueryCursor qryRes2 = cache2.withKeepBinary().query(new ScanQuery<>() + .setPageSize(20)); + + assertTrue(qryRes1.iterator().hasNext()); + assertTrue(qryRes2.iterator().hasNext()); + + checkScanQueryView(client1, client2, qrySysView0); + checkScanQueryView(client1, client2, qrySysView1); + + qryRes1.close(); + qryRes2.close(); + + boolean res = waitForCondition( + () -> qrySysView0.size() + qrySysView1.size() == 0, 5_000); + + assertTrue(res); + } + } + + /** */ + private void checkScanQueryView(IgniteEx client1, IgniteEx client2, SystemView qrySysView) + throws Exception { + boolean res = waitForCondition(() -> qrySysView.size() > 1, 5_000); + + assertTrue(res); + + Consumer cache1checker = view -> { + assertEquals(client1.localNode().id(), view.originNodeId()); + assertTrue(view.queryId() != 0); + assertEquals("cache1", view.cacheName()); + assertEquals(cacheId("cache1"), view.cacheId()); + assertEquals(cacheGroupId("cache1", "group1"), view.cacheGroupId()); + assertEquals("group1", view.cacheGroupName()); + assertTrue(view.startTime() <= System.currentTimeMillis()); + assertTrue(view.duration() >= 0); + assertFalse(view.canceled()); + assertEquals(TEST_PREDICATE, view.filter()); + assertFalse(view.local()); + assertEquals(-1, view.partition()); + assertEquals(toStringSafe(client1.context().discovery().topologyVersionEx()), view.topology()); + assertEquals(TEST_TRANSFORMER, view.transformer()); + assertFalse(view.keepBinary()); + assertNull(view.subjectId()); + assertNull(view.taskName()); + assertEquals(10, view.pageSize()); + }; + + Consumer cache2checker = view -> { + assertEquals(client2.localNode().id(), view.originNodeId()); + assertTrue(view.queryId() != 0); + assertEquals("cache2", view.cacheName()); + assertEquals(cacheId("cache2"), view.cacheId()); + assertEquals(cacheGroupId("cache2", null), view.cacheGroupId()); + assertEquals("cache2", view.cacheGroupName()); + assertTrue(view.startTime() <= System.currentTimeMillis()); + assertTrue(view.duration() >= 0); + assertFalse(view.canceled()); + assertNull(view.filter()); + assertFalse(view.local()); + assertEquals(-1, view.partition()); + assertEquals(toStringSafe(client2.context().discovery().topologyVersionEx()), view.topology()); + assertNull(view.transformer()); + assertTrue(view.keepBinary()); + assertNull(view.subjectId()); + assertNull(view.taskName()); + assertEquals(20, view.pageSize()); + }; + + boolean found1 = false; + boolean found2 = false; + + for (ScanQueryView view : qrySysView) { + if ("cache2".equals(view.cacheName())) { + cache2checker.accept(view); + found1 = true; + } + else { + cache1checker.accept(view); + found2 = true; + } + } + + assertTrue(found1 && found2); + } + + /** Test predicate. */ + public static class TestPredicate implements IgniteBiPredicate { + /** {@inheritDoc} */ + @Override public boolean apply(Integer integer, Integer integer2) { + return true; + } + + /** {@inheritDoc} */ + @Override public String toString() { + return TEST_PREDICATE; + } + } + + /** Test transformer. */ + public static class TestTransformer implements IgniteClosure, Integer> { + /** {@inheritDoc} */ + @Override public Integer apply(Cache.Entry entry) { + return entry.getKey(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return TEST_TRANSFORMER; + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java deleted file mode 100644 index c8d08036d4a8e..0000000000000 --- a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java +++ /dev/null @@ -1,2754 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.metric; - -import java.lang.reflect.Field; -import java.sql.Connection; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.concurrent.BrokenBarrierException; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; -import javax.cache.Cache; -import javax.cache.expiry.CreatedExpiryPolicy; -import javax.cache.expiry.Duration; -import javax.cache.expiry.EternalExpiryPolicy; -import javax.cache.expiry.ModifiedExpiryPolicy; -import com.google.common.collect.Lists; -import org.apache.ignite.IgniteAtomicLong; -import org.apache.ignite.IgniteAtomicReference; -import org.apache.ignite.IgniteAtomicSequence; -import org.apache.ignite.IgniteAtomicStamped; -import org.apache.ignite.IgniteCache; -import org.apache.ignite.IgniteCompute; -import org.apache.ignite.IgniteCountDownLatch; -import org.apache.ignite.IgniteDataStreamer; -import org.apache.ignite.IgniteException; -import org.apache.ignite.IgniteJdbcThinDriver; -import org.apache.ignite.IgniteLock; -import org.apache.ignite.IgniteQueue; -import org.apache.ignite.IgniteSemaphore; -import org.apache.ignite.IgniteSet; -import org.apache.ignite.Ignition; -import org.apache.ignite.cache.CacheAtomicityMode; -import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; -import org.apache.ignite.cache.query.ContinuousQuery; -import org.apache.ignite.cache.query.QueryCursor; -import org.apache.ignite.cache.query.ScanQuery; -import org.apache.ignite.client.Config; -import org.apache.ignite.client.IgniteClient; -import org.apache.ignite.cluster.ClusterNode; -import org.apache.ignite.cluster.ClusterState; -import org.apache.ignite.compute.ComputeJob; -import org.apache.ignite.compute.ComputeJobResult; -import org.apache.ignite.compute.ComputeJobResultPolicy; -import org.apache.ignite.compute.ComputeTask; -import org.apache.ignite.configuration.AtomicConfiguration; -import org.apache.ignite.configuration.CacheConfiguration; -import org.apache.ignite.configuration.ClientConfiguration; -import org.apache.ignite.configuration.CollectionConfiguration; -import org.apache.ignite.configuration.DataRegionConfiguration; -import org.apache.ignite.configuration.DataStorageConfiguration; -import org.apache.ignite.configuration.IgniteConfiguration; -import org.apache.ignite.internal.IgniteEx; -import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectAllTypes; -import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectEnum; -import org.apache.ignite.internal.client.thin.ProtocolVersion; -import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; -import org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager; -import org.apache.ignite.internal.processors.cache.persistence.freelist.PagesList; -import org.apache.ignite.internal.processors.metastorage.DistributedMetaStorage; -import org.apache.ignite.internal.processors.metric.impl.PeriodicHistogramMetricImpl; -import org.apache.ignite.internal.processors.odbc.jdbc.JdbcConnectionContext; -import org.apache.ignite.internal.processors.service.DummyService; -import org.apache.ignite.internal.processors.task.GridInternal; -import org.apache.ignite.internal.systemview.BaselineNodeAttributeViewWalker; -import org.apache.ignite.internal.systemview.CachePagesListViewWalker; -import org.apache.ignite.internal.systemview.ClientConnectionAttributeViewWalker; -import org.apache.ignite.internal.systemview.MetastorageViewWalker; -import org.apache.ignite.internal.systemview.NodeAttributeViewWalker; -import org.apache.ignite.internal.thread.pool.IgniteStripedExecutor; -import org.apache.ignite.internal.util.GridTestClockTimer; -import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.T2; -import org.apache.ignite.internal.util.typedef.internal.CU; -import org.apache.ignite.internal.util.typedef.internal.U; -import org.apache.ignite.lang.IgniteBiPredicate; -import org.apache.ignite.lang.IgniteCallable; -import org.apache.ignite.lang.IgniteClosure; -import org.apache.ignite.lang.IgnitePredicate; -import org.apache.ignite.lang.IgniteRunnable; -import org.apache.ignite.lang.IgniteUuid; -import org.apache.ignite.plugin.AbstractTestPluginProvider; -import org.apache.ignite.plugin.IgnitePlugin; -import org.apache.ignite.services.ServiceConfiguration; -import org.apache.ignite.spi.systemview.view.BaselineNodeAttributeView; -import org.apache.ignite.spi.systemview.view.BaselineNodeView; -import org.apache.ignite.spi.systemview.view.BinaryMetadataView; -import org.apache.ignite.spi.systemview.view.CacheGroupIoView; -import org.apache.ignite.spi.systemview.view.CacheGroupView; -import org.apache.ignite.spi.systemview.view.CachePagesListView; -import org.apache.ignite.spi.systemview.view.CacheView; -import org.apache.ignite.spi.systemview.view.ClientConnectionAttributeView; -import org.apache.ignite.spi.systemview.view.ClientConnectionView; -import org.apache.ignite.spi.systemview.view.ClusterNodeView; -import org.apache.ignite.spi.systemview.view.ComputeJobView; -import org.apache.ignite.spi.systemview.view.ComputeTaskView; -import org.apache.ignite.spi.systemview.view.ConfigurationView; -import org.apache.ignite.spi.systemview.view.ContinuousQueryView; -import org.apache.ignite.spi.systemview.view.FiltrableSystemView; -import org.apache.ignite.spi.systemview.view.MetastorageView; -import org.apache.ignite.spi.systemview.view.NodeAttributeView; -import org.apache.ignite.spi.systemview.view.NodeMetricsView; -import org.apache.ignite.spi.systemview.view.PagesListView; -import org.apache.ignite.spi.systemview.view.PagesTimestampHistogramView; -import org.apache.ignite.spi.systemview.view.PluginView; -import org.apache.ignite.spi.systemview.view.ScanQueryView; -import org.apache.ignite.spi.systemview.view.ServiceView; -import org.apache.ignite.spi.systemview.view.SnapshotView; -import org.apache.ignite.spi.systemview.view.StripedExecutorTaskView; -import org.apache.ignite.spi.systemview.view.SystemView; -import org.apache.ignite.spi.systemview.view.TransactionView; -import org.apache.ignite.spi.systemview.view.datastructures.AtomicLongView; -import org.apache.ignite.spi.systemview.view.datastructures.AtomicReferenceView; -import org.apache.ignite.spi.systemview.view.datastructures.AtomicSequenceView; -import org.apache.ignite.spi.systemview.view.datastructures.AtomicStampedView; -import org.apache.ignite.spi.systemview.view.datastructures.CountDownLatchView; -import org.apache.ignite.spi.systemview.view.datastructures.QueueView; -import org.apache.ignite.spi.systemview.view.datastructures.ReentrantLockView; -import org.apache.ignite.spi.systemview.view.datastructures.SemaphoreView; -import org.apache.ignite.spi.systemview.view.datastructures.SetView; -import org.apache.ignite.testframework.GridTestUtils; -import org.apache.ignite.testframework.junits.WithSystemProperty; -import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; -import org.apache.ignite.transactions.Transaction; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.junit.Test; - -import static org.apache.ignite.IgniteSystemProperties.IGNITE_DATA_CENTER_ID; -import static org.apache.ignite.configuration.AtomicConfiguration.DFLT_ATOMIC_SEQUENCE_RESERVE_SIZE; -import static org.apache.ignite.events.EventType.EVT_CONSISTENCY_VIOLATION; -import static org.apache.ignite.internal.IgniteKernal.CFG_VIEW; -import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.NODES_SYS_VIEW; -import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.NODE_ATTRIBUTES_SYS_VIEW; -import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.NODE_METRICS_SYS_VIEW; -import static org.apache.ignite.internal.managers.systemview.ScanQuerySystemView.SCAN_QRY_SYS_VIEW; -import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHES_VIEW; -import static org.apache.ignite.internal.processors.cache.ClusterCachesInfo.CACHE_GRPS_VIEW; -import static org.apache.ignite.internal.processors.cache.GridCacheProcessor.CACHE_GRP_IO_VIEW; -import static org.apache.ignite.internal.processors.cache.GridCacheProcessor.CACHE_GRP_PAGE_LIST_VIEW; -import static org.apache.ignite.internal.processors.cache.GridCacheUtils.cacheGroupId; -import static org.apache.ignite.internal.processors.cache.GridCacheUtils.cacheId; -import static org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl.BINARY_METADATA_VIEW; -import static org.apache.ignite.internal.processors.cache.persistence.DataStorageMetricsImpl.DATASTORAGE_METRIC_PREFIX; -import static org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.METASTORE_VIEW; -import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.DATA_REGION_PAGE_LIST_VIEW; -import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.PAGE_TS_HISTOGRAM_VIEW; -import static org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage.METASTORAGE_CACHE_NAME; -import static org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager.TXS_MON_LIST; -import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.BASELINE_NODES_SYS_VIEW; -import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.BASELINE_NODE_ATTRIBUTES_SYS_VIEW; -import static org.apache.ignite.internal.processors.continuous.GridContinuousProcessor.CQ_SYS_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.DEFAULT_DS_GROUP_NAME; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.DEFAULT_VOLATILE_DS_GROUP_NAME; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.LATCHES_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.LOCKS_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.LONGS_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.QUEUES_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.REFERENCES_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.SEMAPHORES_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.SEQUENCES_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.SETS_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.STAMPED_VIEW; -import static org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.VOLATILE_DATA_REGION_NAME; -import static org.apache.ignite.internal.processors.job.GridJobProcessor.JOBS_VIEW; -import static org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageImpl.DISTRIBUTED_METASTORE_VIEW; -import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; -import static org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_ATTR_VIEW; -import static org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_VIEW; -import static org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor.PLUGINS_SYS_VIEW; -import static org.apache.ignite.internal.processors.pool.PoolProcessor.STREAM_POOL_QUEUE_VIEW; -import static org.apache.ignite.internal.processors.pool.PoolProcessor.SYS_POOL_QUEUE_VIEW; -import static org.apache.ignite.internal.processors.service.IgniteServiceProcessor.SVCS_VIEW; -import static org.apache.ignite.internal.processors.task.GridTaskProcessor.TASKS_VIEW; -import static org.apache.ignite.internal.util.IgniteUtils.MB; -import static org.apache.ignite.internal.util.IgniteUtils.toStringSafe; -import static org.apache.ignite.internal.util.lang.GridFunc.alwaysTrue; -import static org.apache.ignite.internal.util.lang.GridFunc.identity; -import static org.apache.ignite.spi.systemview.view.SnapshotView.SNAPSHOT_SYS_VIEW; -import static org.apache.ignite.testframework.GridTestUtils.runAsync; -import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; -import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC; -import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; -import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ; -import static org.apache.ignite.transactions.TransactionIsolation.SERIALIZABLE; -import static org.apache.ignite.transactions.TransactionState.ACTIVE; - -/** Tests for {@link SystemView}. */ -public class SystemViewSelfTest extends GridCommonAbstractTest { - /** */ - public static final String TEST_PREDICATE = "TestPredicate"; - - /** */ - public static final String TEST_TRANSFORMER = "TestTransformer"; - - /** */ - private static CountDownLatch jobStartedLatch; - - /** */ - private static CountDownLatch releaseJobLatch; - - /** {@inheritDoc} */ - @Override protected void beforeTestsStarted() throws Exception { - super.beforeTestsStarted(); - - cleanPersistenceDir(); - } - - /** {@inheritDoc} */ - @Override protected void afterTestsStopped() throws Exception { - super.afterTestsStopped(); - - cleanPersistenceDir(); - } - - /** Tests work of {@link SystemView} for caches. */ - @Test - public void testCachesView() throws Exception { - try (IgniteEx g = startGrid()) { - Set cacheNames = new HashSet<>(Arrays.asList("cache-1", "cache-2")); - - for (String name : cacheNames) - g.createCache(name); - - SystemView caches = g.context().systemView().view(CACHES_VIEW); - - assertEquals(g.context().cache().cacheDescriptors().size(), F.size(caches.iterator())); - - for (CacheView row : caches) - cacheNames.remove(row.cacheName()); - - assertTrue(cacheNames.toString(), cacheNames.isEmpty()); - } - } - - /** Tests work of {@link SystemView} for cache groups. */ - @Test - public void testCacheGroupsView() throws Exception { - try (IgniteEx g = startGrid()) { - Set grpNames = new HashSet<>(Arrays.asList("grp-1", "grp-2")); - - for (String grpName : grpNames) - g.createCache(new CacheConfiguration<>("cache-" + grpName).setGroupName(grpName)); - - SystemView grps = g.context().systemView().view(CACHE_GRPS_VIEW); - - assertEquals(g.context().cache().cacheGroupDescriptors().size(), F.size(grps.iterator())); - - for (CacheGroupView row : grps) - grpNames.remove(row.cacheGroupName()); - - assertTrue(grpNames.toString(), grpNames.isEmpty()); - } - } - - /** Tests work of {@link SystemView} for cache expiry policy info with in-memory configuration. */ - @Test - public void testCacheViewExpiryPolicyWithInMemory() throws Exception { - testCacheViewExpiryPolicy(false); - } - - /** Tests work of {@link SystemView} for cache expiry policy info with persist configuration. */ - @Test - public void testCacheViewExpiryPolicyWithPersist() throws Exception { - testCacheViewExpiryPolicy(true); - } - - /** Tests work of {@link SystemView} for cache groups expiry policy info. */ - private void testCacheViewExpiryPolicy(boolean withPersistence) throws Exception { - try (IgniteEx g = !withPersistence ? startGrid() : startGrid(getConfiguration().setDataStorageConfiguration( - new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration().setPersistenceEnabled(true) - )))) { - - if (withPersistence) - g.cluster().state(ClusterState.ACTIVE); - - String eternalCacheName = "eternalCache"; - String createdCacheName = "createdCache"; - String eagerTtlCacheName = "eagerTtlCache"; - String withoutGrpCacheName = "withoutGrpCache"; - String dfltCacheName = "defaultCache"; - - CacheConfiguration eternalCache = new CacheConfiguration(eternalCacheName) - .setGroupName("group1") - .setExpiryPolicyFactory(EternalExpiryPolicy.factoryOf()); - - CacheConfiguration createdCache = new CacheConfiguration(createdCacheName) - .setGroupName("group2") - .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, 500L))); - - CacheConfiguration eagerTtlCache = new CacheConfiguration(eagerTtlCacheName) - .setGroupName("group2") - .setEagerTtl(false) - .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, 500L))); - - CacheConfiguration withoutGrpCache = new CacheConfiguration(withoutGrpCacheName) - .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, 500L))); - - CacheConfiguration dfltCache = new CacheConfiguration(dfltCacheName) - .setGroupName("group3"); - - g.createCache(eternalCache); - g.createCache(createdCache); - g.createCache(eagerTtlCache); - g.createCache(withoutGrpCache); - g.createCache(dfltCache); - - SystemView caches = g.context().systemView().view(CACHES_VIEW); - - for (CacheView row : caches) { - switch (row.cacheName()) { - case "defaultCache": - case "eternalCache": - assertEquals("No", row.hasExpiringEntries()); - - g.cache(row.cacheName()).put(0, 0); - - assertEquals("No", row.hasExpiringEntries()); - - g.cache(row.cacheName()) - .withExpiryPolicy(new CreatedExpiryPolicy(new Duration(TimeUnit.MILLISECONDS, 200L))) - .put(1, 1); - - assertEquals("Yes", row.hasExpiringEntries()); - assertTrue(waitForCondition(() -> "No".equals(row.hasExpiringEntries()), getTestTimeout())); - - break; - - case "withoutGrpCache": - case "createdCache": - assertEquals("No", row.hasExpiringEntries()); - - g.cache(row.cacheName()).put(0, 0); - - assertEquals("Yes", row.hasExpiringEntries()); - assertTrue(waitForCondition(() -> "No".equals(row.hasExpiringEntries()), getTestTimeout())); - - g.cache(row.cacheName()) - .withExpiryPolicy(new ModifiedExpiryPolicy(new Duration(TimeUnit.MILLISECONDS, 200L))) - .put(1, 1); - - assertEquals("Yes", row.hasExpiringEntries()); - assertTrue(waitForCondition(() -> "No".equals(row.hasExpiringEntries()), getTestTimeout())); - - if (row.cacheName().equals(createdCacheName)) { - g.cache(eagerTtlCacheName).put(2, 2); - assertEquals("No", row.hasExpiringEntries()); - } - - break; - - case "eagerTtlCache": - assertEquals("Unknown", row.hasExpiringEntries()); - - break; - } - } - } - } - - /** Tests work of {@link SystemView} for services. */ - @Test - public void testServices() throws Exception { - try (IgniteEx g = startGrid()) { - { - ServiceConfiguration srvcCfg = new ServiceConfiguration(); - - srvcCfg.setName("service"); - srvcCfg.setMaxPerNodeCount(1); - srvcCfg.setService(new DummyService()); - srvcCfg.setNodeFilter(new TestNodeFilter()); - - g.services().deploy(srvcCfg); - - SystemView srvs = g.context().systemView().view(SVCS_VIEW); - - assertEquals(g.context().service().serviceDescriptors().size(), F.size(srvs.iterator())); - - ServiceView sview = srvs.iterator().next(); - - assertEquals(srvcCfg.getName(), sview.name()); - assertNotNull(sview.serviceId()); - assertEquals(DummyService.class, sview.serviceClass()); - assertEquals(srvcCfg.getMaxPerNodeCount(), sview.maxPerNodeCount()); - assertNull(sview.cacheName()); - assertNull(sview.affinityKey()); - assertEquals(TestNodeFilter.class, sview.nodeFilter()); - assertFalse(sview.staticallyConfigured()); - assertEquals(g.localNode().id(), sview.originNodeId()); - assertEquals(F.asMap(g.localNode().id(), 1), sview.topologySnapshot()); - } - - { - g.createCache("test-cache"); - - ServiceConfiguration srvcCfg = new ServiceConfiguration(); - - srvcCfg.setName("service-2"); - srvcCfg.setMaxPerNodeCount(2); - srvcCfg.setService(new DummyService()); - srvcCfg.setNodeFilter(new TestNodeFilter()); - srvcCfg.setCacheName("test-cache"); - srvcCfg.setAffinityKey(1L); - - g.services().deploy(srvcCfg); - - final ServiceView[] sview = {null}; - - g.context().systemView().view(SVCS_VIEW).forEach(sv -> { - if (sv.name().equals(srvcCfg.getName())) - sview[0] = sv; - }); - - assertEquals(srvcCfg.getName(), sview[0].name()); - assertNotNull(sview[0].serviceId()); - assertEquals(DummyService.class, sview[0].serviceClass()); - assertEquals(srvcCfg.getMaxPerNodeCount(), sview[0].maxPerNodeCount()); - assertEquals("test-cache", sview[0].cacheName()); - assertEquals("1", sview[0].affinityKey()); - assertEquals(TestNodeFilter.class, sview[0].nodeFilter()); - assertFalse(sview[0].staticallyConfigured()); - assertEquals(g.localNode().id(), sview[0].originNodeId()); - assertEquals(F.asMap(g.localNode().id(), 2), sview[0].topologySnapshot()); - } - } - } - - /** Tests work of {@link SystemView} for compute grid {@link IgniteCompute#broadcastAsync(IgniteRunnable)} call. */ - @Test - public void testComputeBroadcast() throws Exception { - CyclicBarrier barrier = new CyclicBarrier(6); - - try (IgniteEx g1 = startGrid(0)) { - SystemView tasks = g1.context().systemView().view(TASKS_VIEW); - - for (int i = 0; i < 5; i++) { - g1.compute().broadcastAsync(() -> { - try { - barrier.await(); - barrier.await(); - } - catch (InterruptedException | BrokenBarrierException e) { - throw new RuntimeException(e); - } - }); - } - - barrier.await(); - - assertEquals(5, tasks.size()); - - ComputeTaskView t = tasks.iterator().next(); - - assertFalse(t.internal()); - assertNull(t.affinityCacheName()); - assertEquals(-1, t.affinityPartitionId()); - assertTrue(t.taskClassName().startsWith(getClass().getName())); - assertTrue(t.taskName().startsWith(getClass().getName())); - assertEquals(g1.localNode().id(), t.taskNodeId()); - assertEquals("0", t.userVersion()); - - barrier.await(); - } - } - - /** Tests work of {@link SystemView} for compute grid {@link IgniteCompute#runAsync(IgniteRunnable)} call. */ - @Test - public void testComputeRunnable() throws Exception { - CyclicBarrier barrier = new CyclicBarrier(2); - - try (IgniteEx g1 = startGrid(0)) { - SystemView tasks = g1.context().systemView().view(TASKS_VIEW); - - g1.compute().runAsync(() -> { - try { - barrier.await(); - barrier.await(); - } - catch (InterruptedException | BrokenBarrierException e) { - throw new RuntimeException(e); - } - }); - - barrier.await(); - - assertEquals(1, tasks.size()); - - ComputeTaskView t = tasks.iterator().next(); - - assertFalse(t.internal()); - assertNull(t.affinityCacheName()); - assertEquals(-1, t.affinityPartitionId()); - assertTrue(t.taskClassName().startsWith(getClass().getName())); - assertTrue(t.taskName().startsWith(getClass().getName())); - assertEquals(g1.localNode().id(), t.taskNodeId()); - assertEquals("0", t.userVersion()); - - barrier.await(); - } - } - - /** Tests work of {@link SystemView} for compute grid {@link IgniteCompute#apply(IgniteClosure, Object)} call. */ - @Test - public void testComputeApply() throws Exception { - CyclicBarrier barrier = new CyclicBarrier(2); - - try (IgniteEx g1 = startGrid(0)) { - SystemView tasks = g1.context().systemView().view(TASKS_VIEW); - - GridTestUtils.runAsync(() -> { - g1.compute().apply(x -> { - try { - barrier.await(); - barrier.await(); - } - catch (InterruptedException | BrokenBarrierException e) { - throw new RuntimeException(e); - } - - return 0; - }, 1); - }); - - barrier.await(); - - assertEquals(1, tasks.size()); - - ComputeTaskView t = tasks.iterator().next(); - - assertFalse(t.internal()); - assertNull(t.affinityCacheName()); - assertEquals(-1, t.affinityPartitionId()); - assertTrue(t.taskClassName().startsWith(getClass().getName())); - assertTrue(t.taskName().startsWith(getClass().getName())); - assertEquals(g1.localNode().id(), t.taskNodeId()); - assertEquals("0", t.userVersion()); - - barrier.await(); - } - } - - /** - * Tests work of {@link SystemView} for compute grid - * {@link IgniteCompute#affinityCallAsync(String, Object, IgniteCallable)} call. - */ - @Test - public void testComputeAffinityCall() throws Exception { - CyclicBarrier barrier = new CyclicBarrier(2); - - try (IgniteEx g1 = startGrid(0)) { - SystemView tasks = g1.context().systemView().view(TASKS_VIEW); - - IgniteCache cache = g1.createCache("test-cache"); - - cache.put(1, 1); - - g1.compute().affinityCallAsync("test-cache", 1, () -> { - try { - barrier.await(); - barrier.await(); - } - catch (InterruptedException e) { - throw new RuntimeException(e); - } - - return 0; - }); - - barrier.await(); - - assertEquals(1, tasks.size()); - - ComputeTaskView t = tasks.iterator().next(); - - assertFalse(t.internal()); - assertEquals("test-cache", t.affinityCacheName()); - assertEquals(1, t.affinityPartitionId()); - assertTrue(t.taskClassName().startsWith(getClass().getName())); - assertTrue(t.taskName().startsWith(getClass().getName())); - assertEquals(g1.localNode().id(), t.taskNodeId()); - assertEquals("0", t.userVersion()); - - barrier.await(); - } - } - - /** */ - @Test - public void testComputeTask() throws Exception { - doTestComputeTask(false); - } - - /** */ - @Test - public void testInternalComputeTask() throws Exception { - doTestComputeTask(true); - } - - /** */ - private void doTestComputeTask(boolean internal) throws Exception { - int gridCnt = 3; - - IgniteEx g1 = startGrids(gridCnt); - - try { - IgniteCache cache = g1.createCache("test-cache"); - - cache.put(1, 1); - - for (int i = 0; i < gridCnt; i++) { - IgniteEx grid = grid(i); - - SystemView tasks = grid.context().systemView().view(TASKS_VIEW); - - jobStartedLatch = new CountDownLatch(3); - releaseJobLatch = new CountDownLatch(1); - - IgniteInternalFuture fut - = runAsync(() -> grid.compute().execute(internal ? new InternalTask() : new UserTask(), 1)); - - assertTrue(jobStartedLatch.await(30_000, TimeUnit.MILLISECONDS)); - - try { - assertEquals(1, tasks.size()); - - ComputeTaskView t = tasks.iterator().next(); - - assertEquals("Expecting to see " + (internal ? "internal" : "user") + " task", internal, t.internal()); - assertNull(t.affinityCacheName()); - assertEquals(-1, t.affinityPartitionId()); - assertTrue(t.taskClassName().startsWith(getClass().getName())); - assertTrue(t.taskName().startsWith(getClass().getName())); - assertEquals(grid.localNode().id(), t.taskNodeId()); - assertEquals("0", t.userVersion()); - - checkJobs(gridCnt, internal, t.sessionId()); - } - finally { - releaseJobLatch.countDown(); - } - - fut.get(getTestTimeout(), TimeUnit.MILLISECONDS); - } - } - finally { - stopAllGrids(); - } - } - - /** */ - private void checkJobs(int gridCnt, boolean internal, IgniteUuid sesId) { - for (int i = 0; i < gridCnt; i++) { - SystemView jobs = grid(i).context().systemView().view(JOBS_VIEW); - - assertTrue("Expecting to see " + (internal ? "internal" : "user") + " job", jobs.size() > 0); - - ComputeJobView job = jobs.iterator().next(); - - assertEquals(sesId, job.sessionId()); - assertEquals("Expecting to see " + (internal ? "internal" : "user") + " job", internal, job.isInternal()); - } - - releaseJobLatch.countDown(); - } - - /** */ - @Test - public void testClientsConnections() throws Exception { - try (IgniteEx g0 = startGrid(0)) { - String host = g0.configuration().getClientConnectorConfiguration().getHost(); - - if (host == null) - host = g0.configuration().getLocalHost(); - - int port = g0.configuration().getClientConnectorConfiguration().getPort(); - - SystemView conns = g0.context().systemView().view(CLI_CONN_VIEW); - - try (IgniteClient cli = Ignition.startClient(new ClientConfiguration().setAddresses(host + ":" + port))) { - assertEquals(1, conns.size()); - - ClientConnectionView cliConn = conns.iterator().next(); - - assertEquals("THIN", cliConn.type()); - assertEquals(cliConn.localAddress().getHostName(), cliConn.remoteAddress().getHostName()); - assertEquals(g0.configuration().getClientConnectorConfiguration().getPort(), - cliConn.localAddress().getPort()); - assertEquals(cliConn.version(), ProtocolVersion.LATEST_VER.toString()); - - try (Connection conn = - new IgniteJdbcThinDriver().connect("jdbc:ignite:thin://" + host, new Properties())) { - assertEquals(2, conns.size()); - assertEquals(1, F.size(jdbcConnectionsIterator(conns))); - - ClientConnectionView jdbcConn = jdbcConnectionsIterator(conns).next(); - - assertEquals("JDBC", jdbcConn.type()); - assertEquals(jdbcConn.localAddress().getHostName(), jdbcConn.remoteAddress().getHostName()); - assertEquals(g0.configuration().getClientConnectorConfiguration().getPort(), - jdbcConn.localAddress().getPort()); - assertEquals(jdbcConn.version(), JdbcConnectionContext.CURRENT_VER.asString()); - } - } - - boolean res = GridTestUtils.waitForCondition(() -> conns.size() == 0, 5_000); - - assertTrue(res); - } - } - - /** */ - @Test - public void testClientConnectionAttributes() throws Exception { - try (IgniteEx g0 = startGrid(0)) { - SystemView view = g0.context().systemView().view(CLI_CONN_ATTR_VIEW); - - try ( - IgniteClient cl1 = Ignition.startClient(new ClientConfiguration().setAddresses(Config.SERVER) - .setUserAttributes(F.asMap("attr1", "val1", "attr2", "val2"))); - IgniteClient cl2 = Ignition.startClient(new ClientConfiguration().setAddresses(Config.SERVER) - .setUserAttributes(F.asMap("attr1", "val2"))); - IgniteClient cl3 = Ignition.startClient(new ClientConfiguration().setAddresses(Config.SERVER)) - ) { - assertEquals(3, F.size(view.iterator())); - - assertEquals(1, F.size(view.iterator(), row -> - "attr1".equals(row.name()) && "val1".equals(row.value()))); - - // Test filtering. - assertTrue(view instanceof FiltrableSystemView); - - Iterator iter = ((FiltrableSystemView)view) - .iterator(F.asMap(ClientConnectionAttributeViewWalker.NAME_FILTER, "attr1")); - - assertEquals(2, F.size(iter)); - - iter = ((FiltrableSystemView)view).iterator( - F.asMap(ClientConnectionAttributeViewWalker.NAME_FILTER, "attr2")); - - assertTrue(iter.hasNext()); - - long connId = iter.next().connectionId(); - - assertFalse(iter.hasNext()); - - iter = ((FiltrableSystemView)view).iterator( - F.asMap(ClientConnectionAttributeViewWalker.CONNECTION_ID_FILTER, connId)); - - assertEquals(2, F.size(iter)); - } - } - } - - /** */ - @Test - public void testContinuousQuery() throws Exception { - try (IgniteEx originNode = startGrid(0); IgniteEx remoteNode = startGrid(1)) { - IgniteCache cache = originNode.createCache("cache-1"); - - SystemView origQrys = originNode.context().systemView().view(CQ_SYS_VIEW); - SystemView remoteQrys = remoteNode.context().systemView().view(CQ_SYS_VIEW); - - assertEquals(0, origQrys.size()); - assertEquals(0, remoteQrys.size()); - - try (QueryCursor qry = cache.query(new ContinuousQuery<>() - .setInitialQuery(new ScanQuery<>()) - .setPageSize(100) - .setTimeInterval(1000) - .setLocalListener(evts -> { - // No-op. - }) - .setRemoteFilterFactory(() -> evt -> true) - )) { - for (int i = 0; i < 100; i++) - cache.put(i, i); - - checkContinuousQueryView(originNode, origQrys, true); - checkContinuousQueryView(originNode, remoteQrys, false); - } - - assertEquals(0, origQrys.size()); - assertTrue(waitForCondition(() -> remoteQrys.size() == 0, getTestTimeout())); - } - } - - /** */ - private void checkContinuousQueryView(IgniteEx g, SystemView qrys, boolean loc) { - assertEquals(1, qrys.size()); - - for (ContinuousQueryView cq : qrys) { - assertEquals("cache-1", cq.cacheName()); - assertEquals(100, cq.bufferSize()); - assertEquals(1000, cq.interval()); - assertEquals(g.localNode().id(), cq.nodeId()); - - if (loc) - assertTrue(cq.localListener().startsWith(getClass().getName())); - else - assertNull(cq.localListener()); - - assertTrue(cq.remoteFilter().startsWith(getClass().getName())); - assertNull(cq.localTransformedListener()); - assertNull(cq.remoteTransformer()); - } - } - - /** */ - @Test - @WithSystemProperty(key = IGNITE_DATA_CENTER_ID, value = "DC0") - public void testNodes() throws Exception { - try (IgniteEx g1 = startGrid(0)) { - SystemView views = g1.context().systemView().view(NODES_SYS_VIEW); - - assertEquals(1, views.size()); - - try (IgniteEx g2 = startGrid(1)) { - awaitPartitionMapExchange(); - - checkViewsState(views, g1.localNode(), g2.localNode()); - checkViewsState(g2.context().systemView().view(NODES_SYS_VIEW), g2.localNode(), g1.localNode()); - } - - assertEquals(1, views.size()); - } - } - - /** */ - @Test - public void testNodeAttributes() throws Exception { - try ( - IgniteEx ignite0 = startGrid(getConfiguration(getTestIgniteInstanceName(0)) - .setUserAttributes(F.asMap("name", "val0"))); - IgniteEx ignite1 = startGrid(getConfiguration(getTestIgniteInstanceName(1)) - .setUserAttributes(F.asMap("name", "val1"))) - ) { - awaitPartitionMapExchange(); - - SystemView view = ignite0.context().systemView().view(NODE_ATTRIBUTES_SYS_VIEW); - - assertEquals(ignite0.cluster().localNode().attributes().size() + - ignite1.cluster().localNode().attributes().size(), view.size()); - - assertEquals(1, F.size(view.iterator(), row -> "name".equals(row.name()) && "val0".equals(row.value()))); - assertEquals(1, F.size(view.iterator(), row -> "name".equals(row.name()) && "val1".equals(row.value()))); - - // Test filtering. - assertTrue(view instanceof FiltrableSystemView); - - Iterator iter = ((FiltrableSystemView)view) - .iterator(F.asMap(NodeAttributeViewWalker.NODE_ID_FILTER, ignite0.cluster().localNode().id())); - - assertEquals(1, F.size(iter, row -> "name".equals(row.name()) && "val0".equals(row.value()))); - - iter = ((FiltrableSystemView)view).iterator( - F.asMap(NodeAttributeViewWalker.NODE_ID_FILTER, ignite1.cluster().localNode().id().toString())); - - assertEquals(1, F.size(iter, row -> "name".equals(row.name()) && "val1".equals(row.value()))); - - iter = ((FiltrableSystemView)view).iterator( - F.asMap(NodeAttributeViewWalker.NODE_ID_FILTER, "malformed-id")); - - assertEquals(0, F.size(iter)); - - iter = ((FiltrableSystemView)view).iterator( - F.asMap(NodeAttributeViewWalker.NAME_FILTER, "name")); - - assertEquals(2, F.size(iter)); - - iter = ((FiltrableSystemView)view) - .iterator(F.asMap(NodeAttributeViewWalker.NODE_ID_FILTER, ignite0.cluster().localNode().id(), - NodeAttributeViewWalker.NAME_FILTER, "name")); - - assertEquals(1, F.size(iter)); - } - } - - /** */ - @Test - public void testNodeMetrics() throws Exception { - long ts = U.currentTimeMillis(); - - try (IgniteEx ignite0 = startGrid(0); IgniteEx ignite1 = startGrid(1)) { - awaitPartitionMapExchange(); - - SystemView view = ignite0.context().systemView().view(NODE_METRICS_SYS_VIEW); - - assertEquals(2, view.size()); - assertEquals(1, F.size(view.iterator(), row -> row.nodeId().equals(ignite0.cluster().localNode().id()))); - assertEquals(1, F.size(view.iterator(), row -> row.nodeId().equals(ignite1.cluster().localNode().id()))); - assertEquals(2, F.size(view.iterator(), row -> row.lastUpdateTime().getTime() >= ts)); - } - } - - /** */ - @Test - public void testCacheGroupIo() throws Exception { - cleanPersistenceDir(); - - try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration( - new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration().setPersistenceEnabled(true)))) - ) { - ignite.cluster().state(ClusterState.ACTIVE); - - IgniteCache cache = ignite.createCache("cache"); - - cache.put(0, 0); - cache.get(0); - - SystemView view = ignite.context().systemView().view(CACHE_GRP_IO_VIEW); - - CacheGroupIoView row = F.find(view, null, - (IgnitePredicate)r -> "cache".equals(r.cacheGroupName())); - - assertNotNull(row); - assertTrue(row.logicalReads() > 0); - assertTrue(row.insertedBytes() > 0); - } - } - - /** */ - private void checkViewsState(SystemView views, ClusterNode loc, ClusterNode rmt) { - assertEquals(2, views.size()); - - for (ClusterNodeView nodeView : views) { - if (nodeView.nodeId().equals(loc.id())) - checkNodeView(nodeView, loc, true); - else - checkNodeView(nodeView, rmt, false); - } - } - - /** */ - private void checkNodeView(ClusterNodeView view, ClusterNode node, boolean isLoc) { - assertEquals(node.id(), view.nodeId()); - assertEquals(node.consistentId().toString(), view.consistentId()); - assertEquals(toStringSafe(node.addresses()), view.addresses()); - assertEquals(toStringSafe(node.hostNames()), view.hostnames()); - assertEquals(node.order(), view.nodeOrder()); - assertEquals(node.version().toString(), view.version()); - assertEquals(isLoc, view.isLocal()); - assertEquals(node.isClient(), view.isClient()); - assertEquals(node.dataCenterId(), view.dataCenterId()); - assertEquals("DC0", view.dataCenterId()); - } - - /** */ - private Iterator jdbcConnectionsIterator(SystemView conns) { - return F.iterator(conns.iterator(), identity(), true, v -> "JDBC".equals(v.type())); - } - - /** */ - @Test - public void testTransactions() throws Exception { - try (IgniteEx g = startGrid(0)) { - IgniteCache cache1 = g.createCache(new CacheConfiguration("c1") - .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL)); - - IgniteCache cache2 = g.createCache(new CacheConfiguration("c2") - .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL)); - - SystemView txs = g.context().systemView().view(TXS_MON_LIST); - - assertEquals(0, F.size(txs.iterator(), alwaysTrue())); - - CountDownLatch latch = new CountDownLatch(1); - - try { - AtomicInteger cntr = new AtomicInteger(); - - GridTestUtils.runMultiThreadedAsync(() -> { - try (Transaction tx = g.transactions().withLabel("test").txStart(PESSIMISTIC, REPEATABLE_READ)) { - cache1.put(cntr.incrementAndGet(), cntr.incrementAndGet()); - cache1.put(cntr.incrementAndGet(), cntr.incrementAndGet()); - - latch.await(); - } - catch (InterruptedException e) { - throw new RuntimeException(e); - } - }, 5, "xxx"); - - boolean res = waitForCondition(() -> txs.size() == 5, 10_000L); - - assertTrue(res); - - TransactionView txv = txs.iterator().next(); - - assertEquals(g.localNode().id(), txv.localNodeId()); - assertEquals(txv.isolation(), REPEATABLE_READ); - assertEquals(txv.concurrency(), PESSIMISTIC); - assertEquals(txv.state(), ACTIVE); - assertNotNull(txv.xid()); - assertFalse(txv.system()); - assertFalse(txv.implicit()); - assertFalse(txv.implicitSingle()); - assertTrue(txv.near()); - assertFalse(txv.dht()); - assertTrue(txv.colocated()); - assertTrue(txv.local()); - assertEquals("test", txv.label()); - assertFalse(txv.onePhaseCommit()); - assertFalse(txv.internal()); - assertEquals(0, txv.timeout()); - assertTrue(txv.startTime() <= System.currentTimeMillis()); - assertEquals(String.valueOf(cacheId(cache1.getName())), txv.cacheIds()); - - GridTestUtils.runMultiThreadedAsync(() -> { - try (Transaction tx = g.transactions().txStart(OPTIMISTIC, SERIALIZABLE)) { - cache1.put(cntr.incrementAndGet(), cntr.incrementAndGet()); - cache1.put(cntr.incrementAndGet(), cntr.incrementAndGet()); - cache2.put(cntr.incrementAndGet(), cntr.incrementAndGet()); - - latch.await(); - } - catch (InterruptedException e) { - throw new RuntimeException(e); - } - }, 5, "xxx"); - - res = waitForCondition(() -> txs.size() == 10, 10_000L); - - assertTrue(res); - - for (TransactionView tx : txs) { - if (PESSIMISTIC == tx.concurrency()) - continue; - - assertEquals(g.localNode().id(), tx.localNodeId()); - assertEquals(tx.isolation(), SERIALIZABLE); - assertEquals(tx.concurrency(), OPTIMISTIC); - assertEquals(tx.state(), ACTIVE); - assertNotNull(tx.xid()); - assertFalse(tx.system()); - assertFalse(tx.implicit()); - assertFalse(tx.implicitSingle()); - assertTrue(tx.near()); - assertFalse(tx.dht()); - assertTrue(tx.colocated()); - assertTrue(tx.local()); - assertNull(tx.label()); - assertFalse(tx.onePhaseCommit()); - assertFalse(tx.internal()); - assertEquals(0, tx.timeout()); - assertTrue(tx.startTime() <= System.currentTimeMillis()); - - String s1 = cacheId(cache1.getName()) + "," + cacheId(cache2.getName()); - String s2 = cacheId(cache2.getName()) + "," + cacheId(cache1.getName()); - - assertTrue(s1.equals(tx.cacheIds()) || s2.equals(tx.cacheIds())); - } - } - finally { - latch.countDown(); - } - - boolean res = waitForCondition(() -> txs.size() == 0, 10_000L); - - assertTrue(res); - } - } - - /** */ - @Test - public void testLocalScanQuery() throws Exception { - try (IgniteEx g0 = startGrid(0)) { - IgniteCache cache1 = g0.createCache( - new CacheConfiguration("cache1") - .setGroupName("group1")); - - int part = g0.affinity("cache1").primaryPartitions(g0.localNode())[0]; - - List partKeys = partitionKeys(cache1, part, 11, 0); - - for (Integer key : partKeys) - cache1.put(key, key); - - SystemView qrySysView0 = g0.context().systemView().view(SCAN_QRY_SYS_VIEW); - - assertNotNull(qrySysView0); - - assertEquals(0, qrySysView0.size()); - - QueryCursor qryRes1 = cache1.query( - new ScanQuery() - .setFilter(new TestPredicate()) - .setLocal(true) - .setPartition(part) - .setPageSize(10), - new TestTransformer()); - - assertTrue(qryRes1.iterator().hasNext()); - - boolean res = waitForCondition(() -> qrySysView0.size() > 0, 5_000); - - assertTrue(res); - - ScanQueryView view = qrySysView0.iterator().next(); - - assertEquals(g0.localNode().id(), view.originNodeId()); - assertEquals(0, view.queryId()); - assertEquals("cache1", view.cacheName()); - assertEquals(cacheId("cache1"), view.cacheId()); - assertEquals(cacheGroupId("cache1", "group1"), view.cacheGroupId()); - assertEquals("group1", view.cacheGroupName()); - assertTrue(view.startTime() <= System.currentTimeMillis()); - assertTrue(view.duration() >= 0); - assertFalse(view.canceled()); - assertEquals(TEST_PREDICATE, view.filter()); - assertTrue(view.local()); - assertEquals(part, view.partition()); - assertEquals(toStringSafe(g0.context().discovery().topologyVersionEx()), view.topology()); - assertEquals(TEST_TRANSFORMER, view.transformer()); - assertFalse(view.keepBinary()); - assertNull(view.subjectId()); - assertNull(view.taskName()); - - qryRes1.close(); - - res = waitForCondition(() -> qrySysView0.size() == 0, 5_000); - - assertTrue(res); - } - } - - /** */ - @Test - public void testScanQuery() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1); - IgniteEx client1 = startClientGrid("client-1"); - IgniteEx client2 = startClientGrid("client-2")) { - - IgniteCache cache1 = client1.createCache( - new CacheConfiguration("cache1") - .setGroupName("group1")); - - IgniteCache cache2 = client2.createCache("cache2"); - - for (int i = 0; i < 100; i++) { - cache1.put(i, i); - cache2.put(i, i); - } - - SystemView qrySysView0 = g0.context().systemView().view(SCAN_QRY_SYS_VIEW); - SystemView qrySysView1 = g1.context().systemView().view(SCAN_QRY_SYS_VIEW); - - assertNotNull(qrySysView0); - assertNotNull(qrySysView1); - - assertEquals(0, qrySysView0.size()); - assertEquals(0, qrySysView1.size()); - - QueryCursor qryRes1 = cache1.query( - new ScanQuery() - .setFilter(new TestPredicate()) - .setPageSize(10), - new TestTransformer()); - - QueryCursor qryRes2 = cache2.withKeepBinary().query(new ScanQuery<>() - .setPageSize(20)); - - assertTrue(qryRes1.iterator().hasNext()); - assertTrue(qryRes2.iterator().hasNext()); - - checkScanQueryView(client1, client2, qrySysView0); - checkScanQueryView(client1, client2, qrySysView1); - - qryRes1.close(); - qryRes2.close(); - - boolean res = waitForCondition( - () -> qrySysView0.size() + qrySysView1.size() == 0, 5_000); - - assertTrue(res); - } - } - - /** */ - private void checkScanQueryView(IgniteEx client1, IgniteEx client2, SystemView qrySysView) - throws Exception { - boolean res = waitForCondition(() -> qrySysView.size() > 1, 5_000); - - assertTrue(res); - - Consumer cache1checker = view -> { - assertEquals(client1.localNode().id(), view.originNodeId()); - assertTrue(view.queryId() != 0); - assertEquals("cache1", view.cacheName()); - assertEquals(cacheId("cache1"), view.cacheId()); - assertEquals(cacheGroupId("cache1", "group1"), view.cacheGroupId()); - assertEquals("group1", view.cacheGroupName()); - assertTrue(view.startTime() <= System.currentTimeMillis()); - assertTrue(view.duration() >= 0); - assertFalse(view.canceled()); - assertEquals(TEST_PREDICATE, view.filter()); - assertFalse(view.local()); - assertEquals(-1, view.partition()); - assertEquals(toStringSafe(client1.context().discovery().topologyVersionEx()), view.topology()); - assertEquals(TEST_TRANSFORMER, view.transformer()); - assertFalse(view.keepBinary()); - assertNull(view.subjectId()); - assertNull(view.taskName()); - assertEquals(10, view.pageSize()); - }; - - Consumer cache2checker = view -> { - assertEquals(client2.localNode().id(), view.originNodeId()); - assertTrue(view.queryId() != 0); - assertEquals("cache2", view.cacheName()); - assertEquals(cacheId("cache2"), view.cacheId()); - assertEquals(cacheGroupId("cache2", null), view.cacheGroupId()); - assertEquals("cache2", view.cacheGroupName()); - assertTrue(view.startTime() <= System.currentTimeMillis()); - assertTrue(view.duration() >= 0); - assertFalse(view.canceled()); - assertNull(view.filter()); - assertFalse(view.local()); - assertEquals(-1, view.partition()); - assertEquals(toStringSafe(client2.context().discovery().topologyVersionEx()), view.topology()); - assertNull(view.transformer()); - assertTrue(view.keepBinary()); - assertNull(view.subjectId()); - assertNull(view.taskName()); - assertEquals(20, view.pageSize()); - }; - - boolean found1 = false; - boolean found2 = false; - - for (ScanQueryView view : qrySysView) { - if ("cache2".equals(view.cacheName())) { - cache2checker.accept(view); - found1 = true; - } - else { - cache1checker.accept(view); - found2 = true; - } - } - - assertTrue(found1 && found2); - } - - /** */ - @Test - public void testAtomicSequence() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - IgniteAtomicSequence s1 = g0.atomicSequence("seq-1", 42, true); - IgniteAtomicSequence s2 = g0.atomicSequence("seq-2", - new AtomicConfiguration().setBackups(1).setGroupName("my-group"), 43, true); - - s1.batchSize(42); - - SystemView seqs0 = g0.context().systemView().view(SEQUENCES_VIEW); - SystemView seqs1 = g1.context().systemView().view(SEQUENCES_VIEW); - - assertEquals(2, seqs0.size()); - assertEquals(0, seqs1.size()); - - for (AtomicSequenceView s : seqs0) { - if ("seq-1".equals(s.name())) { - assertEquals(42, s.value()); - assertEquals(42, s.batchSize()); - assertEquals(DEFAULT_DS_GROUP_NAME, s.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), s.groupId()); - - long val = s1.addAndGet(42); - - assertEquals(val, s.value()); - assertFalse(s.removed()); - } - else { - assertEquals("seq-2", s.name()); - assertEquals(DFLT_ATOMIC_SEQUENCE_RESERVE_SIZE, s.batchSize()); - assertEquals(43, s.value()); - assertEquals("my-group", s.groupName()); - assertEquals(CU.cacheId("my-group"), s.groupId()); - assertFalse(s.removed()); - - s2.close(); - - assertTrue(waitForCondition(s::removed, getTestTimeout())); - } - } - - g1.atomicSequence("seq-1", 42, true); - - assertEquals(1, seqs1.size()); - - AtomicSequenceView s = seqs1.iterator().next(); - - assertEquals(DFLT_ATOMIC_SEQUENCE_RESERVE_SIZE + 42, s.value()); - assertEquals(DFLT_ATOMIC_SEQUENCE_RESERVE_SIZE, s.batchSize()); - assertEquals(DEFAULT_DS_GROUP_NAME, s.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), s.groupId()); - assertFalse(s.removed()); - - s1.close(); - - assertTrue(waitForCondition(s::removed, getTestTimeout())); - - assertEquals(0, seqs0.size()); - assertEquals(0, seqs1.size()); - } - } - - /** */ - @Test - public void testAtomicLongs() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - IgniteAtomicLong l1 = g0.atomicLong("long-1", 42, true); - IgniteAtomicLong l2 = g0.atomicLong("long-2", - new AtomicConfiguration().setBackups(1).setGroupName("my-group"), 43, true); - - SystemView longs0 = g0.context().systemView().view(LONGS_VIEW); - SystemView longs1 = g1.context().systemView().view(LONGS_VIEW); - - assertEquals(2, longs0.size()); - assertEquals(0, longs1.size()); - - for (AtomicLongView l : longs0) { - if ("long-1".equals(l.name())) { - assertEquals(42, l.value()); - assertEquals(DEFAULT_DS_GROUP_NAME, l.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), l.groupId()); - - long val = l1.addAndGet(42); - - assertEquals(val, l.value()); - assertFalse(l.removed()); - } - else { - assertEquals("long-2", l.name()); - assertEquals(43, l.value()); - assertEquals("my-group", l.groupName()); - assertEquals(CU.cacheId("my-group"), l.groupId()); - assertFalse(l.removed()); - - l2.close(); - - assertTrue(waitForCondition(l::removed, getTestTimeout())); - } - } - - g1.atomicLong("long-1", 42, true); - - assertEquals(1, longs1.size()); - - AtomicLongView l = longs1.iterator().next(); - - assertEquals(84, l.value()); - assertEquals(DEFAULT_DS_GROUP_NAME, l.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), l.groupId()); - assertFalse(l.removed()); - - l1.close(); - - assertTrue(waitForCondition(l::removed, getTestTimeout())); - - assertEquals(0, longs0.size()); - assertEquals(0, longs1.size()); - } - } - - /** */ - @Test - public void testAtomicReference() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - IgniteAtomicReference l1 = g0.atomicReference("ref-1", "str1", true); - IgniteAtomicReference l2 = g0.atomicReference("ref-2", - new AtomicConfiguration().setBackups(1).setGroupName("my-group"), 43, true); - - SystemView refs0 = g0.context().systemView().view(REFERENCES_VIEW); - SystemView refs1 = g1.context().systemView().view(REFERENCES_VIEW); - - assertEquals(2, refs0.size()); - assertEquals(0, refs1.size()); - - for (AtomicReferenceView r : refs0) { - if ("ref-1".equals(r.name())) { - assertEquals("str1", r.value()); - assertEquals(DEFAULT_DS_GROUP_NAME, r.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), r.groupId()); - - l1.set("str2"); - - assertEquals("str2", r.value()); - assertFalse(r.removed()); - } - else { - assertEquals("ref-2", r.name()); - assertEquals("43", r.value()); - assertEquals("my-group", r.groupName()); - assertEquals(CU.cacheId("my-group"), r.groupId()); - assertFalse(r.removed()); - - l2.close(); - - assertTrue(waitForCondition(r::removed, getTestTimeout())); - } - } - - g1.atomicReference("ref-1", "str3", true); - - assertEquals(1, refs1.size()); - - AtomicReferenceView l = refs1.iterator().next(); - - assertEquals("str2", l.value()); - assertEquals(DEFAULT_DS_GROUP_NAME, l.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), l.groupId()); - assertFalse(l.removed()); - - l1.close(); - - assertTrue(waitForCondition(l::removed, getTestTimeout())); - - assertEquals(0, refs0.size()); - assertEquals(0, refs1.size()); - } - } - - /** */ - @Test - public void testAtomicStamped() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - IgniteAtomicStamped s1 = g0.atomicStamped("s-1", "str0", 1, true); - IgniteAtomicStamped s2 = g0.atomicStamped("s-2", - new AtomicConfiguration().setBackups(1).setGroupName("my-group"), "str1", 43, true); - - SystemView stamps0 = g0.context().systemView().view(STAMPED_VIEW); - SystemView stamps1 = g1.context().systemView().view(STAMPED_VIEW); - - assertEquals(2, stamps0.size()); - assertEquals(0, stamps1.size()); - - for (AtomicStampedView s : stamps0) { - if ("s-1".equals(s.name())) { - assertEquals("str0", s.value()); - assertEquals("1", s.stamp()); - assertEquals(DEFAULT_DS_GROUP_NAME, s.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), s.groupId()); - - s1.set("str2", 2); - - assertEquals("str2", s.value()); - assertEquals("2", s.stamp()); - assertFalse(s.removed()); - } - else { - assertEquals("s-2", s.name()); - assertEquals("str1", s.value()); - assertEquals("43", s.stamp()); - assertEquals("my-group", s.groupName()); - assertEquals(CU.cacheId("my-group"), s.groupId()); - assertFalse(s.removed()); - - s2.close(); - - assertTrue(waitForCondition(s::removed, getTestTimeout())); - } - } - - g1.atomicStamped("s-1", "str3", 3, true); - - assertEquals(1, stamps1.size()); - - AtomicStampedView l = stamps1.iterator().next(); - - assertEquals("str2", l.value()); - assertEquals("2", l.stamp()); - assertEquals(DEFAULT_DS_GROUP_NAME, l.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), l.groupId()); - assertFalse(l.removed()); - - s1.close(); - - assertTrue(l.removed()); - - assertEquals(0, stamps0.size()); - assertEquals(0, stamps1.size()); - } - } - - /** */ - @Test - public void testCountDownLatch() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - IgniteCountDownLatch l1 = g0.countDownLatch("c1", 3, false, true); - IgniteCountDownLatch l2 = g0.countDownLatch("c2", 1, true, true); - - SystemView latches0 = g0.context().systemView().view(LATCHES_VIEW); - SystemView latches1 = g1.context().systemView().view(LATCHES_VIEW); - - assertEquals(2, latches0.size()); - assertEquals(0, latches1.size()); - - String grpName = DEFAULT_VOLATILE_DS_GROUP_NAME + "@" + VOLATILE_DATA_REGION_NAME; - - for (CountDownLatchView l : latches0) { - if ("c1".equals(l.name())) { - assertEquals(3, l.count()); - assertEquals(3, l.initialCount()); - assertFalse(l.autoDelete()); - - l1.countDown(); - - assertEquals(2, l.count()); - assertEquals(3, l.initialCount()); - assertFalse(l.removed()); - } - else { - assertEquals("c2", l.name()); - assertEquals(1, l.count()); - assertEquals(1, l.initialCount()); - assertTrue(l.autoDelete()); - assertFalse(l.removed()); - - l2.countDown(); - l2.close(); - - assertTrue(waitForCondition(l::removed, getTestTimeout())); - } - - assertEquals(grpName, l.groupName()); - assertEquals(CU.cacheId(grpName), l.groupId()); - } - - IgniteCountDownLatch l3 = g1.countDownLatch("c1", 10, true, true); - - assertEquals(1, latches1.size()); - - CountDownLatchView l = latches1.iterator().next(); - - assertEquals(2, l.count()); - assertEquals(3, l.initialCount()); - assertEquals(grpName, l.groupName()); - assertEquals(CU.cacheId(grpName), l.groupId()); - assertFalse(l.removed()); - assertFalse(l.autoDelete()); - - l3.countDown(); - l3.countDown(); - l3.close(); - - assertTrue(waitForCondition(l::removed, getTestTimeout())); - - assertEquals(0, latches0.size()); - assertEquals(0, latches1.size()); - } - } - - /** */ - @Test - public void testSemaphores() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - IgniteSemaphore s1 = g0.semaphore("s1", 3, false, true); - IgniteSemaphore s2 = g0.semaphore("s2", 1, true, true); - - SystemView semaphores0 = g0.context().systemView().view(SEMAPHORES_VIEW); - SystemView semaphores1 = g1.context().systemView().view(SEMAPHORES_VIEW); - - assertEquals(2, semaphores0.size()); - assertEquals(0, semaphores1.size()); - - String grpName = DEFAULT_VOLATILE_DS_GROUP_NAME + "@" + VOLATILE_DATA_REGION_NAME; - - IgniteInternalFuture acquirePermitFut = null; - - for (SemaphoreView s : semaphores0) { - if ("s1".equals(s.name())) { - assertEquals(3, s.availablePermits()); - assertFalse(s.hasQueuedThreads()); - assertEquals(0, s.queueLength()); - assertFalse(s.failoverSafe()); - assertFalse(s.broken()); - assertFalse(s.removed()); - - acquirePermitFut = runAsync(() -> { - s1.acquire(2); - - try { - Thread.sleep(getTestTimeout()); - } - catch (InterruptedException e) { - throw new RuntimeException(e); - } - finally { - s1.release(2); - } - }); - - assertTrue(waitForCondition(() -> s.availablePermits() == 1, getTestTimeout())); - assertTrue(s.hasQueuedThreads()); - assertEquals(1, s.queueLength()); - } - else { - assertEquals(1, s.availablePermits()); - assertFalse(s.hasQueuedThreads()); - assertEquals(0, s.queueLength()); - assertTrue(s.failoverSafe()); - assertFalse(s.broken()); - assertFalse(s.removed()); - - s2.close(); - - assertTrue(waitForCondition(s::removed, getTestTimeout())); - } - - assertEquals(grpName, s.groupName()); - assertEquals(CU.cacheId(grpName), s.groupId()); - } - - IgniteSemaphore l3 = g1.semaphore("s1", 10, true, true); - - assertEquals(1, semaphores1.size()); - - SemaphoreView s = semaphores1.iterator().next(); - - assertEquals(1, s.availablePermits()); - assertTrue(s.hasQueuedThreads()); - assertEquals(1, s.queueLength()); - assertFalse(s.failoverSafe()); - assertFalse(s.broken()); - assertFalse(s.removed()); - - acquirePermitFut.cancel(); - assertTrue(waitForCondition(() -> s.availablePermits() == 3, getTestTimeout())); - - l3.close(); - - assertTrue(waitForCondition(s::removed, getTestTimeout())); - - assertEquals(0, semaphores0.size()); - assertEquals(0, semaphores1.size()); - } - } - - /** */ - @Test - public void testLocks() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - IgniteLock l1 = g0.reentrantLock("l1", false, true, true); - IgniteLock l2 = g0.reentrantLock("l2", true, false, true); - - SystemView locks0 = g0.context().systemView().view(LOCKS_VIEW); - SystemView locks1 = g1.context().systemView().view(LOCKS_VIEW); - - assertEquals(2, locks0.size()); - assertEquals(0, locks1.size()); - - String grpName = DEFAULT_VOLATILE_DS_GROUP_NAME + "@" + VOLATILE_DATA_REGION_NAME; - - IgniteInternalFuture lockFut = null; - - Runnable lockNSleep = () -> { - l1.lock(); - - try { - Thread.sleep(getTestTimeout()); - } - catch (InterruptedException e) { - throw new RuntimeException(e); - } - finally { - l1.unlock(); - } - }; - - for (ReentrantLockView l : locks0) { - if ("l1".equals(l.name())) { - assertFalse(l.locked()); - assertFalse(l.hasQueuedThreads()); - assertFalse(l.failoverSafe()); - assertTrue(l.fair()); - assertFalse(l.broken()); - assertFalse(l.removed()); - - lockFut = runAsync(lockNSleep); - - assertTrue(waitForCondition(l::locked, getTestTimeout())); - } - else { - assertFalse(l.hasQueuedThreads()); - assertTrue(l.failoverSafe()); - assertFalse(l.fair()); - assertFalse(l.broken()); - assertFalse(l.removed()); - - l2.close(); - - assertTrue(waitForCondition(l::removed, getTestTimeout())); - } - - assertEquals(grpName, l.groupName()); - assertEquals(CU.cacheId(grpName), l.groupId()); - } - - IgniteLock l3 = g1.reentrantLock("l1", true, false, true); - - assertEquals(1, locks1.size()); - - ReentrantLockView s = locks1.iterator().next(); - - assertTrue(s.locked()); - assertFalse(s.hasQueuedThreads()); - assertFalse(s.failoverSafe()); - assertTrue(s.fair()); - assertFalse(s.broken()); - assertFalse(s.removed()); - - lockFut.cancel(); - - assertTrue(waitForCondition(() -> !s.locked(), getTestTimeout())); - assertFalse(s.hasQueuedThreads()); - - l3.close(); - - assertTrue(waitForCondition(s::removed, getTestTimeout())); - - assertEquals(0, locks0.size()); - assertEquals(0, locks1.size()); - } - } - - /** */ - @Test - public void testQueue() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - - IgniteQueue q0 = g0.queue("queue-1", 42, new CollectionConfiguration() - .setCollocated(true) - .setBackups(1) - .setGroupName("my-group")); - IgniteQueue q1 = g0.queue("queue-2", 0, new CollectionConfiguration()); - - SystemView queues0 = g0.context().systemView().view(QUEUES_VIEW); - SystemView queues1 = g1.context().systemView().view(QUEUES_VIEW); - - assertEquals(2, queues0.size()); - assertEquals(0, queues1.size()); - - for (QueueView q : queues0) { - if ("queue-1".equals(q.name())) { - assertNotNull(q.id()); - assertEquals("queue-1", q.name()); - assertEquals(42, q.capacity()); - assertTrue(q.bounded()); - assertTrue(q.collocated()); - assertEquals("my-group", q.groupName()); - assertEquals(CU.cacheId("my-group"), q.groupId()); - assertFalse(q.removed()); - assertEquals(0, q.size()); - - q0.add("first"); - - assertEquals(1, q.size()); - } - else { - assertNotNull(q.id()); - assertEquals("queue-2", q.name()); - assertEquals(Integer.MAX_VALUE, q.capacity()); - assertFalse(q.bounded()); - assertFalse(q.collocated()); - assertEquals(DEFAULT_DS_GROUP_NAME, q.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), q.groupId()); - assertFalse(q.removed()); - assertEquals(0, q.size()); - - q1.close(); - - assertTrue(waitForCondition(q::removed, getTestTimeout())); - } - } - - IgniteQueue q2 = g1.queue("queue-1", 42, new CollectionConfiguration() - .setCollocated(true) - .setBackups(1) - .setGroupName("my-group")); - - assertEquals(1, queues1.size()); - - QueueView q = queues1.iterator().next(); - - assertNotNull(q.id()); - assertEquals("queue-1", q.name()); - assertEquals(42, q.capacity()); - assertTrue(q.bounded()); - assertTrue(q.collocated()); - assertEquals("my-group", q.groupName()); - assertEquals(CU.cacheId("my-group"), q.groupId()); - assertFalse(q.removed()); - assertEquals(1, q.size()); - - q2.close(); - - assertTrue(waitForCondition(q::removed, getTestTimeout())); - - assertEquals(0, queues0.size()); - assertEquals(0, queues1.size()); - } - } - - /** */ - @Test - public void testSet() throws Exception { - try (IgniteEx g0 = startGrid(0); - IgniteEx g1 = startGrid(1)) { - - IgniteSet s0 = g0.set("set-1", new CollectionConfiguration() - .setCollocated(true) - .setBackups(1) - .setGroupName("my-group")); - IgniteSet s1 = g0.set("set-2", new CollectionConfiguration()); - - SystemView sets0 = g0.context().systemView().view(SETS_VIEW); - SystemView sets1 = g1.context().systemView().view(SETS_VIEW); - - assertEquals(2, sets0.size()); - assertEquals(0, sets1.size()); - - for (SetView q : sets0) { - if ("set-1".equals(q.name())) { - assertNotNull(q.id()); - assertEquals("set-1", q.name()); - assertTrue(q.collocated()); - assertEquals("my-group", q.groupName()); - assertEquals(CU.cacheId("my-group"), q.groupId()); - assertFalse(q.removed()); - assertEquals(0, q.size()); - - s0.add("first"); - - assertEquals(1, q.size()); - } - else { - assertNotNull(q.id()); - assertEquals("set-2", q.name()); - assertFalse(q.collocated()); - assertEquals(DEFAULT_DS_GROUP_NAME, q.groupName()); - assertEquals(CU.cacheId(DEFAULT_DS_GROUP_NAME), q.groupId()); - assertFalse(q.removed()); - assertEquals(0, q.size()); - - s1.close(); - - assertTrue(waitForCondition(q::removed, getTestTimeout())); - } - } - - IgniteSet s2 = g1.set("set-1", new CollectionConfiguration() - .setCollocated(true) - .setBackups(1) - .setGroupName("my-group")); - - assertEquals(1, sets1.size()); - - SetView s = sets1.iterator().next(); - - assertNotNull(s.id()); - assertEquals("set-1", s.name()); - assertTrue(s.collocated()); - assertEquals("my-group", s.groupName()); - assertEquals(CU.cacheId("my-group"), s.groupId()); - assertFalse(s.removed()); - assertEquals(1, s.size()); - - s2.close(); - - assertTrue(waitForCondition(s::removed, getTestTimeout())); - - assertEquals(0, sets0.size()); - assertEquals(0, sets1.size()); - } - } - - /** */ - @Test - public void testStripedExecutors() throws Exception { - try (IgniteEx g = startGrid(0)) { - checkStripeExecutorView(g.context().pools().getStripedExecutorService(), - g.context().systemView().view(SYS_POOL_QUEUE_VIEW), - "sys"); - - checkStripeExecutorView(g.context().pools().getDataStreamerExecutorService(), - g.context().systemView().view(STREAM_POOL_QUEUE_VIEW), - "data-streamer"); - } - } - - /** - * Checks striped executor system view. - * - * @param execSvc Striped executor. - * @param view System view. - * @param poolName Executor name. - */ - private void checkStripeExecutorView(IgniteStripedExecutor execSvc, SystemView view, - String poolName) throws Exception { - CountDownLatch latch = new CountDownLatch(1); - - execSvc.execute(0, new TestRunnable(latch, 0)); - execSvc.execute(0, new TestRunnable(latch, 1)); - execSvc.execute(1, new TestRunnable(latch, 2)); - execSvc.execute(1, new TestRunnable(latch, 3)); - - try { - boolean res = waitForCondition(() -> view.size() == 2, 5_000); - - assertTrue(res); - - Iterator iter = view.iterator(); - - assertTrue(iter.hasNext()); - - StripedExecutorTaskView row0 = iter.next(); - - assertEquals(0, row0.stripeIndex()); - assertEquals(TestRunnable.class.getSimpleName() + '1', row0.description()); - assertEquals(poolName + "-stripe-0", row0.threadName()); - assertEquals(TestRunnable.class.getName(), row0.taskName()); - - assertTrue(iter.hasNext()); - - StripedExecutorTaskView row1 = iter.next(); - - assertEquals(1, row1.stripeIndex()); - assertEquals(TestRunnable.class.getSimpleName() + '3', row1.description()); - assertEquals(poolName + "-stripe-1", row1.threadName()); - assertEquals(TestRunnable.class.getName(), row1.taskName()); - } - finally { - latch.countDown(); - } - } - - /** */ - public static class TestPredicate implements IgniteBiPredicate { - /** {@inheritDoc} */ - @Override public boolean apply(Integer integer, Integer integer2) { - return true; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return TEST_PREDICATE; - } - } - - /** */ - public static class TestTransformer implements IgniteClosure, Integer> { - /** {@inheritDoc} */ - @Override public Integer apply(Cache.Entry entry) { - return entry.getKey(); - } - - /** {@inheritDoc} */ - @Override public String toString() { - return TEST_TRANSFORMER; - } - } - - /** */ - @Test - public void testPagesList() throws Exception { - cleanPersistenceDir(); - - try (IgniteEx ignite = startGrid(getConfiguration() - .setDataStorageConfiguration( - new DataStorageConfiguration().setDataRegionConfigurations( - new DataRegionConfiguration().setName("dr0").setMaxSize(100L * 1024 * 1024), - new DataRegionConfiguration().setName("dr1").setMaxSize(100L * 1024 * 1024) - .setPersistenceEnabled(true) - )))) { - ignite.cluster().state(ClusterState.ACTIVE); - - GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)ignite.context().cache().context() - .database(); - - int pageSize = dbMgr.pageSize(); - - dbMgr.enableCheckpoints(false).get(); - - for (int i = 0; i < 2; i++) { - IgniteCache cache = ignite.getOrCreateCache(new CacheConfiguration<>("cache" + i) - .setDataRegionName("dr" + i).setAffinity(new RendezvousAffinityFunction().setPartitions(2))); - - int key = 0; - - // Fill up different free-list buckets. - for (int j = 0; j < pageSize / 2; j++) - cache.put(key++, new byte[j + 1]); - - // Put some pages to one bucket to overflow pages cache. - for (int j = 0; j < 1000; j++) - cache.put(key++, new byte[pageSize / 2]); - } - - long dr0flPages = 0; - int dr0flStripes = 0; - - SystemView dataRegionPageLists = ignite.context().systemView().view(DATA_REGION_PAGE_LIST_VIEW); - - for (PagesListView pagesListView : dataRegionPageLists) { - if (pagesListView.name().startsWith("dr0")) { - dr0flPages += pagesListView.bucketSize(); - dr0flStripes += pagesListView.stripesCount(); - } - } - - assertTrue(dr0flPages > 0); - assertTrue(dr0flStripes > 0); - - int bucketsCnt = ((PagesList)ignite.context().cache().context().database().freeList("dr0")).bucketsCount(); - int[] bucketPagesSize = new int[bucketsCnt]; - - for (PagesListView pagesListView : dataRegionPageLists) { - int bucket = pagesListView.bucketNumber(); - - if (bucketPagesSize[bucket] == 0) { - assertTrue(bucket == 0 || pagesListView.pageFreeSpace() != 0); - bucketPagesSize[bucket] = pagesListView.pageFreeSpace(); - } - else - assertEquals(bucketPagesSize[bucket], pagesListView.pageFreeSpace()); - } - - int prev = 0; - - for (int size : bucketPagesSize) { - if (size > 0) { - assertTrue(size > prev); - prev = size; - } - } - - SystemView cacheGrpPageLists = ignite.context().systemView().view(CACHE_GRP_PAGE_LIST_VIEW); - - long dr1flPages = 0; - int dr1flStripes = 0; - int dr1flCached = 0; - - for (CachePagesListView pagesListView : cacheGrpPageLists) { - if (pagesListView.cacheGroupId() == cacheId("cache1")) { - dr1flPages += pagesListView.bucketSize(); - dr1flStripes += pagesListView.stripesCount(); - dr1flCached += pagesListView.cachedPagesCount(); - } - } - - assertTrue(dr1flPages > 0); - assertTrue(dr1flStripes > 0); - assertTrue(dr1flCached > 0); - - // Test filtering. - assertTrue(cacheGrpPageLists instanceof FiltrableSystemView); - - Iterator iter = ((FiltrableSystemView)cacheGrpPageLists).iterator(Map.of( - CachePagesListViewWalker.CACHE_GROUP_ID_FILTER, cacheId("cache1"), - CachePagesListViewWalker.PARTITION_ID_FILTER, 0, - CachePagesListViewWalker.BUCKET_NUMBER_FILTER, 0 - )); - - assertEquals(1, F.size(iter)); - - iter = ((FiltrableSystemView)cacheGrpPageLists).iterator(Map.of( - CachePagesListViewWalker.CACHE_GROUP_ID_FILTER, cacheId("cache1"), - CachePagesListViewWalker.BUCKET_NUMBER_FILTER, 0 - )); - - assertEquals(2, F.size(iter)); - } - } - - /** */ - @Test - public void testBinaryMeta() throws Exception { - try (IgniteEx g = startGrid(0)) { - IgniteCache c1 = g.createCache("test-cache"); - IgniteCache c2 = g.createCache("test-enum-cache"); - - c1.put(1, new TestObjectAllTypes()); - c2.put(1, TestObjectEnum.A); - - SystemView view = g.context().systemView().view(BINARY_METADATA_VIEW); - - assertNotNull(view); - assertEquals(2, view.size()); - - for (BinaryMetadataView meta : view) { - if (TestObjectEnum.class.getName().contains(meta.typeName())) { - assertTrue(meta.isEnum()); - - assertEquals(0, meta.fieldsCount()); - } - else { - assertFalse(meta.isEnum()); - - Field[] fields = TestObjectAllTypes.class.getDeclaredFields(); - - assertEquals(fields.length, meta.fieldsCount()); - - for (Field field : fields) - assertTrue(meta.fields().contains(field.getName())); - } - } - } - } - - /** */ - @Test - public void testMetastorage() throws Exception { - cleanPersistenceDir(); - - try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration( - new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration().setPersistenceEnabled(true) - )))) { - ignite.cluster().state(ClusterState.ACTIVE); - - IgniteCacheDatabaseSharedManager db = ignite.context().cache().context().database(); - - SystemView metaStoreView = ignite.context().systemView().view(METASTORE_VIEW); - - assertNotNull(metaStoreView); - - String name = "test-key"; - String val = "test-value"; - String unmarshalledName = "unmarshalled-key"; - String unmarshalledVal = "[Raw data. 0 bytes]"; - - db.checkpointReadLock(); - - try { - db.metaStorage().write(name, val); - db.metaStorage().writeRaw(unmarshalledName, new byte[0]); - } - finally { - db.checkpointReadUnlock(); - } - - assertNotNull(F.find(metaStoreView, null, - (IgnitePredicate)view -> - name.equals(view.name()) && val.equals(view.value()))); - - assertNotNull(F.find(metaStoreView, null, - (IgnitePredicate)view -> - unmarshalledName.equals(view.name()) && unmarshalledVal.equals(view.value()))); - - // Test filtering. - assertTrue(metaStoreView instanceof FiltrableSystemView); - - Iterator iter = ((FiltrableSystemView)metaStoreView) - .iterator(F.asMap(MetastorageViewWalker.NAME_FILTER, name)); - - assertTrue(iter.hasNext()); - - MetastorageView row = iter.next(); - - assertTrue(name.equals(row.name()) && val.equals(row.value())); - assertFalse(iter.hasNext()); - } - } - - /** */ - @Test - public void testDistributedMetastorage() throws Exception { - cleanPersistenceDir(); - - try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration( - new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration().setPersistenceEnabled(true) - )))) { - ignite.cluster().state(ClusterState.ACTIVE); - - String histogramName = "CheckpointBeforeLockHistogram"; - - ignite.context().metric().configureHistogram(metricName(DATASTORAGE_METRIC_PREFIX, histogramName), new long[] { 1, 2, 3}); - - DistributedMetaStorage dms = ignite.context().distributedMetastorage(); - - String name = "test-distributed-key"; - String val = "test-distributed-value"; - - dms.write(name, val); - - SystemView dmsView = ignite.context().systemView().view(DISTRIBUTED_METASTORE_VIEW); - - assertNotNull(F.find( - dmsView, - null, - (IgnitePredicate)view -> name.equals(view.name()) && val.equals(view.value())) - ); - - assertNotNull(F.find( - dmsView, - null, - (IgnitePredicate) - view -> view.name().endsWith(histogramName) && "[1, 2, 3]".equals(view.value())) - ); - - // Test filtering. - assertTrue(dmsView instanceof FiltrableSystemView); - - Iterator iter = ((FiltrableSystemView)dmsView) - .iterator(F.asMap(MetastorageViewWalker.NAME_FILTER, name)); - - assertTrue(iter.hasNext()); - - MetastorageView row = iter.next(); - - assertTrue(name.equals(row.name()) && val.equals(row.value())); - assertFalse(iter.hasNext()); - } - } - - /** */ - @Test - public void testBaselineNodes() throws Exception { - cleanPersistenceDir(); - - try ( - IgniteEx ignite0 = startGrid(getConfiguration(getTestIgniteInstanceName(0)) - .setDataStorageConfiguration(new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration().setPersistenceEnabled(true))) - .setConsistentId("consId0")); - IgniteEx ignite1 = startGrid(getConfiguration(getTestIgniteInstanceName(1)) - .setDataStorageConfiguration(new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration().setPersistenceEnabled(true))) - .setConsistentId("consId1")); - ) { - ignite0.cluster().state(ClusterState.ACTIVE); - - ignite1.close(); - - awaitPartitionMapExchange(); - - SystemView view = ignite0.context().systemView().view(BASELINE_NODES_SYS_VIEW); - - assertEquals(2, view.size()); - assertEquals(1, F.size(view.iterator(), row -> "consId0".equals(row.consistentId()) && row.online())); - assertEquals(1, F.size(view.iterator(), row -> "consId1".equals(row.consistentId()) && !row.online())); - } - } - - /** */ - @Test - public void testBaselineNodeAttributes() throws Exception { - cleanPersistenceDir(); - - try (IgniteEx ignite = startGrid(getConfiguration() - .setDataStorageConfiguration( - new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration().setName("pds").setPersistenceEnabled(true) - )) - .setUserAttributes(F.asMap("name", "val")) - .setConsistentId("consId")) - ) { - ignite.cluster().state(ClusterState.ACTIVE); - - SystemView view = ignite.context().systemView() - .view(BASELINE_NODE_ATTRIBUTES_SYS_VIEW); - - assertEquals(ignite.cluster().localNode().attributes().size(), view.size()); - - assertEquals(1, F.size(view.iterator(), row -> "consId".equals(row.nodeConsistentId()) && - "name".equals(row.name()) && "val".equals(row.value()))); - - // Test filtering. - assertTrue(view instanceof FiltrableSystemView); - - Iterator iter = ((FiltrableSystemView)view) - .iterator(F.asMap(BaselineNodeAttributeViewWalker.NODE_CONSISTENT_ID_FILTER, "consId", - BaselineNodeAttributeViewWalker.NAME_FILTER, "name")); - - assertEquals(1, F.size(iter)); - - iter = ((FiltrableSystemView)view).iterator( - F.asMap(BaselineNodeAttributeViewWalker.NODE_CONSISTENT_ID_FILTER, "consId")); - - assertEquals(1, F.size(iter, row -> "name".equals(row.name()))); - - iter = ((FiltrableSystemView)view).iterator( - F.asMap(BaselineNodeAttributeViewWalker.NAME_FILTER, "name")); - - assertEquals(1, F.size(iter)); - } - } - - /** */ - @Test - public void testSnapshot() throws Exception { - cleanPersistenceDir(); - - String dfltCacheGrp = "testGroup"; - - String testSnap0 = "testSnap0"; - String testSnap1 = "testSnap1"; - - try (IgniteEx ignite = startGrid(getConfiguration() - .setCacheConfiguration(new CacheConfiguration<>(DEFAULT_CACHE_NAME).setGroupName(dfltCacheGrp)) - .setDataStorageConfiguration( - new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration().setName("pds").setPersistenceEnabled(true) - ).setWalCompactionEnabled(true))) - ) { - ignite.cluster().state(ClusterState.ACTIVE); - - ignite.cache(DEFAULT_CACHE_NAME).put(1, 1); - - ignite.snapshot().createSnapshot(testSnap0).get(); - ignite.snapshot().createSnapshot(testSnap1).get(getTestTimeout()); - ignite.snapshot().createIncrementalSnapshot(testSnap1).get(getTestTimeout()); - ignite.snapshot().createIncrementalSnapshot(testSnap1).get(getTestTimeout()); - - SystemView views = ignite.context().systemView().view(SNAPSHOT_SYS_VIEW); - - List> exp = Lists.newArrayList( - new T2<>(testSnap0, null), - new T2<>(testSnap1, null), - new T2<>(testSnap1, 1), - new T2<>(testSnap1, 2)); - - assertEquals(4, views.size()); - - for (SnapshotView v: views) { - assertTrue(exp.remove(new T2<>(v.name(), v.incrementIndex()))); - - assertEquals(ignite.localNode().consistentId().toString(), v.consistentId()); - assertNotNull(v.snapshotRecordSegment()); - assertTrue("snapshotTime should be non-zero value", - v.snapshotTime() > 0); - - Integer incIdx = v.incrementIndex(); - - if (incIdx == null) { - assertEquals(ignite.localNode().consistentId().toString(), v.baselineNodes()); - assertEquals(String.join(",", dfltCacheGrp, METASTORAGE_CACHE_NAME), v.cacheGroups()); - assertEquals("FULL", v.type()); - } - else - assertEquals("INCREMENTAL", v.type()); - } - - assertTrue(exp.isEmpty()); - } - } - - /** */ - @Test - public void testPagesTimestampHistogram() throws Exception { - int keysCnt = 50_000; - - AtomicLong curTime = new AtomicLong(System.currentTimeMillis()); - - GridTestClockTimer.timeSupplier(curTime::get); - GridTestClockTimer.update(); - - String regionName = "default"; - - DataStorageConfiguration dsCfg = new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration() - .setMaxSize(50L * 1024 * 1024) - .setPersistenceEnabled(true) - .setName(regionName) - .setMetricsEnabled(true) - ); - - cleanPersistenceDir(); - - try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration(dsCfg))) { - ignite.cluster().state(ClusterState.ACTIVE); - - CacheConfiguration ccfg1 = new CacheConfiguration<>("test-pages-ts1") - .setAffinity(new RendezvousAffinityFunction(false, 10)); - - CacheConfiguration ccfg2 = new CacheConfiguration<>("test-pages-ts2") - .setAffinity(new RendezvousAffinityFunction(false, 10)); - - IgniteCache cache1 = ignite.createCache(ccfg1); - - long ts1 = curTime.get(); - - for (int i = 0; i < 1000; i++) - cache1.put(i, i); - - long ts2 = curTime.addAndGet(PeriodicHistogramMetricImpl.DFLT_BUCKETS_INTERVAL); - GridTestClockTimer.update(); - - for (int i = 1000; i < 2000; i++) - cache1.put(i, i); - - SystemView pagesTsHistogram = - ignite.context().systemView().view(PAGE_TS_HISTOGRAM_VIEW); - - assertNotNull(pagesTsHistogram); - - long totalCnt = 0; - - for (PagesTimestampHistogramView view : pagesTsHistogram) { - if (regionName.equals(view.dataRegionName())) { - if ((ts1 >= view.intervalStart().getTime() && ts1 <= view.intervalEnd().getTime()) || - (ts2 >= view.intervalStart().getTime() && ts2 <= view.intervalEnd().getTime())) { - assertTrue("Unexpected pages count: " + view.pagesCount(), view.pagesCount() > 0); - - totalCnt += view.pagesCount(); - } - else - assertEquals(0, view.pagesCount()); - } - } - - assertTrue(totalCnt > 0); - assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), totalCnt); - - assertEquals(2, F.size(F.iterator(pagesTsHistogram, v -> v, true, v -> v.pagesCount() > 0))); - - // Check histogram after replacement. - long ts3 = curTime.addAndGet(PeriodicHistogramMetricImpl.DFLT_BUCKETS_INTERVAL); - GridTestClockTimer.update(); - - ignite.createCache(ccfg2); - - try (IgniteDataStreamer streamer = ignite.dataStreamer("test-pages-ts2")) { - for (int i = 0; i < keysCnt; i++) - streamer.addData(i, new byte[1000]); - } - - assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), - F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); - - assertFalse(F.isEmpty(F.iterator(pagesTsHistogram, v -> v, true, v -> v.pagesCount() > 0 && - v.intervalStart().getTime() <= ts3 && ts3 <= v.intervalEnd().getTime()))); - - // Check histogram after cache destroy and remove of outdated pages. - long ts4 = curTime.addAndGet(PeriodicHistogramMetricImpl.DFLT_BUCKETS_INTERVAL); - GridTestClockTimer.update(); - - ignite.destroyCache("test-pages-ts2"); - - IgniteCache cache2 = ignite.createCache(ccfg2); - - for (int i = 0; i < keysCnt; i++) { - cache1.put(i, i); - cache2.put(i, new byte[1000]); - } - - assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), - F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); - - assertFalse(F.isEmpty(F.iterator(pagesTsHistogram, v -> v, true, v -> v.pagesCount() > 0 && - v.intervalStart().getTime() <= ts4 && ts4 <= v.intervalEnd().getTime()))); - } - finally { - GridTestClockTimer.timeSupplier(GridTestClockTimer.DFLT_TIME_SUPPLIER); - } - } - - /** */ - @Test - public void testPagesTimestampHistogramAfterPartitionEviction() throws Exception { - int keysCnt = 50_000; - - String regionName = "default"; - - DataStorageConfiguration dsCfg = new DataStorageConfiguration().setDefaultDataRegionConfiguration( - new DataRegionConfiguration() - .setMaxSize(50L * 1024 * 1024) - .setPersistenceEnabled(true) - .setName(regionName) - .setMetricsEnabled(true) - ); - - cleanPersistenceDir(); - - try (IgniteEx ignite = startGrid(getConfiguration().setDataStorageConfiguration(dsCfg))) { - ignite.cluster().state(ClusterState.ACTIVE); - - IgniteCache cache = ignite.createCache(new CacheConfiguration<>("test-pages-ts") - .setBackups(1).setAffinity(new RendezvousAffinityFunction(false, 10))); - - try (IgniteDataStreamer streamer = ignite.dataStreamer("test-pages-ts")) { - for (int i = 0; i < keysCnt; i++) - streamer.addData(i, new byte[1000]); - } - - startGrid(getConfiguration(getTestIgniteInstanceName(1)).setDataStorageConfiguration(dsCfg)); - startGrid(getConfiguration(getTestIgniteInstanceName(2)).setDataStorageConfiguration(dsCfg)); - - resetBaselineTopology(); - - awaitPartitionMapExchange(true, true, null); - - // Force checkpoint to invalidate evicted partitions. - forceCheckpoint(ignite); - - // Check histogram after partition eviction. - SystemView pagesTsHistogram = - ignite.context().systemView().view(PAGE_TS_HISTOGRAM_VIEW); - - assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), - F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); - - stopGrid(2); - - resetBaselineTopology(); - - // Wait until rebalance complete. - assertTrue(GridTestUtils.waitForCondition(() -> ignite.context().discovery().topologyVersionEx() - .minorTopologyVersion() >= 2, 5_000L)); - - // Check histogram after rebalance. - assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), - F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); - - stopGrid(1); - - resetBaselineTopology(); - - // Allocate some pages after eviction. - for (int i = 0; i < 10_000; i++) - cache.put(i + keysCnt, new byte[1024]); - - // Acquire some outdated pages. - for (int i = 0; i < keysCnt + 10_000; i++) - assertNotNull(cache.get(i)); - - // Check histogram after replacement of outdated pages. - assertEquals(ignite.dataRegionMetrics(regionName).getPhysicalMemoryPages(), - F.sumInt(F.iterator(pagesTsHistogram, v -> (int)v.pagesCount(), true))); - } - finally { - stopAllGrids(); - } - } - - /** */ - @Test - public void testConfigurationView() throws Exception { - long expMaxSize = 10 * MB; - - String expName = "my-instance"; - - String expDrName = "my-dr"; - - IgniteConfiguration icfg = getConfiguration(expName) - .setIncludeEventTypes(EVT_CONSISTENCY_VIOLATION) - .setDataStorageConfiguration(new DataStorageConfiguration() - .setDefaultDataRegionConfiguration( - new DataRegionConfiguration() - .setLazyMemoryAllocation(false)) - .setDataRegionConfigurations( - new DataRegionConfiguration() - .setName(expDrName) - .setMaxSize(expMaxSize))); - - try (IgniteEx ignite = startGrid(icfg)) { - Map viewContent = new HashMap<>(); - - ignite.context().systemView().view(CFG_VIEW) - .forEach(view -> viewContent.put(view.name(), view.value())); - - assertEquals(expName, viewContent.get("IgniteInstanceName")); - assertEquals( - "false", - viewContent.get("DataStorageConfiguration.DefaultDataRegionConfiguration.LazyMemoryAllocation") - ); - assertEquals(expDrName, viewContent.get("DataStorageConfiguration.DataRegionConfigurations[0].Name")); - assertEquals( - Long.toString(expMaxSize), - viewContent.get("DataStorageConfiguration.DataRegionConfigurations[0].MaxSize") - ); - assertEquals( - CacheAtomicityMode.TRANSACTIONAL.name(), - viewContent.get("CacheConfiguration[0].AtomicityMode") - ); - assertTrue(viewContent.containsKey("AddressResolver")); - assertNull(viewContent.get("AddressResolver")); - assertEquals("[" + EVT_CONSISTENCY_VIOLATION + ']', viewContent.get("IncludeEventTypes")); - } - } - - /** */ - @Test - public void testPluginView() throws Exception { - try (IgniteEx n = startGrid(getConfiguration().setPluginProviders(new TestPluginProvider()))) { - SystemView view = n.context().systemView().view(PLUGINS_SYS_VIEW); - - PluginView testPluginView = StreamSupport.stream(view.spliterator(), false) - .filter(v -> "FOR_SYS_VIEW_PLUGIN_NAME".equals(v.name())) - .findFirst() - .orElseThrow(() -> new AssertionError("Plugin not found")); - - assertEquals("FOR_SYS_VIEW_PLUGIN_NAME", testPluginView.name()); - assertEquals("FOR_SYS_VIEW_PLUGIN_INFO", testPluginView.info()); - assertEquals("42", testPluginView.version()); - assertEquals(TestPluginProvider.TestPlugin.class.getName(), testPluginView.className()); - } - } - - /** Test node filter. */ - public static class TestNodeFilter implements IgnitePredicate { - /** {@inheritDoc} */ - @Override public boolean apply(ClusterNode node) { - return true; - } - } - - /** Test runnable. */ - public static class TestRunnable implements Runnable { - /** */ - private final CountDownLatch latch; - - /** */ - private final int idx; - - /** */ - public TestRunnable(CountDownLatch latch, int idx) { - this.latch = latch; - this.idx = idx; - } - - /** {@inheritDoc} */ - @Override public void run() { - try { - latch.await(5, TimeUnit.SECONDS); - } - catch (InterruptedException e) { - throw new IgniteException(e); - } - } - - /** {@inheritDoc} */ - @Override public String toString() { - return getClass().getSimpleName() + idx; - } - } - - /** */ - private static class UserTask implements ComputeTask { - /** {@inheritDoc} */ - @Override public @NotNull Map map( - List subgrid, - @Nullable Object arg - ) throws IgniteException { - return subgrid.stream().collect(Collectors.toMap(k -> new UserJob(), Function.identity())); - } - - /** {@inheritDoc} */ - @Override public ComputeJobResultPolicy result(ComputeJobResult res, List rcvd) throws IgniteException { - return ComputeJobResultPolicy.WAIT; - } - - /** {@inheritDoc} */ - @Nullable @Override public Object reduce(List results) throws IgniteException { - return 1; - } - - /** */ - private static class UserJob implements ComputeJob { - /** {@inheritDoc} */ - @Override public void cancel() { - // No-op. - } - - /** {@inheritDoc} */ - @Override public Object execute() throws IgniteException { - jobStartedLatch.countDown(); - - try { - assertTrue(releaseJobLatch.await(30_000, TimeUnit.MILLISECONDS)); - } - catch (InterruptedException e) { - throw new RuntimeException(e); - } - - return 1; - } - } - } - - /** */ - @GridInternal - public static class InternalTask extends UserTask { - // No-op. - } - - /** */ - private static class TestPluginProvider extends AbstractTestPluginProvider { - /** {@inheritDoc} */ - @Override public String name() { - return "FOR_SYS_VIEW_PLUGIN_NAME"; - } - - /** {@inheritDoc} */ - @Override public String version() { - return "42"; - } - - /** {@inheritDoc} */ - @Override public String info() { - return "FOR_SYS_VIEW_PLUGIN_INFO"; - } - - /** {@inheritDoc} */ - @Override public T plugin() { - return (T)new TestPlugin(); - } - - /** */ - private static class TestPlugin implements IgnitePlugin { - } - } -} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewServiceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewServiceTest.java new file mode 100644 index 0000000000000..d9a32a6bbcd23 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewServiceTest.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.processors.service.DummyService; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.lang.IgnitePredicate; +import org.apache.ignite.services.ServiceConfiguration; +import org.apache.ignite.spi.systemview.view.ServiceView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.service.IgniteServiceProcessor.SVCS_VIEW; + +/** Tests for {@link SystemView} for services. */ +public class SystemViewServiceTest extends SystemViewAbstractTest { + /** Tests work of {@link SystemView} for services. */ + @Test + public void testServices() throws Exception { + try (IgniteEx g = startGrid()) { + { + ServiceConfiguration srvcCfg = new ServiceConfiguration(); + + srvcCfg.setName("service"); + srvcCfg.setMaxPerNodeCount(1); + srvcCfg.setService(new DummyService()); + srvcCfg.setNodeFilter(new TestNodeFilter()); + + g.services().deploy(srvcCfg); + + SystemView srvs = g.context().systemView().view(SVCS_VIEW); + + assertEquals(g.context().service().serviceDescriptors().size(), F.size(srvs.iterator())); + + ServiceView sview = srvs.iterator().next(); + + assertEquals(srvcCfg.getName(), sview.name()); + assertNotNull(sview.serviceId()); + assertEquals(DummyService.class, sview.serviceClass()); + assertEquals(srvcCfg.getMaxPerNodeCount(), sview.maxPerNodeCount()); + assertNull(sview.cacheName()); + assertNull(sview.affinityKey()); + assertEquals(TestNodeFilter.class, sview.nodeFilter()); + assertFalse(sview.staticallyConfigured()); + assertEquals(g.localNode().id(), sview.originNodeId()); + assertEquals(F.asMap(g.localNode().id(), 1), sview.topologySnapshot()); + } + + { + g.createCache("test-cache"); + + ServiceConfiguration srvcCfg = new ServiceConfiguration(); + + srvcCfg.setName("service-2"); + srvcCfg.setMaxPerNodeCount(2); + srvcCfg.setService(new DummyService()); + srvcCfg.setNodeFilter(new TestNodeFilter()); + srvcCfg.setCacheName("test-cache"); + srvcCfg.setAffinityKey(1L); + + g.services().deploy(srvcCfg); + + final ServiceView[] sview = {null}; + + g.context().systemView().view(SVCS_VIEW).forEach(sv -> { + if (sv.name().equals(srvcCfg.getName())) + sview[0] = sv; + }); + + assertEquals(srvcCfg.getName(), sview[0].name()); + assertNotNull(sview[0].serviceId()); + assertEquals(DummyService.class, sview[0].serviceClass()); + assertEquals(srvcCfg.getMaxPerNodeCount(), sview[0].maxPerNodeCount()); + assertEquals("test-cache", sview[0].cacheName()); + assertEquals("1", sview[0].affinityKey()); + assertEquals(TestNodeFilter.class, sview[0].nodeFilter()); + assertFalse(sview[0].staticallyConfigured()); + assertEquals(g.localNode().id(), sview[0].originNodeId()); + assertEquals(F.asMap(g.localNode().id(), 2), sview[0].topologySnapshot()); + } + } + } + + /** Test node filter. */ + public static class TestNodeFilter implements IgnitePredicate { + /** {@inheritDoc} */ + @Override public boolean apply(ClusterNode node) { + return true; + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSnapshotsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSnapshotsTest.java new file mode 100644 index 0000000000000..e6fcf8144b0c6 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSnapshotsTest.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.List; +import com.google.common.collect.Lists; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.util.typedef.T2; +import org.apache.ignite.spi.systemview.view.SnapshotView; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage.METASTORAGE_CACHE_NAME; +import static org.apache.ignite.spi.systemview.view.SnapshotView.SNAPSHOT_SYS_VIEW; + +/** Tests for {@link SystemView} for snapshots. */ +public class SystemViewSnapshotsTest extends SystemViewAbstractTest { + /** */ + @Test + public void testSnapshot() throws Exception { + cleanPersistenceDir(); + + String dfltCacheGrp = "testGroup"; + + String testSnap0 = "testSnap0"; + String testSnap1 = "testSnap1"; + + try (IgniteEx ignite = startGrid(getConfiguration() + .setCacheConfiguration(new CacheConfiguration<>(DEFAULT_CACHE_NAME).setGroupName(dfltCacheGrp)) + .setDataStorageConfiguration( + new DataStorageConfiguration().setDefaultDataRegionConfiguration( + new DataRegionConfiguration().setName("pds").setPersistenceEnabled(true) + ).setWalCompactionEnabled(true))) + ) { + ignite.cluster().state(ClusterState.ACTIVE); + + ignite.cache(DEFAULT_CACHE_NAME).put(1, 1); + + ignite.snapshot().createSnapshot(testSnap0).get(); + ignite.snapshot().createSnapshot(testSnap1).get(getTestTimeout()); + ignite.snapshot().createIncrementalSnapshot(testSnap1).get(getTestTimeout()); + ignite.snapshot().createIncrementalSnapshot(testSnap1).get(getTestTimeout()); + + SystemView views = ignite.context().systemView().view(SNAPSHOT_SYS_VIEW); + + List> exp = Lists.newArrayList( + new T2<>(testSnap0, null), + new T2<>(testSnap1, null), + new T2<>(testSnap1, 1), + new T2<>(testSnap1, 2)); + + assertEquals(4, views.size()); + + for (SnapshotView v: views) { + assertTrue(exp.remove(new T2<>(v.name(), v.incrementIndex()))); + + assertEquals(ignite.localNode().consistentId().toString(), v.consistentId()); + assertNotNull(v.snapshotRecordSegment()); + assertTrue("snapshotTime should be non-zero value", + v.snapshotTime() > 0); + + Integer incIdx = v.incrementIndex(); + + if (incIdx == null) { + assertEquals(ignite.localNode().consistentId().toString(), v.baselineNodes()); + assertEquals(String.join(",", dfltCacheGrp, METASTORAGE_CACHE_NAME), v.cacheGroups()); + assertEquals("FULL", v.type()); + } + else + assertEquals("INCREMENTAL", v.type()); + } + + assertTrue(exp.isEmpty()); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewTransactionsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewTransactionsTest.java new file mode 100644 index 0000000000000..1d07df05bff55 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewTransactionsTest.java @@ -0,0 +1,155 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metric; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.spi.systemview.view.SystemView; +import org.apache.ignite.spi.systemview.view.TransactionView; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.transactions.Transaction; +import org.junit.Test; + +import static org.apache.ignite.internal.processors.cache.GridCacheUtils.cacheId; +import static org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager.TXS_MON_LIST; +import static org.apache.ignite.internal.util.lang.GridFunc.alwaysTrue; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; +import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC; +import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; +import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ; +import static org.apache.ignite.transactions.TransactionIsolation.SERIALIZABLE; +import static org.apache.ignite.transactions.TransactionState.ACTIVE; + +/** Tests for {@link SystemView} for transactions. */ +public class SystemViewTransactionsTest extends SystemViewAbstractTest { + /** */ + @Test + public void testTransactions() throws Exception { + try (IgniteEx g = startGrid(0)) { + IgniteCache cache1 = g.createCache(new CacheConfiguration("c1") + .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL)); + + IgniteCache cache2 = g.createCache(new CacheConfiguration("c2") + .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL)); + + SystemView txs = g.context().systemView().view(TXS_MON_LIST); + + assertEquals(0, F.size(txs.iterator(), alwaysTrue())); + + CountDownLatch latch = new CountDownLatch(1); + + try { + AtomicInteger cntr = new AtomicInteger(); + + GridTestUtils.runMultiThreadedAsync(() -> { + try (Transaction tx = g.transactions().withLabel("test").txStart(PESSIMISTIC, REPEATABLE_READ)) { + cache1.put(cntr.incrementAndGet(), cntr.incrementAndGet()); + cache1.put(cntr.incrementAndGet(), cntr.incrementAndGet()); + + latch.await(); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + }, 5, "xxx"); + + boolean res = waitForCondition(() -> txs.size() == 5, 10_000L); + + assertTrue(res); + + TransactionView txv = txs.iterator().next(); + + assertEquals(g.localNode().id(), txv.localNodeId()); + assertEquals(txv.isolation(), REPEATABLE_READ); + assertEquals(txv.concurrency(), PESSIMISTIC); + assertEquals(txv.state(), ACTIVE); + assertNotNull(txv.xid()); + assertFalse(txv.system()); + assertFalse(txv.implicit()); + assertFalse(txv.implicitSingle()); + assertTrue(txv.near()); + assertFalse(txv.dht()); + assertTrue(txv.colocated()); + assertTrue(txv.local()); + assertEquals("test", txv.label()); + assertFalse(txv.onePhaseCommit()); + assertFalse(txv.internal()); + assertEquals(0, txv.timeout()); + assertTrue(txv.startTime() <= System.currentTimeMillis()); + assertEquals(String.valueOf(cacheId(cache1.getName())), txv.cacheIds()); + + GridTestUtils.runMultiThreadedAsync(() -> { + try (Transaction tx = g.transactions().txStart(OPTIMISTIC, SERIALIZABLE)) { + cache1.put(cntr.incrementAndGet(), cntr.incrementAndGet()); + cache1.put(cntr.incrementAndGet(), cntr.incrementAndGet()); + cache2.put(cntr.incrementAndGet(), cntr.incrementAndGet()); + + latch.await(); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + }, 5, "xxx"); + + res = waitForCondition(() -> txs.size() == 10, 10_000L); + + assertTrue(res); + + for (TransactionView tx : txs) { + if (PESSIMISTIC == tx.concurrency()) + continue; + + assertEquals(g.localNode().id(), tx.localNodeId()); + assertEquals(tx.isolation(), SERIALIZABLE); + assertEquals(tx.concurrency(), OPTIMISTIC); + assertEquals(tx.state(), ACTIVE); + assertNotNull(tx.xid()); + assertFalse(tx.system()); + assertFalse(tx.implicit()); + assertFalse(tx.implicitSingle()); + assertTrue(tx.near()); + assertFalse(tx.dht()); + assertTrue(tx.colocated()); + assertTrue(tx.local()); + assertNull(tx.label()); + assertFalse(tx.onePhaseCommit()); + assertFalse(tx.internal()); + assertEquals(0, tx.timeout()); + assertTrue(tx.startTime() <= System.currentTimeMillis()); + + String s1 = cacheId(cache1.getName()) + "," + cacheId(cache2.getName()); + String s2 = cacheId(cache2.getName()) + "," + cacheId(cache1.getName()); + + assertTrue(s1.equals(tx.cacheIds()) || s2.equals(tx.cacheIds())); + } + } + finally { + latch.countDown(); + } + + boolean res = waitForCondition(() -> txs.size() == 0, 10_000L); + + assertTrue(res); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java index ddffe35601087..aaec37f1532a3 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Random; @@ -38,7 +39,6 @@ import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; -import org.apache.ignite.events.Event; import org.apache.ignite.events.EventType; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; @@ -51,7 +51,6 @@ import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteBiPredicate; -import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.metric.MetricRegistry; import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.spi.metric.IntMetric; @@ -427,7 +426,19 @@ public void testRebalanceProgressUnderLoad() throws Exception { } }); - IgniteEx ig = startGrid(4); + CountDownLatch latch = new CountDownLatch(1); + + // Register the listener via node configuration so it is active before the node joins and starts rebalancing: + // otherwise EVT_CACHE_REBALANCE_STOPPED may fire before localListen() and the latch would never be released. + IgniteConfiguration cfg = optimize(getConfiguration(getTestIgniteInstanceName(4))); + + cfg.setLocalEventListeners(Collections.singletonMap(evt -> { + latch.countDown(); + + return false; + }, new int[] {EventType.EVT_CACHE_REBALANCE_STOPPED})); + + IgniteEx ig = startGrid(cfg); GridTestUtils.runAsync(new Runnable() { @Override public void run() { @@ -439,16 +450,6 @@ public void testRebalanceProgressUnderLoad() throws Exception { } }); - CountDownLatch latch = new CountDownLatch(1); - - ig.events().localListen(new IgnitePredicate() { - @Override public boolean apply(Event evt) { - latch.countDown(); - - return false; - } - }, EventType.EVT_CACHE_REBALANCE_STOPPED); - latch.await(); GridTestUtils.waitForCondition(new GridAbsPredicate() { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOperationContextTransactionalLockTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOperationContextTransactionalLockTest.java new file mode 100644 index 0000000000000..76e36e6ab542c --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOperationContextTransactionalLockTest.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache; + +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheEntry; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry; +import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.apache.ignite.transactions.Transaction; +import org.junit.Test; + +import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; +import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED; + +/** Tests operation context propagation when a versioned cache entry is locked in a transaction. */ +public class CacheOperationContextTransactionalLockTest extends GridCommonAbstractTest { + /** */ + private static final int KEY = 1; + + /** */ + private static Ignite ignite; + + /** */ + private static IgniteCache cache; + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + ignite = startGrid(0); + + cache = ignite.createCache(new CacheConfiguration(DEFAULT_CACHE_NAME) + .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL)); + + cache.put(KEY, KEY); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + + ignite = null; + cache = null; + + super.afterTestsStopped(); + } + + /** Checks the defaults used when there is no operation context. */ + @Test + public void testDefaultOperationContext() throws Exception { + assertTxEntryFlags(internalCache(), false, false, false, false); + } + + /** Checks propagation of the skip-store flag. */ + @Test + public void testSkipStoreOperationContext() throws Exception { + assertTxEntryFlags(internalCache().withSkipStore(), true, false, false, false); + } + + /** Checks propagation of the skip-read-through flag. */ + @Test + public void testSkipReadThroughOperationContext() throws Exception { + assertTxEntryFlags(internalCache().withSkipReadThrough(), false, true, false, false); + } + + /** Checks propagation of the keep-binary-in-interceptor flag. */ + @Test + public void testKeepBinaryInInterceptorOperationContext() throws Exception { + assertTxEntryFlags(internalCache().withKeepBinaryInInterceptor(), false, false, true, false); + } + + /** Checks propagation of the keep-binary flag. */ + @Test + public void testKeepBinaryOperationContext() throws Exception { + assertTxEntryFlags(internalCache().keepBinary(), false, false, true, true); + } + + /** + * Locks a versioned entry and checks flags stored in its transaction entry. + * + * @param internalCache Internal cache projection used to acquire the lock. + * @param skipStore Expected skip-store flag. + * @param skipReadThrough Expected skip-read-through flag. + * @param keepBinaryInInterceptor Expected keep-binary-in-interceptor flag. + * @param keepBinary Expected keep-binary flag. + * @throws Exception If failed. + */ + private void assertTxEntryFlags( + IgniteInternalCache internalCache, + boolean skipStore, + boolean skipReadThrough, + boolean keepBinaryInInterceptor, + boolean keepBinary + ) throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + assertNotNull(entry); + assertNotNull(entry.version()); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + assertTrue(internalCache.lockTxEntry(entry, 0)); + + GridCacheContext ctx = internalCache.context(); + IgniteTxKey txKey = ctx.txKey(ctx.toCacheKeyObject(KEY)); + IgniteTxEntry txEntry = internalCache.tx().entry(txKey); + + assertNotNull(txEntry); + assertEquals(skipStore, txEntry.skipStore()); + assertEquals(skipReadThrough, txEntry.skipReadThrough()); + assertEquals(keepBinaryInInterceptor, txEntry.keepBinaryInInterceptor()); + assertEquals(keepBinary, txEntry.keepBinary()); + + tx.commit(); + } + } + + /** Returns the cache's internal proxy. */ + @SuppressWarnings("unchecked") + private static IgniteInternalCache internalCache() { + return cache.unwrap(IgniteCacheProxy.class).internalProxy(); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheVersionedEntryTransactionalLockTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheVersionedEntryTransactionalLockTest.java new file mode 100644 index 0000000000000..41acd7a472c33 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheVersionedEntryTransactionalLockTest.java @@ -0,0 +1,514 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache; + +import java.util.Collection; +import java.util.List; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheEntry; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.NearCacheConfiguration; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.apache.ignite.transactions.Transaction; +import org.apache.ignite.transactions.TransactionIsolation; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; +import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED; +import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ; + +/** + * Tests transactional locks acquired only for unchanged cache entry versions. + */ +@RunWith(Parameterized.class) +public class CacheVersionedEntryTransactionalLockTest extends GridCommonAbstractTest { + /** */ + private static Ignite ignite0; + + /** */ + private static Ignite ignite1; + + /** */ + private static Ignite client; + + /** */ + @Parameterized.Parameter(0) + public boolean useNearCache; + + /** */ + @Parameterized.Parameter(1) + public int backups; + + /** */ + @Parameterized.Parameter(2) + public boolean replicated; + + /** */ + @Parameterized.Parameter(3) + public boolean batch; + + /** + * Returns data for test. + * + * @return Test parameters. + */ + @Parameterized.Parameters(name = "useNearCache={0}, backups={1}, replicated={2}, batch={3}") + public static Collection testData() { + return List.of(new Object[][] { + {false, 0, false, false}, + {false, 0, false, true}, + {false, 0, true, false}, + {false, 0, true, true}, + {false, 1, false, false}, + {false, 1, false, true}, + {false, 1, true, false}, + {false, 1, true, true}, + {false, 2, false, false}, + {false, 2, false, true}, + {false, 2, true, false}, + {false, 2, true, true}, + {true, 0, false, false}, + {true, 0, false, true}, + {true, 0, true, false}, + {true, 0, true, true}, + {true, 1, false, false}, + {true, 1, false, true}, + {true, 1, true, false}, + {true, 1, true, true}, + {true, 2, false, false}, + {true, 2, false, true}, + {true, 2, true, false}, + {true, 2, true, true} + }); + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + ignite0 = startGridsMultiThreaded(4); + + awaitPartitionMapExchange(); + + ignite1 = grid(1); + client = startClientGrid(); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + + ignite0 = null; + ignite1 = null; + client = null; + + super.afterTestsStopped(); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + ignite0.destroyCache(DEFAULT_CACHE_NAME); + + super.afterTest(); + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + return super.getConfiguration(igniteInstanceName) + .setConsistentId(igniteInstanceName); + } + + /** {@inheritDoc} */ + @Override protected long getTestTimeout() { + return 120_000; + } + + /** + * Creates transactional cache. + * + * @param ignite Node. + * @return Transactional cache. + */ + private IgniteCache transactionalCache(Ignite ignite) { + CacheConfiguration ccfg = + new CacheConfiguration<>(DEFAULT_CACHE_NAME) + .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC) + .setNearConfiguration(useNearCache ? new NearCacheConfiguration<>() : null) + .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL) + .setCacheMode(replicated ? CacheMode.REPLICATED : CacheMode.PARTITIONED) + .setBackups(backups); + + return (IgniteCache)ignite.createCache(ccfg); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockBeforePutFromClientTest() throws Exception { + IgniteCache cache = transactionalCache(client); + + int key = 42; + + checkLockBeforePut(cache, key, READ_COMMITTED); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockBeforePutLocalKeyTest() throws Exception { + IgniteCache cache = transactionalCache(ignite0); + + int key = primaryKey(cache); + + checkLockBeforePut(cache, key, READ_COMMITTED); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockBeforePutRemoteKeyTest() throws Exception { + IgniteCache cache = transactionalCache(ignite0); + + int key = primaryKey(ignite1.cache(DEFAULT_CACHE_NAME)); + + checkLockBeforePut(cache, key, REPEATABLE_READ); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockBeforePutLocalKeyRepeatableReadTest() throws Exception { + IgniteCache cache = transactionalCache(ignite0); + + int key = primaryKey(cache); + + checkLockBeforePut(cache, key, REPEATABLE_READ); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockBeforePutRemoteKeyRepeatableReadTest() throws Exception { + IgniteCache cache = transactionalCache(ignite0); + + int key = primaryKey(ignite1.cache(DEFAULT_CACHE_NAME)); + + checkLockBeforePut(cache, key, REPEATABLE_READ); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testEntryVersionDoesNotChangeWhenEntryIsNotUpdated() throws Exception { + IgniteCache cache = transactionalCache(ignite0); + + int locKey = primaryKey(cache); + int remoteKey = primaryKey(ignite1.cache(DEFAULT_CACHE_NAME)); + + cache.put(locKey, 0); + cache.put(remoteKey, 0); + + CacheEntry locEntry = cache.getEntry(locKey); + CacheEntry remoteEntry = cache.getEntry(remoteKey); + + try (Transaction tx = ignite0.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + if (batch) { + assertTrue(acquireLockForEntries(cache, List.of(locEntry, remoteEntry), 0)); + } + else { + assertTrue(acquireLockForEntry(cache, locEntry, 0)); + assertTrue(acquireLockForEntry(cache, remoteEntry, 0)); + } + + tx.commit(); + } + + assertEquals(locEntry.version(), cache.getEntry(locKey).version()); + assertEquals(remoteEntry.version(), cache.getEntry(remoteKey).version()); + + try (Transaction tx = ignite0.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + if (batch) { + assertTrue(acquireLockForEntries(cache, List.of(locEntry, remoteEntry), 0)); + } + else { + assertTrue(acquireLockForEntry(cache, locEntry, 0)); + assertTrue(acquireLockForEntry(cache, remoteEntry, 0)); + } + + tx.rollback(); + } + + assertEquals(locEntry.version(), cache.getEntry(locKey).version()); + assertEquals(remoteEntry.version(), cache.getEntry(remoteKey).version()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testVersionedEntryLockReturnsFalseWhenEntryIsLockedByAnotherTransactionNoWait() throws Exception { + checkReturningWhenCanNotWaitForLock(-1, false, false); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testVersionedEntryLockReturnsFalseWhenEntryIsLockedByAnotherTransaction() throws Exception { + checkReturningWhenCanNotWaitForLock(200, false, false); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testVersionedEntryLockReturnsFalseWhenLocalEntryIsLockedByAnotherTransaction() throws Exception { + checkReturningWhenCanNotWaitForLock(200, false, true); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testVersionedEntryLockReturnsFalseWhenEntryIsLockedByAnotherTransactionAndCommit() throws Exception { + checkReturningWhenCanNotWaitForLock(200, true, false); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testVersionedEntryLockReturnsFalseWhenLocalEntryIsLockedByAnotherTransactionAndCommit() throws Exception { + checkReturningWhenCanNotWaitForLock(200, true, true); + } + + /** + * Checks that lock acquisition can be retried in the same transaction after the competing transaction finishes. + * + * @throws Exception If failed. + */ + @Test + public void testVersionedEntryLockCanBeRetriedAfterWaitTimeout() throws Exception { + Ignite holder = ignite0; + Ignite initiator = ignite1; + + IgniteCache holderCache = transactionalCache(holder); + IgniteCache cache = initiator.cache(DEFAULT_CACHE_NAME); + + int key = primaryKey(holderCache); + + holderCache.put(key, 0); + + CacheEntry entry = cache.getEntry(key); + + try (Transaction holderTx = holder.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + holderCache.put(key, 42); + + try (Transaction tx = initiator.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + if (batch) + assertFalse(acquireLockForEntries(cache, List.of(entry), 200)); + else + assertFalse(acquireLockForEntry(cache, entry, 200)); + + holderTx.rollback(); + + if (batch) + assertTrue(acquireLockForEntries(cache, List.of(entry), 5_000)); + else + assertTrue(acquireLockForEntry(cache, entry, 5_000)); + + cache.put(key, 1); + + tx.commit(); + } + } + + assertEquals(1, cache.get(key).intValue()); + } + + /** + * Checks that the lock entry method returns {@code false} when can not wait for lock. + * + * @param timeout Timeout. + * @param commit Whether to commit the transaction. + * @param locForLocal Whether the contended key should be local to the lock initiator. + * @throws IgniteCheckedException If failed. + */ + private void checkReturningWhenCanNotWaitForLock(long timeout, boolean commit, boolean locForLocal) throws IgniteCheckedException { + Ignite holder = ignite0; + Ignite initiator = ignite1; + + IgniteCache holderCache = transactionalCache(holder); + IgniteCache cache = initiator.cache(DEFAULT_CACHE_NAME); + + List firstKeySet = locForLocal ? primaryKeys(cache, 2) : primaryKeys(holderCache, 2); + Integer concurentLockedKey = firstKeySet.get(0); + Integer txKey1 = firstKeySet.get(1); + Integer txKey2 = locForLocal ? primaryKey(holderCache) : primaryKey(cache); + + holderCache.put(concurentLockedKey, 0); + holderCache.put(txKey1, 0); + holderCache.put(txKey2, 0); + + CacheEntry entry = cache.getEntry(concurentLockedKey); + + try (Transaction holderTx = holder.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + holderCache.put(concurentLockedKey, 42); + + try (Transaction tx = initiator.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + long startWaiting = U.currentTimeMillis(); + + if (batch) { + assertFalse(acquireLockForEntries(cache, List.of( + cache.getEntry(txKey1), + entry, + cache.getEntry(txKey2) + ), timeout)); + + assertTrue(acquireLockForEntries(cache, List.of( + cache.getEntry(txKey1), + cache.getEntry(txKey2) + ), timeout)); + } + else { + assertTrue(acquireLockForEntry(cache, cache.getEntry(txKey1), timeout)); + assertTrue(acquireLockForEntry(cache, cache.getEntry(txKey2), timeout)); + + assertFalse(acquireLockForEntry(cache, entry, timeout)); + } + + long waitTime = U.currentTimeMillis() - startWaiting; + + assertTrue("Waited for lock for " + waitTime + " ms but timeout is " + timeout + " ms.", + waitTime >= timeout); + + cache.put(txKey1, 42); + cache.put(txKey2, 42); + + if (commit) + tx.commit(); + } + + holderTx.rollback(); + } + + assertEquals(0, holderCache.get(concurentLockedKey).intValue()); + assertEquals(0, cache.get(concurentLockedKey).intValue()); + + if (commit) { + assertEquals(42, holderCache.get(txKey1).intValue()); + assertEquals(42, cache.get(txKey2).intValue()); + } + else { + assertEquals(0, holderCache.get(txKey1).intValue()); + assertEquals(0, cache.get(txKey2).intValue()); + } + } + + /** + * Checks locking an entry before updating it. + * + * @param cache Cache. + * @param key Key. + * @param txIsolation Transaction isolation. + * @throws IgniteCheckedException If failed. + */ + private void checkLockBeforePut( + IgniteCache cache, + int key, + TransactionIsolation txIsolation + ) throws IgniteCheckedException { + cache.put(key, 0); + + CacheEntry entry = cache.getEntry(key); + + assertNotNull(entry); + assertNotNull(entry.version()); + + Ignite ign = cache.unwrap(Ignite.class); + + try (Transaction tx = ign.transactions().txStart(PESSIMISTIC, txIsolation)) { + if (batch) + assertTrue(acquireLockForEntries(cache, List.of(entry), 0)); + else + assertTrue(acquireLockForEntry(cache, entry, 0)); + + assertEquals(0, cache.get(key).intValue()); + + cache.put(key, 1); + + assertEquals(1, cache.get(key).intValue()); + + tx.commit(); + } + + assertEquals(1, cache.get(key).intValue()); + assertTrue(cache.getEntry(key).version().compareTo(entry.version()) > 0); + } + + /** + * Acquires a transactional lock for an entry. + * + * @param cache Cache. + * @param entry Entry. + * @param timeout Lock wait timeout. + * @return {@code true} if the lock was acquired. + * @throws IgniteCheckedException If failed. + */ + @SuppressWarnings("unchecked") + private static boolean acquireLockForEntry( + IgniteCache cache, + CacheEntry entry, + long timeout + ) throws IgniteCheckedException { + return cache.unwrap(IgniteCacheProxy.class).internalProxy().lockTxEntry(entry, timeout); + } + + /** + * Acquires transactional locks for entries. + * + * @param cache Cache. + * @param entries Entries. + * @param timeout Lock wait timeout. + * @return {@code true} if all locks were acquired. + * @throws IgniteCheckedException If failed. + */ + @SuppressWarnings("unchecked") + private static boolean acquireLockForEntries( + IgniteCache cache, + List> entries, + long timeout + ) throws IgniteCheckedException { + return cache.unwrap(IgniteCacheProxy.class).internalProxy().lockTxEntries(entries, timeout); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ConcurrentCheckpointAndUpdateTtlTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ConcurrentCheckpointAndUpdateTtlTest.java index bbd515cde7fe5..0dce369f510dd 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ConcurrentCheckpointAndUpdateTtlTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ConcurrentCheckpointAndUpdateTtlTest.java @@ -147,7 +147,7 @@ public void concurrentUpdateTouchCheckpointKey() throws Exception { }, 1, "touch"); IgniteInternalFuture cpFut = runMultiThreadedAsync(() -> { - for (int i = 0; i < 1_000; i++) { + for (int i = 0; i < GridTestUtils.SF.applyLB(1_000, 200); i++) { try { forceCheckpoint(F.asList(grid(0), grid(1))); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java index 42975f9c205b5..d8f8624f1ebb6 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java @@ -34,6 +34,7 @@ import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.transactions.Transaction; import org.apache.ignite.transactions.TransactionConcurrency; @@ -263,7 +264,7 @@ private void txOperations(TransactionConcurrency concurrency, boolean checkData = fullSync && !optimistic; - long stopTime = System.currentTimeMillis() + 10_000; + long stopTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(10_000, 2_000); for (int i = 0; i < 10_000; i++) { if (i % 100 == 0) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePutAllRestartTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePutAllRestartTest.java index 3c4bfe32a4d43..306c8abea4152 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePutAllRestartTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePutAllRestartTest.java @@ -125,7 +125,7 @@ public void testStopNode() throws Exception { try { ThreadLocalRandom rnd = ThreadLocalRandom.current(); - long endTime = System.currentTimeMillis() + 2 * 60_000; + long endTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(2 * 60_000, 20_000); while (System.currentTimeMillis() < endTime) { int node = rnd.nextInt(1, NODES); @@ -151,7 +151,7 @@ public void testStopOriginatingNode() throws Exception { ThreadLocalRandom rnd = ThreadLocalRandom.current(); - long endTime = System.currentTimeMillis() + 2 * 60_000; + long endTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(2 * 60_000, 20_000); while (System.currentTimeMillis() < endTime) { int node = rnd.nextInt(0, NODES); @@ -168,7 +168,7 @@ public void testStopOriginatingNode() throws Exception { Random rnd = new Random(); - long endTime = System.currentTimeMillis() + 60_000; + long endTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(60_000, 10_000); try { int iter = 0; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/LockTxEntryOneNodeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/LockTxEntryOneNodeTest.java new file mode 100644 index 0000000000000..087526b41065e --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/LockTxEntryOneNodeTest.java @@ -0,0 +1,602 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.Callable; +import javax.cache.processor.EntryProcessor; +import javax.cache.processor.EntryProcessorException; +import javax.cache.processor.MutableEntry; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheEntry; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.NearCacheConfiguration; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.apache.ignite.transactions.Transaction; +import org.apache.ignite.transactions.TransactionTimeoutException; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import static org.apache.ignite.cache.CacheMode.PARTITIONED; +import static org.apache.ignite.cache.CacheMode.REPLICATED; +import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC; +import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; +import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED; +import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ; + +/** + * Tests transactional entry locking through internal cache API. + */ +@RunWith(Parameterized.class) +public class LockTxEntryOneNodeTest extends GridCommonAbstractTest { + /** */ + private static final int KEY = 1; + + /** */ + private static final int INIT_VAL = 1; + + /** */ + private static final int UPDATED_VAL = 2; + + /** */ + private static Ignite ignite; + + /** */ + @Parameterized.Parameter(0) + public boolean commit; + + /** */ + @Parameterized.Parameter(1) + public boolean useNearCache; + + /** */ + @Parameterized.Parameter(2) + public CacheMode cacheMode; + + /** Operation that enlists an entry in a transaction before a versioned lock is acquired. */ + private enum TxOperation { + /** Read. */ + GET, + + /** Update. */ + PUT, + + /** Update with previous value returned. */ + GET_AND_PUT, + + /** Delete. */ + REMOVE, + + /** Delete with previous value returned. */ + GET_AND_REMOVE, + + /** Transform. */ + INVOKE + } + + /** Cache. */ + private IgniteCache cache; + + /** + * Returns data for test. + * + * @return Test parameters. + */ + @Parameterized.Parameters(name = "commit={0}, useNearCache={1}, cacheMode={2}") + public static Collection testData() { + return List.of(new Object[][] { + {false, false, PARTITIONED}, + {false, false, REPLICATED}, + {true, false, PARTITIONED}, + {true, false, REPLICATED}, + {false, true, PARTITIONED}, + {false, true, REPLICATED}, + {true, true, PARTITIONED}, + {true, true, REPLICATED}, + }); + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + ignite = startGrid(0); + + awaitPartitionMapExchange(); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + + ignite = null; + + super.afterTestsStopped(); + } + + /** {@inheritDoc} */ + @Override protected void beforeTest() throws Exception { + super.beforeTest(); + + cache = ignite.createCache(new CacheConfiguration(DEFAULT_CACHE_NAME) + .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL) + .setNearConfiguration(useNearCache ? new NearCacheConfiguration<>() : null) + .setCacheMode(cacheMode)); + + cache.put(KEY, INIT_VAL); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + ignite.destroyCache(DEFAULT_CACHE_NAME); + + super.afterTest(); + } + + /** {@inheritDoc} */ + @Override protected long getTestTimeout() { + return 30_000; + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockTxEntryInPessimisticTransaction() throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + assertTrue(acquireLockForEntry(entry, 0)); + + assertEquals(entry.getValue(), cache.get(KEY)); + + checkInaccessInOtherTx(cache); + + if (commit) + tx.commit(); + } + + assertEquals(INIT_VAL, cache.get(KEY).intValue()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockAlreadyLockedTxEntry() throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + cache.put(KEY, UPDATED_VAL); + + assertTrue(acquireLockForEntry(entry, 0)); + + assertEquals(UPDATED_VAL, cache.get(KEY).intValue()); + + checkInaccessInOtherTx(cache); + + if (commit) + tx.commit(); + } + + assertEquals(commit ? UPDATED_VAL : INIT_VAL, cache.get(KEY).intValue()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockAlreadyEnlistedTxEntryAfterOperation() throws Exception { + for (TxOperation op : TxOperation.values()) { + int key = KEY + op.ordinal() + 1; + + cache.put(key, INIT_VAL); + + CacheEntry entry = cache.getEntry(key); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + applyOperation(op, key); + + try { + assertTrue("Failed to lock already enlisted tx entry [op=" + op + ']', + acquireLockForEntry(entry, 0)); + } + catch (AssertionError e) { + throw new AssertionError("Failed to lock already enlisted tx entry [op=" + op + ']', e); + } + + checkInaccessInOtherTx(cache, key); + + if (commit) + tx.commit(); + } + + assertEquals("Unexpected value after transaction [op=" + op + ']', + commit ? expectedValue(op) : Integer.valueOf(INIT_VAL), + cache.get(key)); + } + } + + /** + * @throws Exception If failed. + */ + @Test + public void testFailToLockTxEntryInPessimisticTransaction() throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + cache.put(KEY, UPDATED_VAL); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + assertFalse(acquireLockForEntry(entry, 0)); + + assertEquals(UPDATED_VAL, cache.get(KEY).intValue()); + + checkAccessInOtherTx(cache); + + if (commit) + tx.commit(); + } + + assertEquals(UPDATED_VAL, cache.get(KEY).intValue()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockTxEntryReturnsFalseOnTimeoutWhenLockedInOtherTransaction() throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + assertTrue(acquireLockForEntry(entry, 0)); + + IgniteInternalFuture lockFut = GridTestUtils.runAsync(new Callable() { + @Override public Boolean call() throws Exception { + boolean locked = true; + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + locked = acquireLockForEntry(entry, 100); + + assertFalse(locked); + + cache.put(2, 2); + + if (commit) + tx.commit(); + } + + return locked; + } + }); + + assertFalse(lockFut.get(10_000)); + + if (commit) + tx.commit(); + } + + assertEquals(INIT_VAL, cache.get(KEY).intValue()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockTxEntryDoesNotWaitMuchLongerThanTimeout() throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + assertTrue(acquireLockForEntry(entry, 0)); + + IgniteInternalFuture lockFut = GridTestUtils.runAsync(new Callable() { + @Override public Long call() throws Exception { + long waitTime; + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + long start = U.currentTimeMillis(); + + assertFalse(acquireLockForEntry(entry, 200)); + + waitTime = U.currentTimeMillis() - start; + + if (commit) + tx.commit(); + } + + return waitTime; + } + }); + + long waitTime = lockFut.get(10_000); + + assertTrue("Waited for lock for " + waitTime + " ms it is unexpectedly long.", + waitTime < 1_000); + + if (commit) + tx.commit(); + } + + assertEquals(INIT_VAL, cache.get(KEY).intValue()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockTxEntryReturnsFalseForLockedKeyAndTrueForOtherKey() throws Exception { + int otherKey = KEY + 1; + + cache.put(otherKey, INIT_VAL); + + CacheEntry entry = cache.getEntry(KEY); + CacheEntry otherEntry = cache.getEntry(otherKey); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + assertTrue(acquireLockForEntry(entry, 0)); + + IgniteInternalFuture lockFut = GridTestUtils.runAsync(new Callable() { + @Override public Void call() throws Exception { + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + assertFalse(acquireLockForEntry(entry, -1)); + assertTrue(acquireLockForEntry(otherEntry, -1)); + + if (commit) + tx.commit(); + } + + return null; + } + }); + + lockFut.get(10_000); + + if (commit) + tx.commit(); + } + + assertEquals(INIT_VAL, cache.get(KEY).intValue()); + assertEquals(INIT_VAL, cache.get(otherKey).intValue()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testUpdateAfterLock() throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, READ_COMMITTED)) { + assertTrue(acquireLockForEntry(entry, 0)); + + checkInaccessInOtherTx(cache); + + assertEquals(entry.getValue(), cache.get(KEY)); + + cache.put(KEY, UPDATED_VAL); + + assertEquals(UPDATED_VAL, cache.get(KEY).intValue()); + + if (commit) + tx.commit(); + } + + assertEquals(commit ? UPDATED_VAL : INIT_VAL, cache.get(KEY).intValue()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockTxEntryFailsWithoutTransaction() throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + GridTestUtils.assertThrows(log, new Callable() { + @Override public Object call() throws Exception { + acquireLockForEntry(entry, 0); + + return null; + } + }, IgniteCheckedException.class, "without transaction"); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLockTxEntryAsyncFailsInOptimisticTransaction() throws Exception { + CacheEntry entry = cache.getEntry(KEY); + + try (Transaction tx = ignite.transactions().txStart(OPTIMISTIC, REPEATABLE_READ)) { + GridTestUtils.assertThrows(log, new Callable() { + @Override public Object call() throws Exception { + return acquireLockForEntry(entry, 0); + } + }, IgniteCheckedException.class, "optimistic transaction"); + } + } + + /** + * Checks that another transaction can access the cache. + * + * @param cache Cache. + * @throws IgniteCheckedException If failed. + */ + private void checkAccessInOtherTx(IgniteCache cache) throws IgniteCheckedException { + checkAccessInOtherTx(cache, KEY); + } + + /** + * Checks that another transaction can access the cache. + * + * @param cache Cache. + * @param key Key. + * @throws IgniteCheckedException If failed. + */ + private void checkAccessInOtherTx(IgniteCache cache, int key) throws IgniteCheckedException { + IgniteInternalFuture accessFut = GridTestUtils.runAsync(new Callable() { + @Override public Void call() { + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, REPEATABLE_READ, 100, 1)) { + cache.get(key); + + tx.commit(); + } + + return null; + } + }); + + accessFut.get(10_000); + } + + /** + * Checks that another transaction cannot access the cache. + * + * @param cache Cache. + * @throws IgniteCheckedException If failed. + */ + private void checkInaccessInOtherTx(IgniteCache cache) throws IgniteCheckedException { + checkInaccessInOtherTx(cache, KEY); + } + + /** + * Checks that another transaction cannot access the cache. + * + * @param cache Cache. + * @param key Key. + * @throws IgniteCheckedException If failed. + */ + private void checkInaccessInOtherTx(IgniteCache cache, int key) throws IgniteCheckedException { + IgniteInternalFuture accessFut = GridTestUtils.runAsync(new Callable() { + @Override public Void call() { + try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, REPEATABLE_READ, 100, 1)) { + cache.get(key); + + tx.commit(); + } + + return null; + } + }); + + GridTestUtils.assertThrowsWithCause(new Callable() { + @Override public Object call() throws Exception { + return accessFut.get(10_000); + } + }, TransactionTimeoutException.class); + } + + /** + * Acquires a transactional lock for an entry. + * + * @param entry Entry. + * @param timeout Lock wait timeout. + * @return {@code true} if the lock was acquired. + * @throws IgniteCheckedException If failed. + */ + @SuppressWarnings("unchecked") + private boolean acquireLockForEntry( + CacheEntry entry, + long timeout + ) throws IgniteCheckedException { + return cache.unwrap(IgniteCacheProxy.class).internalProxy().lockTxEntry(entry, timeout); + } + + /** + * Applies cache operation inside transaction. + * + * @param op Operation. + * @param key Key. + */ + private void applyOperation(TxOperation op, int key) { + switch (op) { + case GET: + assertEquals(INIT_VAL, cache.get(key).intValue()); + + break; + + case PUT: + cache.put(key, UPDATED_VAL); + + break; + + case GET_AND_PUT: + assertEquals(INIT_VAL, cache.getAndPut(key, UPDATED_VAL).intValue()); + + break; + + case REMOVE: + assertTrue(cache.remove(key)); + + break; + + case GET_AND_REMOVE: + assertEquals(INIT_VAL, cache.getAndRemove(key).intValue()); + + break; + + case INVOKE: + cache.invoke(key, new EntryProcessor() { + @Override public Object process(MutableEntry entry, Object... args) + throws EntryProcessorException { + entry.setValue(UPDATED_VAL); + + return null; + } + }); + + break; + + default: + fail("Unexpected operation: " + op); + } + } + + /** + * @param op Operation. + * @return Expected value after committed transaction. + */ + private Integer expectedValue(TxOperation op) { + switch (op) { + case GET: + return INIT_VAL; + + case PUT: + case GET_AND_PUT: + case INVOKE: + return UPDATED_VAL; + + case REMOVE: + case GET_AND_REMOVE: + return null; + + default: + fail("Unexpected operation: " + op); + + return null; + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/MdcCacheMetricsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/MdcCacheMetricsTest.java new file mode 100644 index 0000000000000..8f390775c524f --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/MdcCacheMetricsTest.java @@ -0,0 +1,600 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeAffinityBackupFilter; +import org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeColocatedBackupFilter; +import org.apache.ignite.cache.affinity.rendezvous.MdcAffinityBackupFilter; +import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.lang.IgniteBiPredicate; +import org.apache.ignite.spi.metric.BooleanMetric; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Test; + +import static org.apache.ignite.cache.CacheMode.PARTITIONED; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_DATA_CENTER_ID; +import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.cacheMetricsRegistryName; + +/** + * Test for new cache metrics for highlighting two data safety issues in Multi DataCenter environments: + * 1. If cache configuration doesn't specify an affinity backup filter that could guarantee presence of data copy in each DC. + * 2. If cluster topology changed in such a way that partition copies are not spread across all available DCs. + */ +public class MdcCacheMetricsTest extends GridCommonAbstractTest { + /** */ + private static final int NODES_NUMBER = 5; + + /** */ + private static final String CACHE_WITH_MDC_FILTER = "mdcSafeCache0"; + + /** */ + private static final String CACHE_WITH_COLOCATED_FILTER = "mdcSafeCache1"; + + /** */ + private static final String CACHE_WITH_MDC_SAFE_ATTRIBUTE_FILTER = "mdcSafeCache2"; + + /** */ + private static final String MDC_UNSAFE_CACHE = "mdcUnsafeCache0"; + + /** */ + private static final String CACHE_WITH_MDC_UNSAFE_ATTRIBUTE_FILTER = "mdcUnsafeCache1"; + + /** */ + private static final String STRETCHED_CELL_ATTR_NAME = "DC_CELL_ATTR"; + + /** */ + private static final String ATTR_FOR_UNSAFE_ATTR_FILTER = "MDC_UNAWARE_ATTR"; + + /** */ + private static final String[] STRETCHED_CELL_IDS = {"CELL_0", "CELL_1"}; + + /** */ + private static final String DC_ID_0 = "DC_0"; + + /** */ + private static final String DC_ID_1 = "DC_1"; + + /** */ + private static final String AFFINITY_CFG_MDC_SAFE_METRIC_NAME = "IsCacheAffinityConfigurationMdcSafe"; + + /** */ + private static final String PARTITION_DISTRIBUTION_SAFE_METRIC_NAME = "IsCachePartitionDistributionSafe"; + + /** */ + private String dcId; + + /** */ + private String cellId; + + /** */ + private boolean useStaticCaches; + + /** */ + private boolean persistenceEnabled; + + /** */ + private final Set allCaches = new HashSet<>(); + + /** */ + private final Set mdcSafeCaches = new HashSet<>(); + + /** {@inheritDoc} */ + @Override protected void beforeTest() throws Exception { + super.beforeTest(); + + stopAllGrids(); + + allCaches.clear(); + mdcSafeCaches.clear(); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + stopAllGrids(); + + cleanPersistenceDir(); + + allCaches.clear(); + mdcSafeCaches.clear(); + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + cfg.setDataStorageConfiguration(new DataStorageConfiguration() + .setDefaultDataRegionConfiguration(new DataRegionConfiguration() + .setPersistenceEnabled(persistenceEnabled) + .setMaxSize(32 * 1024 * 1024) + )); + + if (useStaticCaches) { + CacheConfiguration mdcSafeCacheCfg0 = prepareCacheCfg( + CACHE_WITH_MDC_FILTER, + new MdcAffinityBackupFilter(2, 1), + true); + + CacheConfiguration mdcSafeCacheCfg1 = prepareCacheCfg( + CACHE_WITH_COLOCATED_FILTER, + new ClusterNodeAttributeColocatedBackupFilter(STRETCHED_CELL_ATTR_NAME), + true); + + CacheConfiguration mdcUnsafeCacheCfg0 = prepareCacheCfg(MDC_UNSAFE_CACHE, null, false); + + CacheConfiguration mdcUnsafeCacheCfg1 = prepareCacheCfg( + CACHE_WITH_MDC_UNSAFE_ATTRIBUTE_FILTER, + new ClusterNodeAttributeAffinityBackupFilter(ATTR_FOR_UNSAFE_ATTR_FILTER), + false); + + cfg.setCacheConfiguration(mdcSafeCacheCfg0, mdcSafeCacheCfg1, mdcUnsafeCacheCfg0, mdcUnsafeCacheCfg1); + } + + if (!cfg.isClientMode()) + cfg.setUserAttributes(F.asMap( + STRETCHED_CELL_ATTR_NAME, + cellId, + IgniteSystemProperties.IGNITE_DATA_CENTER_ID, + dcId)); + + return cfg; + } + + /** */ + private CacheConfiguration prepareCacheCfg( + String cacheName, + IgniteBiPredicate> affBackupFilter, + boolean affCfgMdcSafe) { + return prepareCacheCfg(cacheName, affBackupFilter, affCfgMdcSafe, null); + } + + /** */ + private CacheConfiguration prepareCacheCfg( + String cacheName, + IgniteBiPredicate> affBackupFilter, + boolean affCfgMdcSafe, + String cacheGroupName) { + CacheConfiguration cacheCfg = new CacheConfiguration(cacheName) + .setCacheMode(PARTITIONED) + .setBackups(1); + + if (cacheGroupName != null) + cacheCfg.setGroupName(cacheGroupName); + + cacheCfg.setAffinity( + new RendezvousAffinityFunction() + .setPartitions(32) + .setAffinityBackupFilter(affBackupFilter)); + + if (affCfgMdcSafe) + mdcSafeCaches.add(cacheName); + + allCaches.add(cacheName); + + return cacheCfg; + } + + /** + * Test verifies correctness of metric for cache configuration related to data distribution across DCs + * if caches are organized into groups. + * + * @throws Exception If failed. + */ + @Test + public void testAffinityCfgMdcSafeMetricForCacheGroup() throws Exception { + startClusterAcrossDataCenters(new String[] {DC_ID_0, DC_ID_1}, 2); + + IgniteEx client = startClientGrid(NODES_NUMBER - 1); + + client.getOrCreateCache( + prepareCacheCfg( + CACHE_WITH_MDC_FILTER + "_0", + new MdcAffinityBackupFilter(2, 1), + true, + "mdcSafeCachesGroup")); + + client.getOrCreateCache( + prepareCacheCfg( + CACHE_WITH_MDC_FILTER + "_1", + new MdcAffinityBackupFilter(2, 1), + true, + "mdcSafeCachesGroup")); + + client.getOrCreateCache( + prepareCacheCfg(MDC_UNSAFE_CACHE + "_0", null, false, "mdcUnsafeCachesGroup")); + + client.getOrCreateCache( + prepareCacheCfg(MDC_UNSAFE_CACHE + "_1", null, false, "mdcUnsafeCachesGroup")); + + checkMdcReadyMetric(); + } + + /** + * Test verifies correctness of metric for partition copies distribution across DCs + * if caches are organized into groups. + * + * @throws Exception If failed. + */ + @Test + public void testPartitionDistributionMetricForCacheGroups() throws Exception { + persistenceEnabled = true; + + startClusterAcrossDataCenters(new String[] {DC_ID_0, DC_ID_1}, 2); + + IgniteEx client = startClientGrid(NODES_NUMBER - 1); + + client.cluster().state(ClusterState.ACTIVE); + + client.getOrCreateCache(prepareCacheCfg( + CACHE_WITH_MDC_FILTER + "_0", + new MdcAffinityBackupFilter(2, 1), + true, + "mdcFilterCacheGroup")); + client.getOrCreateCache(prepareCacheCfg( + CACHE_WITH_MDC_FILTER + "_1", + new MdcAffinityBackupFilter(2, 1), + true, + "mdcFilterCacheGroup")); + + awaitPartitionMapExchange(); + + BooleanMetric cache0DistributionSafeMetric = findMetricForCache( + grid(1), + CACHE_WITH_MDC_FILTER + "_0", + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME); + BooleanMetric cache1DistributionSafeMetric = findMetricForCache( + grid(1), + CACHE_WITH_MDC_FILTER + "_1", + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME); + + assertNotNull(cache0DistributionSafeMetric); + assertNotNull(cache1DistributionSafeMetric); + assertTrue(cache0DistributionSafeMetric.value()); + assertTrue(cache1DistributionSafeMetric.value()); + + stopGrid(0); + + assertFalse(cache0DistributionSafeMetric.value()); + assertFalse(cache1DistributionSafeMetric.value()); + + client.cluster().setBaselineTopology(client.cluster().topologyVersion()); + + assertTrue(cache0DistributionSafeMetric.value()); + assertTrue(cache1DistributionSafeMetric.value()); + } + + /** + * Test verifies correctness of metric for cache configuration related to data distribution across DCs for dynamically started caches. + * Metric should take a {@code false} value if cache configuration doesn't guarantee presence of data copy in each DC + * and {@code true} otherwise. + * + * @throws Exception If failed. + */ + @Test + public void testAffinityCfgMdcSafeMetricForDynamicCaches() throws Exception { + startClusterAcrossDataCenters(new String[] {DC_ID_0, DC_ID_1}, 2); + + IgniteEx client = startClientGrid(NODES_NUMBER - 1); + + client.cluster().state(ClusterState.ACTIVE); + + client.getOrCreateCache( + prepareCacheCfg(CACHE_WITH_MDC_FILTER, new MdcAffinityBackupFilter(2, 1), true)); + + client.getOrCreateCache( + prepareCacheCfg(CACHE_WITH_COLOCATED_FILTER, new ClusterNodeAttributeColocatedBackupFilter(STRETCHED_CELL_ATTR_NAME), true)); + + client.getOrCreateCache( + prepareCacheCfg(MDC_UNSAFE_CACHE, null, false)); + + client.getOrCreateCache( + prepareCacheCfg(CACHE_WITH_MDC_UNSAFE_ATTRIBUTE_FILTER, + new ClusterNodeAttributeAffinityBackupFilter(ATTR_FOR_UNSAFE_ATTR_FILTER), false)); + + checkMdcReadyMetric(); + } + + /** + * Test verifies correctness of metric for cache configuration related to data distribution across DCs for statically configured caches. + * Metric should take a {@code false} value if cache configuration doesn't guarantee presence of data copy in each DC + * and {@code true} otherwise. + * + * @throws Exception If failed. + */ + @Test + public void testAffinityCfgMdcSafeMetricForStaticCaches() throws Exception { + useStaticCaches = true; + + startClusterAcrossDataCenters(new String[] {DC_ID_0, DC_ID_1}, 2); + + IgniteEx client = startClientGrid(NODES_NUMBER - 1); + + client.cluster().state(ClusterState.ACTIVE); + + checkMdcReadyMetric(); + } + + /** + * Test verifies correctness of metric for partition copies distribution across DCs. + * Metric should take a {@code false} value if there is at least one partition which doesn't have copies in all DCs + * and {@code true} otherwise. + *

      + * This test considers in-memory caches only. + * + * @throws Exception If failed. + */ + @Test + public void testPartitionDistributionMetricInMemoryCaches() throws Exception { + startClusterAcrossDataCenters(new String[] {DC_ID_0, DC_ID_1}, 2); + + IgniteEx client = startClientGrid(NODES_NUMBER - 1); + + client.getOrCreateCache(prepareCacheCfg(CACHE_WITH_MDC_FILTER, new MdcAffinityBackupFilter(2, 1), true)); + client.getOrCreateCache(prepareCacheCfg(CACHE_WITH_COLOCATED_FILTER, + new ClusterNodeAttributeColocatedBackupFilter(STRETCHED_CELL_ATTR_NAME), true)); + client.getOrCreateCache(prepareCacheCfg(CACHE_WITH_MDC_SAFE_ATTRIBUTE_FILTER, + new ClusterNodeAttributeAffinityBackupFilter(ATTR_DATA_CENTER_ID), true)); + + awaitPartitionMapExchange(); + + BooleanMetric cacheWithMdcFilterDistributionSafeMetric = findMetricForCache( + grid(1), + CACHE_WITH_MDC_FILTER, + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME); + BooleanMetric cacheWithColocatedFilterDistributionSafeMetric = findMetricForCache( + grid(1), + CACHE_WITH_COLOCATED_FILTER, + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME); + BooleanMetric cacheWithMdcSafeAttrFilterDistributionSafeMetric = findMetricForCache( + grid(1), + CACHE_WITH_MDC_SAFE_ATTRIBUTE_FILTER, + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME + ); + + assertNotNull(cacheWithMdcFilterDistributionSafeMetric); + assertNotNull(cacheWithColocatedFilterDistributionSafeMetric); + assertNotNull(cacheWithMdcSafeAttrFilterDistributionSafeMetric); + assertTrue(cacheWithMdcFilterDistributionSafeMetric.value()); + assertTrue(cacheWithColocatedFilterDistributionSafeMetric.value()); + assertTrue(cacheWithMdcSafeAttrFilterDistributionSafeMetric.value()); + + stopGrid(0); + + assertTrue(cacheWithMdcFilterDistributionSafeMetric.value()); + assertTrue(cacheWithMdcSafeAttrFilterDistributionSafeMetric.value()); + assertFalse(cacheWithColocatedFilterDistributionSafeMetric.value()); + } + + /** + * Test verifies correctness of metric for partition copies distribution across DCs. + * Metric should take a {@code false} value if there is at least one partition which doesn't have copies in all DCs + * and {@code true} otherwise. + *

      + * This test considers persistent caches only and takes into account changes of BaselineTopology. + * + * @throws Exception If failed. + */ + @Test + public void testPartitionDistributionMetricPersistentCaches() throws Exception { + persistenceEnabled = true; + + startClusterAcrossDataCenters(new String[] {DC_ID_0, DC_ID_1}, 2); + + IgniteEx client = startClientGrid(NODES_NUMBER - 1); + + client.cluster().state(ClusterState.ACTIVE); + + client.getOrCreateCache(prepareCacheCfg( + CACHE_WITH_MDC_FILTER, new MdcAffinityBackupFilter(2, 1), true)); + client.getOrCreateCache(prepareCacheCfg(CACHE_WITH_COLOCATED_FILTER, + new ClusterNodeAttributeColocatedBackupFilter(STRETCHED_CELL_ATTR_NAME), true)); + client.getOrCreateCache(prepareCacheCfg(CACHE_WITH_MDC_SAFE_ATTRIBUTE_FILTER, + new ClusterNodeAttributeAffinityBackupFilter(ATTR_DATA_CENTER_ID), true)); + + awaitPartitionMapExchange(); + + BooleanMetric cacheWithMdcFilterDistributionSafeMetric = findMetricForCache( + grid(1), + CACHE_WITH_MDC_FILTER, + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME); + BooleanMetric cacheWithColocatedFilterDistributionSafeMetric = findMetricForCache( + grid(1), + CACHE_WITH_COLOCATED_FILTER, + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME); + BooleanMetric cacheWithMdcSafeAttrFilterDistributionSafeMetric = findMetricForCache( + grid(1), + CACHE_WITH_MDC_SAFE_ATTRIBUTE_FILTER, + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME + ); + + assertNotNull(cacheWithMdcFilterDistributionSafeMetric); + assertNotNull(cacheWithColocatedFilterDistributionSafeMetric); + assertNotNull(cacheWithMdcSafeAttrFilterDistributionSafeMetric); + assertTrue(cacheWithMdcFilterDistributionSafeMetric.value()); + assertTrue(cacheWithColocatedFilterDistributionSafeMetric.value()); + assertTrue(cacheWithMdcSafeAttrFilterDistributionSafeMetric.value()); + + stopGrid(0); + + assertFalse(cacheWithMdcFilterDistributionSafeMetric.value()); + assertFalse(cacheWithColocatedFilterDistributionSafeMetric.value()); + assertFalse(cacheWithMdcSafeAttrFilterDistributionSafeMetric.value()); + + client.cluster().setBaselineTopology(client.cluster().topologyVersion()); + + // MdcAffinityBackupFilter and ClusterNodeAttributeAffinityBackupFilter are able to reassign partitions + // after BaselineTopology change, thus distribution safe metric restores to true. + assertTrue(cacheWithMdcFilterDistributionSafeMetric.value()); + assertTrue(cacheWithMdcSafeAttrFilterDistributionSafeMetric.value()); + // But ClusterNodeAttributeColocatedBackupFilter doesn't reassign partitions after BaselineTopology change + // so distribution safe metric for this cache remains false. + assertFalse(cacheWithColocatedFilterDistributionSafeMetric.value()); + } + + /** */ + private BooleanMetric findMetricForCache(IgniteEx grid, String cacheName, String metricName) { + GridCacheContext cacheCtx = grid.cachex(cacheName).context(); + + return cacheCtx.kernalContext().metric().registry(cacheMetricsRegistryName( + cacheCtx.name(), cacheCtx.cache().isNear())).findMetric(metricName); + } + + /** */ + private void checkMdcReadyMetric() throws InterruptedException { + awaitPartitionMapExchange(); + + for (int i = 0; i < NODES_NUMBER; i++) { + IgniteEx ig = grid(i); + + for (String cacheName : allCaches) { + BooleanMetric cacheMdcSafeMetric = findMetricForCache(ig, cacheName, AFFINITY_CFG_MDC_SAFE_METRIC_NAME); + + if (ig.localNode().isClient()) { + assertNull(cacheMdcSafeMetric); + + continue; + } + else + assertNotNull("Grid: " + i + ", cache: " + cacheName, cacheMdcSafeMetric); + + boolean cacheMdcSafe = cacheMdcSafeMetric.value(); + + assertEquals(mdcSafeCaches.contains(cacheName), cacheMdcSafe); + } + } + } + + /** + * Test verifies that IsCacheAffinityConfigurationMdcSafe metric is NOT registered + * when MDC attribute (data center ID) is not configured in the cluster. + * + * @throws Exception If failed. + */ + @Test + public void testAffinityCfgMdcSafeMetricNotRegisteredOnNonMdcCluster() throws Exception { + startGrids(2); + + IgniteEx client = startClientGrid(); + + client.cluster().state(ClusterState.ACTIVE); + + client.getOrCreateCache( + prepareCacheCfg(CACHE_WITH_MDC_FILTER, new MdcAffinityBackupFilter(2, 1), true)); + + client.getOrCreateCache( + prepareCacheCfg(MDC_UNSAFE_CACHE, null, false)); + + awaitPartitionMapExchange(); + + // Verify that IsCacheAffinityConfigurationMdcSafe metric is NOT registered on server nodes + for (int i = 0; i < 2; i++) { + IgniteEx srv = grid(i); + + for (String cacheName : allCaches) { + BooleanMetric cacheMdcSafeMetric = findMetricForCache(srv, cacheName, AFFINITY_CFG_MDC_SAFE_METRIC_NAME); + + assertNull("Metric " + AFFINITY_CFG_MDC_SAFE_METRIC_NAME + + " should not be registered when MDC attribute is not configured [grid=" + i + + ", cache=" + cacheName + ']', cacheMdcSafeMetric); + } + } + + // Verify that the metric is also NOT registered on client nodes + for (String cacheName : allCaches) { + BooleanMetric cacheMdcSafeMetric = findMetricForCache(client, cacheName, AFFINITY_CFG_MDC_SAFE_METRIC_NAME); + + assertNull("Metric " + AFFINITY_CFG_MDC_SAFE_METRIC_NAME + + " should not be registered on client node [cache=" + cacheName + ']', cacheMdcSafeMetric); + } + } + + /** + * Test verifies that IsCachePartitionDistributionSafe metric is NOT registered + * when MDC attribute (data center ID) is not configured in the cluster. + * + * @throws Exception If failed. + */ + @Test + public void testPartitionDistributionMetricNotRegisteredOnNonMdcCluster() throws Exception { + startGrids(2); + + IgniteEx client = startClientGrid(); + + client.cluster().state(ClusterState.ACTIVE); + + client.getOrCreateCache( + prepareCacheCfg(CACHE_WITH_MDC_FILTER, new MdcAffinityBackupFilter(2, 1), true)); + + client.getOrCreateCache( + prepareCacheCfg(MDC_UNSAFE_CACHE, null, false)); + + awaitPartitionMapExchange(); + + // Verify that IsCachePartitionDistributionSafe metric is NOT registered on server nodes + for (int i = 0; i < 2; i++) { + IgniteEx srv = grid(i); + + for (String cacheName : allCaches) { + BooleanMetric partDistMetric = findMetricForCache(srv, cacheName, PARTITION_DISTRIBUTION_SAFE_METRIC_NAME); + + assertNull("Metric " + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME + + " should not be registered when MDC attribute is not configured [grid=" + i + + ", cache=" + cacheName + ']', partDistMetric); + } + } + + // Verify that the metric is also NOT registered on client nodes + for (String cacheName : allCaches) { + BooleanMetric partDistMetric = findMetricForCache(client, cacheName, PARTITION_DISTRIBUTION_SAFE_METRIC_NAME); + + assertNull("Metric " + PARTITION_DISTRIBUTION_SAFE_METRIC_NAME + + " should not be registered on client node [cache=" + cacheName + ']', partDistMetric); + } + } + + /** */ + private IgniteEx startClusterAcrossDataCenters(String[] dcIds, int nodesPerDc) throws Exception { + int nodeIdx = 0; + IgniteEx lastNode = null; + + for (String dcId : dcIds) { + this.dcId = dcId; + + for (int i = 0; i < nodesPerDc; i++) { + cellId = STRETCHED_CELL_IDS[i]; + + lastNode = startGrid(nodeIdx++); + } + } + + return lastNode; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheGetRestartTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheGetRestartTest.java index cd1f17bb34891..20a18bf2d333f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheGetRestartTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheGetRestartTest.java @@ -47,7 +47,7 @@ */ public class IgniteCacheGetRestartTest extends GridCommonAbstractTest { /** */ - private static final long TEST_TIME = 60_000; + private static final long TEST_TIME = GridTestUtils.SF.applyLB(60_000, 10_000); /** */ private static final int SRVS = 3; @@ -56,7 +56,7 @@ public class IgniteCacheGetRestartTest extends GridCommonAbstractTest { private static final int CLIENTS = 1; /** */ - private static final int KEYS = 100_000; + private static final int KEYS = GridTestUtils.SF.applyLB(100_000, 10_000); /** */ private ThreadLocal client = new ThreadLocal<>(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxCacheWithWriteThroughCheckTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxCacheWithWriteThroughCheckTest.java new file mode 100644 index 0000000000000..b58264ff600a1 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxCacheWithWriteThroughCheckTest.java @@ -0,0 +1,316 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache.distributed; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import javax.cache.Cache; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; +import org.apache.ignite.cache.store.CacheStoreAdapter; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.events.DiscoveryEvent; +import org.apache.ignite.internal.GridTopic; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.TestRecordingCommunicationSpi; +import org.apache.ignite.internal.managers.communication.GridMessageListener; +import org.apache.ignite.internal.managers.discovery.DiscoCache; +import org.apache.ignite.internal.managers.eventstorage.DiscoveryEventListener; +import org.apache.ignite.internal.managers.eventstorage.HighPriorityListener; +import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareResponse; +import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx; +import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; +import org.apache.ignite.internal.util.typedef.G; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteBiInClosure; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.apache.ignite.transactions.Transaction; +import org.apache.ignite.transactions.TransactionConcurrency; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; +import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; +import static org.apache.ignite.testframework.GridTestUtils.cartesianProduct; +import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC; +import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; +import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED; + +/** */ +@RunWith(Parameterized.class) +public class IgniteTxCacheWithWriteThroughCheckTest extends GridCommonAbstractTest { + /** Node kill trigger. */ + private static CountDownLatch nodeKillLatch; + + /** Node left on backup. */ + private static CountDownLatch nodeLeftRegisteredOnBackup; + + /** */ + @Parameterized.Parameter(0) + public Boolean withPersistence; + + /** */ + @Parameterized.Parameter(1) + public TransactionConcurrency conc; + + /** */ + @Parameterized.Parameters(name = "withPersistence={0}, concMode={1}") + public static Collection parameters() { + return cartesianProduct( + List.of(true, false), + List.of(OPTIMISTIC, PESSIMISTIC) + ); + } + + /** {@inheritDoc} */ + @Override protected void beforeTest() throws Exception { + super.beforeTest(); + + stopAllGrids(); + + if (withPersistence) + cleanPersistenceDir(); + + nodeKillLatch = new CountDownLatch(1); + nodeLeftRegisteredOnBackup = new CountDownLatch(1); + + MapCacheStore.salvagedLatch = new CountDownLatch(1); + MapCacheStore.txCoordStoreLatch = new CountDownLatch(2); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + try { + for (Ignite node : G.allGrids()) { + Collection txs = ((IgniteEx)node).context().cache().context().tm().activeTransactions(); + + assertTrue("Unfinished txs [node=" + node.name() + ", txs=" + txs + ']', txs.isEmpty()); + } + } + finally { + stopAllGrids(); + + super.afterTest(); + } + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + return super.getConfiguration(igniteInstanceName) + .setDataStorageConfiguration(new DataStorageConfiguration() + .setDefaultDataRegionConfiguration(new DataRegionConfiguration().setPersistenceEnabled(withPersistence))) + .setConsistentId(igniteInstanceName) + .setCommunicationSpi(new TestRecordingCommunicationSpi()); + } + + /** Test scenario: + *

        + *
      • Start 3 nodes [node0, node1, node2].
      • + *
      • Initialize put operation into transactional cache where [node1] holds primary partition for such insertion.
      • + *
      • Kill [node1] right after tx PREPARE stage is completed (it triggers tx recovery procedure).
      • + *
      + * + * @see IgniteTxManager#salvageTx(IgniteInternalTx) + */ + @Test + public void testTxCoordinatorLeftClusterWithEnabledReadWriteThrough() throws Exception { + // Sequential start is important here. + IgniteEx nodeCoord = startGrid(0); + // Near node. + IgniteEx nodePrimary = startGrid(1); + // Backup node. + IgniteEx nodeBackup = startGrid(2); + + int firstVal = 1; + int secondVal = 2; + + nodeCoord.cluster().state(ClusterState.ACTIVE); + + CacheConfiguration ccfgWithWriteThrough = configureCache(DEFAULT_CACHE_NAME); + IgniteCache cache = nodeCoord.createCache(ccfgWithWriteThrough); + + Integer primaryKey = primaryKey(nodePrimary.cache(DEFAULT_CACHE_NAME)); + + try (Transaction tx = nodeCoord.transactions().txStart()) { + cache.put(primaryKey, firstVal); + + tx.commit(); + } + + nodeCoord.cluster().state(ClusterState.INACTIVE); + + GridMessageListener lsnr = new GridMessageListener() { + @Override public void onMessage(UUID nodeId, Object msg, byte plc) { + if (msg instanceof GridNearTxPrepareResponse) { + IgniteTxManager txMgr = nodeBackup.context().cache().context().tm(); + Collection txs = txMgr.activeTransactions(); + + assertEquals(1, txs.size()); + IgniteInternalTx idleTx = txs.iterator().next(); + assertFalse(idleTx.local()); + + Map activeTx = GridTestUtils.getFieldValue(txMgr, "idMap"); + assertEquals(1, activeTx.size()); + + nodeKillLatch.countDown(); + + U.awaitQuiet(nodeLeftRegisteredOnBackup); + + // Let`s wait until all discovery events have been processed on backup node. + doSleep(1000); + + MapCacheStore.txCoordStoreLatch.countDown(); + } + } + }; + + nodeCoord.context().io().removeMessageListener(GridTopic.TOPIC_CACHE); // Remove old cache listener. + nodeCoord.context().io().addMessageListener(GridTopic.TOPIC_CACHE, lsnr); // Register as first listener. + nodeCoord.context().cache().context().io().start0(); // Register cache listener again. + + nodeCoord.cluster().state(ClusterState.ACTIVE); + awaitPartitionMapExchange(true, true, null); + + nodeCoord.context().event().addDiscoveryEventListener(new BeforeRecoveryListener(), EVT_NODE_FAILED, EVT_NODE_LEFT); + nodeBackup.context().event().addDiscoveryEventListener(new BeforeBackupRecoveryListener(), EVT_NODE_FAILED, EVT_NODE_LEFT); + + IgniteInternalFuture stopFut = GridTestUtils.runAsync(() -> { + nodeKillLatch.await(); + nodePrimary.close(); + }); + + try (Transaction tx = nodeCoord.transactions().txStart(conc, READ_COMMITTED)) { + cache.put(primaryKey, secondVal); + + tx.commit(); + } + catch (Throwable th) { + fail("Unexpected exception: " + th); + } + + stopFut.get(getTestTimeout()); + + awaitPartitionMapExchange(); + + assertEquals(secondVal, nodeCoord.cache(DEFAULT_CACHE_NAME).get(primaryKey)); + assertEquals(secondVal, nodeBackup.cache(DEFAULT_CACHE_NAME).get(primaryKey)); + + // Check value after restart. + stopAllGrids(); + startGridsMultiThreaded(3); + + awaitPartitionMapExchange(true, true, null); + + for (Ignite ignite : G.allGrids()) + assertEquals(secondVal, ignite.getOrCreateCache(ccfgWithWriteThrough).get(primaryKey)); + } + + /** */ + private CacheConfiguration configureCache(String cacheName) { + CacheConfiguration ccfg = new CacheConfiguration<>(cacheName); + ccfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); + ccfg.setCacheMode(CacheMode.REPLICATED); + ccfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); + + ccfg.setReadThrough(true); + ccfg.setWriteThrough(true); + ccfg.setCacheStoreFactory(MapCacheStore::new); + + return ccfg; + } + + /** */ + public static class MapCacheStore extends CacheStoreAdapter { + /** Store map. */ + private static final Map map = new ConcurrentHashMap<>(); + + /** */ + static CountDownLatch salvagedLatch; + + /** */ + static CountDownLatch txCoordStoreLatch; + + /** {@inheritDoc} */ + @Override public void loadCache(IgniteBiInClosure clo, Object... args) { + for (Map.Entry e : map.entrySet()) + clo.apply(e.getKey(), e.getValue()); + } + + /** {@inheritDoc} */ + @Override public Object load(Object key) { + Object val = map.get(key); + + salvagedLatch.countDown(); + + return val; + } + + /** {@inheritDoc} */ + @Override public void write(Cache.Entry e) { + map.put(e.getKey(), e.getValue()); + + txCoordStoreLatch.countDown(); + } + + /** {@inheritDoc} */ + @Override public void delete(Object key) { + map.remove(key); + } + } + + /** */ + private static class BeforeRecoveryListener implements DiscoveryEventListener, HighPriorityListener { + /** {@inheritDoc} */ + @Override public void onEvent(DiscoveryEvent evt, DiscoCache discoCache) { + U.awaitQuiet(MapCacheStore.txCoordStoreLatch); + } + + /** {@inheritDoc} */ + @Override public int order() { + return -1; + } + } + + /** */ + private static class BeforeBackupRecoveryListener implements DiscoveryEventListener, HighPriorityListener { + /** {@inheritDoc} */ + @Override public void onEvent(DiscoveryEvent evt, DiscoCache discoCache) { + nodeLeftRegisteredOnBackup.countDown(); + } + + /** {@inheritDoc} */ + @Override public int order() { + return -1; + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxCacheWriteSynchronizationModesMultithreadedTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxCacheWriteSynchronizationModesMultithreadedTest.java index 7d05a9bde65ad..a3c805ea94486 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxCacheWriteSynchronizationModesMultithreadedTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxCacheWriteSynchronizationModesMultithreadedTest.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.cache.distributed; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; @@ -37,7 +38,9 @@ import org.apache.ignite.cache.store.CacheStoreAdapter; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx; import org.apache.ignite.internal.util.lang.GridAbsPredicate; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.G; @@ -93,6 +96,17 @@ public class IgniteTxCacheWriteSynchronizationModesMultithreadedTest extends Gri assertTrue(grid(SRVS + i).configuration().isClientMode()); } + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + for (Ignite node : G.allGrids()) { + Collection txs = ((IgniteEx)node).context().cache().context().tm().activeTransactions(); + + assertTrue("Unfinished txs [node=" + node.name() + ", txs=" + txs + ']', txs.isEmpty()); + } + + super.afterTest(); + } + /** * @throws Exception If failed. */ @@ -291,7 +305,7 @@ private void multithreaded(CacheWriteSynchronizationMode syncMode, * @throws Exception If failed. */ private void commitMultithreaded(final IgniteBiInClosure> c) throws Exception { - final long stopTime = System.currentTimeMillis() + 10_000; + final long stopTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(10_000, 2_000); GridTestUtils.runMultiThreaded(new IgniteInClosure() { @Override public void apply(Integer idx) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheTxRecoveryRollbackTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheTxRecoveryRollbackTest.java index 937b51cd4dee7..35f8053d866f3 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheTxRecoveryRollbackTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheTxRecoveryRollbackTest.java @@ -36,8 +36,8 @@ import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.TestRecordingCommunicationSpi; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishRequest; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareResponse; @@ -86,7 +86,7 @@ public class IgniteCacheTxRecoveryRollbackTest extends GridCommonAbstractTest { @Override protected void afterTest() throws Exception { try { for (Ignite node : G.allGrids()) { - Collection txs = ((IgniteKernal)node).context().cache().context().tm().activeTransactions(); + Collection txs = ((IgniteEx)node).context().cache().context().tm().activeTransactions(); assertTrue("Unfinished txs [node=" + node.name() + ", txs=" + txs + ']', txs.isEmpty()); } @@ -379,7 +379,7 @@ private void txWithStore(final TransactionConcurrency concurrency, boolean write final IgniteCache clientCache = client.cache(DEFAULT_CACHE_NAME); IgniteInternalFuture fut = GridTestUtils.runAsync(new Callable() { - @Override public Void call() throws Exception { + @Override public Void call() { log.info("Start put"); clientCache.put(key, 2); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheStoreSessionWriteBehindAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheStoreSessionWriteBehindAbstractTest.java index 0a86ed99bb920..c9641544bb319 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheStoreSessionWriteBehindAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheStoreSessionWriteBehindAbstractTest.java @@ -75,8 +75,8 @@ public abstract class IgniteCacheStoreSessionWriteBehindAbstractTest extends Ign * @return Cache configuration. * @throws Exception In case of error. */ - @Override @SuppressWarnings("unchecked") - protected CacheConfiguration cacheConfiguration(String igniteInstanceName) throws Exception { + @SuppressWarnings("unchecked") + @Override protected CacheConfiguration cacheConfiguration(String igniteInstanceName) throws Exception { CacheConfiguration ccfg0 = super.cacheConfiguration(igniteInstanceName); ccfg0.setReadThrough(true); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsTransactionsHangTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsTransactionsHangTest.java index 5aa594fa5c6b6..bf95ec1bd17c2 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsTransactionsHangTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsTransactionsHangTest.java @@ -40,6 +40,7 @@ import org.apache.ignite.configuration.TransactionConfiguration; import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.transactions.Transaction; import org.apache.ignite.transactions.TransactionIsolation; @@ -68,7 +69,7 @@ public class IgnitePdsTransactionsHangTest extends GridCommonAbstractTest { public static final int WARM_UP_PERIOD = 20; /** Duration. */ - public static final int DURATION = 180; + public static final int DURATION = GridTestUtils.SF.applyLB(180, 40); /** Maximum count of inserted keys. */ public static final int MAX_KEY_COUNT = 500_000; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/wal/IgniteWalRebalanceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/wal/IgniteWalRebalanceTest.java index f609473da33c4..61144f4159813 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/wal/IgniteWalRebalanceTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/wal/IgniteWalRebalanceTest.java @@ -496,12 +496,11 @@ public void testRebalanceCancelOnSupplyError() throws Exception { forceCheckpoint(); - stopAllGrids(); + stopGrid(1); + stopGrid(2); // Rewrite data to trigger further rebalance. - IgniteEx supplierNode = startGrid(0); - - supplierNode.cluster().state(ACTIVE); + IgniteEx supplierNode = grid(0); IgniteCache cache = supplierNode.cache(CACHE_NAME); @@ -532,12 +531,15 @@ public void testRebalanceCancelOnSupplyError() throws Exception { getTestTimeout() ); + // Hold the demand until the WAL read is armed to fail, so the error fires mid-rebalance. + TestRecordingCommunicationSpi spi = (TestRecordingCommunicationSpi)demanderNode.configuration().getCommunicationSpi(); + + spi.waitForBlocked(); + // Inject I/O factory which can throw exception during WAL read on supplier node. FailingIOFactory ioFactory = injectFailingIOFactory(supplierNode); // Resume rebalance process. - TestRecordingCommunicationSpi spi = (TestRecordingCommunicationSpi)demanderNode.configuration().getCommunicationSpi(); - spi.stopBlock(); // Wait till rebalance will be failed and cancelled. diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotSelfTest.java index ee23e278a7dc1..570761dac227f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotSelfTest.java @@ -849,81 +849,99 @@ public void testClusterSnapshotWithExplicitPathError() throws Exception { /** @throws Exception If fails. */ @Test public void testClusterSnapshotMetrics() throws Exception { - String newSnapshotName = SNAPSHOT_NAME + "_new"; CountDownLatch deltaApply = new CountDownLatch(1); CountDownLatch deltaBlock = new CountDownLatch(1); IgniteEx ignite = startGridsWithCache(2, dfltCacheCfg, CACHE_KEYS_RANGE); - MetricRegistry mreg0 = ignite.context().metric().registry(SNAPSHOT_METRICS); - - LongMetric startTime = mreg0.findMetric("LastSnapshotStartTime"); - LongMetric endTime = mreg0.findMetric("LastSnapshotEndTime"); - ObjectGauge snpName = mreg0.findMetric("LastSnapshotName"); - ObjectGauge errMsg = mreg0.findMetric("LastSnapshotErrorMessage"); - ObjectGauge> snpList = mreg0.findMetric("LocalSnapshotNames"); + startClientGrid(); // Snapshot process will be blocked when delta partition files processing starts. snp(ignite).localSnapshotSenderFactory( blockingLocalSnapshotSender(ignite, deltaApply, deltaBlock)); - assertEquals("Snapshot start time must be undefined prior to snapshot operation started.", - 0, startTime.value()); - assertEquals("Snapshot end time must be undefined to snapshot operation started.", - 0, endTime.value()); - assertTrue("Snapshot name must not exist prior to snapshot operation started.", snpName.value().isEmpty()); - assertTrue("Snapshot error message must null prior to snapshot operation started.", errMsg.value().isEmpty()); - assertTrue("Snapshots on local node must not exist", snpList.value().isEmpty()); + for (Ignite g : G.allGrids()) { + MetricRegistry mreg = ((IgniteEx)g).context().metric().registry(SNAPSHOT_METRICS); + + LongMetric startTime = mreg.findMetric("LastSnapshotStartTime"); + LongMetric endTime = mreg.findMetric("LastSnapshotEndTime"); + ObjectGauge snpName = mreg.findMetric("LastSnapshotName"); + ObjectGauge errMsg = mreg.findMetric("LastSnapshotErrorMessage"); + ObjectGauge> snpList = mreg.findMetric("LocalSnapshotNames"); + + if (g.cluster().localNode().isClient()) { + assertNull("Snapshot start time must not be created on a client node.", startTime); + assertNull("Snapshot end time must not be created on a client node.", endTime); + assertNull("Snapshot name must not be created on a client node.", snpName); + assertNull("Snapshot error message must not be created on a client node.", errMsg); + assertNull("Snapshot local names must not be created on a client node.", snpList); + + continue; + } + + assertEquals("Snapshot start time must be undefined prior to snapshot operation started.", + 0, startTime.value()); + assertEquals("Snapshot end time must be undefined to snapshot operation started.", + 0, endTime.value()); + assertTrue("Snapshot name must not exist prior to snapshot operation started.", snpName.value().isEmpty()); + assertTrue("Snapshot error message must null prior to snapshot operation started.", errMsg.value().isEmpty()); + assertTrue("Snapshots on local node must not exist", snpList.value().isEmpty()); + } long cutoffStartTime = U.currentTimeMillis(); - IgniteFuture fut0 = snp(ignite).createSnapshot(SNAPSHOT_NAME, null, false, onlyPrimary); + IgniteFuture fut = snp(ignite).createSnapshot(SNAPSHOT_NAME, null, false, onlyPrimary); + + for (Ignite g : G.allGrids()) { + MetricRegistry mreg = ((IgniteEx)g).context().metric().registry(SNAPSHOT_METRICS); - U.await(deltaApply); + LongMetric startTime = mreg.findMetric("LastSnapshotStartTime"); + LongMetric endTime = mreg.findMetric("LastSnapshotEndTime"); + ObjectGauge snpName = mreg.findMetric("LastSnapshotName"); + ObjectGauge errMsg = mreg.findMetric("LastSnapshotErrorMessage"); - assertTrue("Snapshot start time must be set prior to snapshot operation started " + - "[startTime=" + startTime.value() + ", cutoffTime=" + cutoffStartTime + ']', - startTime.value() >= cutoffStartTime); - assertEquals("Snapshot end time must be zero prior to snapshot operation started.", - 0, endTime.value()); - assertEquals("Snapshot name must be set prior to snapshot operation started.", - SNAPSHOT_NAME, snpName.value()); - assertTrue("Snapshot error message must null prior to snapshot operation started.", - errMsg.value().isEmpty()); + if (g.cluster().localNode().isClient()) { + assertNull("Snapshot start time must not be created on a client node.", startTime); + assertNull("Snapshot end time must not be created on a client node.", endTime); + assertNull("Snapshot name must not be created on a client node.", snpName); + assertNull("Snapshot error message must not be created on a client node.", errMsg); - IgniteFuture fut1 = snp(grid(1)).createSnapshot(newSnapshotName, null, false, onlyPrimary); + continue; + } - assertThrowsWithCause((Callable)fut1::get, IgniteException.class); + assertTrue("Snapshot start time must be set prior to snapshot operation started " + + "[startTime=" + startTime.value() + ", cutoffTime=" + cutoffStartTime + ']', + waitForCondition(() -> startTime.value() >= cutoffStartTime, getTestTimeout(), 30)); - MetricRegistry mreg1 = grid(1).context().metric().registry(SNAPSHOT_METRICS); + assertTrue("Snapshot end time must be zero prior to snapshot operation started.", + waitForCondition(() -> 0 == endTime.value(), 30)); - LongMetric startTime1 = mreg1.findMetric("LastSnapshotStartTime"); - LongMetric endTime1 = mreg1.findMetric("LastSnapshotEndTime"); - ObjectGauge snpName1 = mreg1.findMetric("LastSnapshotName"); - ObjectGauge errMsg1 = mreg1.findMetric("LastSnapshotErrorMessage"); + assertEquals("Snapshot name must be set prior to snapshot operation started.", + SNAPSHOT_NAME, snpName.value()); - assertTrue("Snapshot start time must be greater than zero for finished snapshot.", - startTime1.value() > 0); - assertEquals("Snapshot end time must zero for failed on start snapshots.", - 0, endTime1.value()); - assertEquals("Snapshot name must be set when snapshot operation already finished.", - newSnapshotName, snpName1.value()); - assertNotNull("Concurrent snapshot operation must failed.", - errMsg1.value()); + assertTrue("Snapshot error message must null prior to snapshot operation started.", + errMsg.value().isEmpty()); + } deltaBlock.countDown(); - fut0.get(); - - assertTrue("Snapshot start time must be greater than zero for finished snapshot.", - startTime.value() > 0); - assertTrue("Snapshot end time must be greater than zero for finished snapshot.", - endTime.value() > 0); - assertEquals("Snapshot name must be set when snapshot operation already finished.", - SNAPSHOT_NAME, snpName.value()); - assertTrue("Concurrent snapshot operation must finished successfully.", - errMsg.value().isEmpty()); - assertEquals("Only the first snapshot must be created and stored on disk.", - Collections.singletonList(SNAPSHOT_NAME), snpList.value()); + fut.get(); + + for (Ignite g : G.allGrids()) { + MetricRegistry mreg = ((IgniteEx)g).context().metric().registry(SNAPSHOT_METRICS); + + LongMetric startTime = mreg.findMetric("LastSnapshotStartTime"); + LongMetric endTime = mreg.findMetric("LastSnapshotEndTime"); + + if (g.cluster().localNode().isClient()) { + assertNull("Snapshot start time must not be created on a client node.", startTime); + assertNull("Snapshot end time must not be created on a client node.", endTime); + + continue; + } + + assertTrue(waitForCondition(() -> endTime.value() != 0L && startTime.value() != 0 && endTime.value() > startTime.value(), + getTestTimeout())); + } } /** @throws Exception If fails. */ diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/dump/IgniteCacheDumpSeveralDiskTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/dump/IgniteCacheDumpSeveralDiskTest.java new file mode 100644 index 0000000000000..9eb4055b8e008 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/dump/IgniteCacheDumpSeveralDiskTest.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.internal.processors.cache.persistence.snapshot.dump; + +import java.io.File; +import java.util.Collection; +import java.util.stream.IntStream; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.jetbrains.annotations.NotNull; +import org.junit.Test; + +/** */ +public class IgniteCacheDumpSeveralDiskTest extends GridCommonAbstractTest { + /** */ + public static final String NVME_1 = "nvme1"; + + /** */ + public static final String NVME_2 = "nvme2"; + + /** */ + public static final String NVME_4 = "nvme4"; + + /** */ + public static final String NVME_5 = "nvme5"; + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + cleanPersistenceDir(); + + U.delete(new File(U.defaultWorkDirectory())); + + assertTrue(U.mkdirs(new File(path(NVME_5)))); + + IgniteEx srv = startGrid(0); + + srv.cluster().state(ClusterState.ACTIVE); + + IgniteCache c = srv.createCache(new CacheConfiguration<>("cache") + .setStoragePaths(path(NVME_1), path(NVME_2), path(NVME_4)) + .setAffinity(new RendezvousAffinityFunction().setPartitions(3))); + + IntStream.range(0, 10).forEach(i -> c.put(i, i)); + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + DataStorageConfiguration dsCfg = new DataStorageConfiguration(); + + dsCfg + .setStoragePath(path(NVME_1)) + .setExtraStoragePaths(path(NVME_2), path(NVME_4)) + .setDefaultDataRegionConfiguration(new DataRegionConfiguration().setPersistenceEnabled(true)); + + return cfg.setDataStorageConfiguration(dsCfg).setSnapshotPath("/dev/null"); + } + + /** */ + @Test + public void testSeveralDisksDump() throws Exception { + createSnapshot(true); + } + + /** */ + @Test + public void testSeveralDisksSnapshot() throws Exception { + createSnapshot(false); + } + + /** */ + private void createSnapshot(boolean dump) throws Exception { + String name = dump ? "dump" : "snapshot"; + String snpPath = path("nvme5/snapshot"); + Collection cacheGrpNames = null; + boolean incremental = false; + boolean onlyPrimary = true; + boolean compress = false; + boolean encrypt = false; + + grid(0).context().cache().context().snapshotMgr().createSnapshot( + name, + snpPath, + cacheGrpNames, + incremental, + onlyPrimary, + dump, + compress, + encrypt, + false, + false + ).get(); + } + + /** */ + private static @NotNull String path(String path) throws IgniteCheckedException { + return U.defaultWorkDirectory() + "/" + path; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotJoiningClientTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotJoiningClientTest.java index fd42dc16fbf41..d40a168677626 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotJoiningClientTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotJoiningClientTest.java @@ -29,6 +29,7 @@ import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.TestRecordingCommunicationSpi; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.pagemem.wal.WALIterator; import org.apache.ignite.internal.pagemem.wal.record.IncrementalSnapshotFinishRecord; import org.apache.ignite.internal.pagemem.wal.record.WALRecord; @@ -183,7 +184,7 @@ private boolean transactionExcluded(int nodeIdx, IgniteUuid txId) throws Excepti if (rec.type() == WALRecord.RecordType.INCREMENTAL_SNAPSHOT_FINISH_RECORD) { IncrementalSnapshotFinishRecord finRec = (IncrementalSnapshotFinishRecord)rec; - assertTrue(finRec.excluded().stream().anyMatch(id -> id.asIgniteUuid().equals(txId))); + assertTrue(finRec.excluded().stream().anyMatch(id -> BinaryUtils.asIgniteUuid(id).equals(txId))); return true; } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotRestoreTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotRestoreTest.java index 5cad5b48d5cd3..d6553f9fa3d39 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotRestoreTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotRestoreTest.java @@ -53,6 +53,7 @@ import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.TestRecordingCommunicationSpi; import org.apache.ignite.internal.binary.BinaryContext; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.management.consistency.ConsistencyRepairCommandArg; import org.apache.ignite.internal.management.consistency.ConsistencyRepairTask; import org.apache.ignite.internal.management.consistency.ConsistencyTaskResult; @@ -675,7 +676,7 @@ public void testNoGapsInCountersAfterRestore() throws Exception { for (int n = 1; n < nodes(); n++) { TestRecordingCommunicationSpi.spi(grid(n)).blockMessages((node, msg) -> msg instanceof GridNearTxPrepareResponse - && ((GridNearTxPrepareResponse)msg).version().asIgniteUuid().equals(exclTxId.get())); + && BinaryUtils.asIgniteUuid(((GridNearTxPrepareResponse)msg).version()).equals(exclTxId.get())); } msgBlkSet.countDown(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotWarnAtomicCachesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotWarnAtomicCachesTest.java index 1806cee36a7c2..68911b39dbcb0 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotWarnAtomicCachesTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotWarnAtomicCachesTest.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -112,8 +113,8 @@ private CacheConfiguration[] prepareCacheConfs(String grp0, St /** */ public void checkCachesSnapshotCreationAndRestore(CacheConfiguration... ccfgs) throws Exception { - List allWarnCaches = new ArrayList<>(); - Map> warnCachesByGrps = new HashMap<>(); + List allWarnCaches = new ArrayList<>(); + Map> warnCachesByGrps = new HashMap<>(); for (CacheConfiguration ccfg: ccfgs) { if (ccfg.getAtomicityMode() == CacheAtomicityMode.ATOMIC && ccfg.getBackups() > 0) { @@ -122,37 +123,25 @@ public void checkCachesSnapshotCreationAndRestore(CacheConfiguration { caches = caches == null ? new ArrayList<>() : caches; - int cacheNum = Integer.parseInt(ccfg.getName().replace("cache", "")); + caches.add(ccfg.getName()); - caches.add(cacheNum); - - allWarnCaches.add(cacheNum); + allWarnCaches.add(ccfg.getName()); return caches; }); } } - checkWarnMessageOnCreateSnapshot(cachesPattern(allWarnCaches), ccfgs); - checkWarnMessageOnRestoreSnapshot(cachesPattern(allWarnCaches), null); + checkWarnMessageOnCreateSnapshot(allWarnCaches, ccfgs); + checkWarnMessageOnRestoreSnapshot(allWarnCaches, null); for (String grp: warnCachesByGrps.keySet()) - checkWarnMessageOnRestoreSnapshot(cachesPattern(warnCachesByGrps.get(grp)), F.asList(grp)); - } - - /** Transforms cache numbers to cache pattern. For example, [0, 1] -> cache[0,1], cache[0,1]. */ - private @Nullable String cachesPattern(List cacheNums) { - if (cacheNums.isEmpty()) - return null; - - return cacheNums.stream() - .map(c -> "cache" + cacheNums) - .collect(Collectors.joining(", ")); + checkWarnMessageOnRestoreSnapshot(warnCachesByGrps.get(grp), F.asList(grp)); } /** */ private void checkWarnMessageOnCreateSnapshot( - @Nullable String warnAtomicCaches, + Collection warnAtomicCaches, CacheConfiguration... ccfgs ) throws Exception { this.ccfgs = ccfgs; @@ -172,25 +161,25 @@ private void checkWarnMessageOnCreateSnapshot( g.snapshot().createSnapshot(SNP).get(getTestTimeout()); - assertTrue(warnAtomicCaches, lsnr.check()); + assertTrue(lsnr.check()); for (CacheConfiguration c: ccfgs) { for (int i = 1_000; i < 2_000; i++) g.cache(c.getName()).put(i, i); } - lsnr = warnLogListener(warnAtomicCaches, warnAtomicCaches == null ? 0 : 1); + lsnr = warnLogListener(warnAtomicCaches, warnAtomicCaches.isEmpty() ? 0 : 3); lsnLogger.registerListener(lsnr); g.snapshot().createIncrementalSnapshot(SNP).get(getTestTimeout()); - assertTrue(warnAtomicCaches, lsnr.check()); + assertTrue(lsnr.check(getTestTimeout())); } /** */ private void checkWarnMessageOnRestoreSnapshot( - @Nullable String warnAtomicCaches, + Collection warnAtomicCaches, @Nullable Collection restoreCacheGrps ) throws Exception { stopAllGrids(); @@ -211,26 +200,36 @@ private void checkWarnMessageOnRestoreSnapshot( g.snapshot().restoreSnapshot(SNP, restoreCacheGrps).get(getTestTimeout()); - assertTrue(warnAtomicCaches + " " + restoreCacheGrps, lsnr.check()); + assertTrue(lsnr.check()); g.destroyCaches(g.cacheNames()); awaitPartitionMapExchange(); - lsnr = warnLogListener(warnAtomicCaches, warnAtomicCaches == null ? 0 : 1); + lsnr = warnLogListener(warnAtomicCaches, warnAtomicCaches.isEmpty() ? 0 : 1); lsnLogger.registerListener(lsnr); g.snapshot().restoreSnapshot(SNP, restoreCacheGrps, 1).get(getTestTimeout()); - assertTrue(warnAtomicCaches + " " + restoreCacheGrps, lsnr.check()); + assertTrue(lsnr.check()); } /** */ - private LogListener warnLogListener(@Nullable String atomicCaches, int times) { + private LogListener warnLogListener(Collection atomicCaches, int times) { + String cachesStr = null; + + if (atomicCaches.size() == 1) + cachesStr = F.first(atomicCaches); + else if (atomicCaches.size() > 1) { + cachesStr = "((" + String.join(", ", atomicCaches) + ')'; + + cachesStr += "|(" + atomicCaches.stream().sorted(Comparator.reverseOrder()).collect(Collectors.joining(", ")) + "))"; + } + Pattern p = Pattern.compile( "Incremental snapshot \\[snpName=" + SNP + ", incIdx=1] contains ATOMIC caches with backups:" - + (atomicCaches == null ? "" : " \\[" + atomicCaches) + ']'); + + (cachesStr == null ? "" : " \\[" + cachesStr) + "]"); return LogListener.matches(p).times(times).build(); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIOFreeSizeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIOFreeSizeTest.java index 9f4d82e6d1793..dadd1bdb9592e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIOFreeSizeTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIOFreeSizeTest.java @@ -65,8 +65,10 @@ public static Collection parameters() { /** */ private final PageMetrics mock = new PageMetrics() { + /** */ final LongAdderMetric totalPages = new LongAdderMetric("a", null); + /** */ final LongAdderMetric idxPages = new LongAdderMetric("b", null); @Override public LongAdderMetric totalPages() { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/SegmentedRingByteBufferTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/SegmentedRingByteBufferTest.java index 22de6e1076a1b..3f0e96c7a6520 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/SegmentedRingByteBufferTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/SegmentedRingByteBufferTest.java @@ -384,7 +384,7 @@ private void doTestNoOverflowMultiThreaded( } }, producerCnt, "producer-thread"); - long endTime = System.currentTimeMillis() + 60 * 1000L; + long endTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(60 * 1000, 10_000); while (System.currentTimeMillis() < endTime && ex.get() == null) { while (restartBarrier.getNumberWaiting() != producerCnt && ex.get() == null) @@ -487,7 +487,7 @@ private void doTestMultiThreaded(SegmentedRingByteBuffer.BufferMode mode) throws Random rnd = new Random(); - long endTime = System.currentTimeMillis() + 60 * 1000L; + long endTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(60 * 1000, 10_000); while (System.currentTimeMillis() < endTime && ex.get() == null) { try { @@ -591,7 +591,7 @@ private void doTestMultiThreaded2(SegmentedRingByteBuffer.BufferMode mode) throw Random rnd = new Random(); - long endTime = System.currentTimeMillis() + 60 * 1000L; + long endTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(60 * 1000, 10_000); while (System.currentTimeMillis() < endTime && ex.get() == null) { try { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQueryTxSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQueryTxSelfTest.java index 8b158292d524f..2c345f773e103 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQueryTxSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/IndexingSpiQueryTxSelfTest.java @@ -22,13 +22,13 @@ import java.util.concurrent.Callable; import javax.cache.Cache; import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteTransactions; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.processors.cache.GridCacheAbstractSelfTest; -import org.apache.ignite.internal.transactions.IgniteTxHeuristicCheckedException; import org.apache.ignite.spi.IgniteSpiAdapter; import org.apache.ignite.spi.IgniteSpiException; import org.apache.ignite.spi.indexing.IndexingQueryFilter; @@ -36,11 +36,14 @@ import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.transactions.Transaction; import org.apache.ignite.transactions.TransactionConcurrency; +import org.apache.ignite.transactions.TransactionHeuristicException; import org.apache.ignite.transactions.TransactionIsolation; import org.apache.ignite.transactions.TransactionState; import org.jetbrains.annotations.Nullable; import org.junit.Test; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; + /** * Indexing Spi transactional query test */ @@ -75,7 +78,7 @@ public void testIndexingSpiWithTxClient() throws Exception { assertNotNull(client.cache(DEFAULT_CACHE_NAME)); - doTestIndexingSpiWithTx(client, 0); + doTestIndexingSpiWithTx(client, 0, false); } /** */ @@ -83,7 +86,7 @@ public void testIndexingSpiWithTxClient() throws Exception { public void testIndexingSpiWithTxLocal() throws Exception { IgniteEx ignite = (IgniteEx)primaryNode(0, DEFAULT_CACHE_NAME); - doTestIndexingSpiWithTx(ignite, 0); + doTestIndexingSpiWithTx(ignite, 0, true); } /** */ @@ -91,13 +94,13 @@ public void testIndexingSpiWithTxLocal() throws Exception { public void testIndexingSpiWithTxNotLocal() throws Exception { IgniteEx ignite = (IgniteEx)primaryNode(0, DEFAULT_CACHE_NAME); - doTestIndexingSpiWithTx(ignite, 1); + doTestIndexingSpiWithTx(ignite, 1, false); } /** * @throws Exception If failed. */ - private void doTestIndexingSpiWithTx(IgniteEx ignite, int key) throws Exception { + private void doTestIndexingSpiWithTx(IgniteEx ignite, int key, boolean heuristic) throws Exception { final IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); final IgniteTransactions txs = ignite.transactions(); @@ -107,7 +110,7 @@ private void doTestIndexingSpiWithTx(IgniteEx ignite, int key) throws Exception System.out.println("Run in transaction: " + concurrency + " " + isolation); GridTestUtils.assertThrowsWithCause(new Callable() { - @Override public Void call() throws Exception { + @Override public Void call() { Transaction tx; try (Transaction tx0 = tx = txs.txStart(concurrency, isolation)) { @@ -120,9 +123,20 @@ private void doTestIndexingSpiWithTx(IgniteEx ignite, int key) throws Exception return null; } - }, IgniteTxHeuristicCheckedException.class); - - checkFutures(); + }, heuristic ? TransactionHeuristicException.class : IgniteException.class); + + // Cause asynced salvage in action + assertTrue( + waitForCondition(() -> { + try { + checkFutures(); + return true; + } + catch (AssertionError err) { + return false; + } + }, 5_000) + ); } } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/ContinuousQueryMarshallerTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/ContinuousQueryMarshallerTest.java index dab32bb151485..9fb42a5fc8efd 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/ContinuousQueryMarshallerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/ContinuousQueryMarshallerTest.java @@ -83,6 +83,8 @@ private void check(String node1Name, String node2Name) throws Exception { final Ignite node2 = "client".equals(node2Name) ? startClientGrid(node2Name) : startGrid(node2Name); + awaitPartitionMapExchange(); + final ContinuousQuery qry = new ContinuousQuery<>(); ScanQuery scanQry = new ScanQuery<>(new IgniteBiPredicate() { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxDeadlockDetectionNoHangsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxDeadlockDetectionNoHangsTest.java index 2328a2db41328..b07e5ac23ed71 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxDeadlockDetectionNoHangsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxDeadlockDetectionNoHangsTest.java @@ -182,7 +182,7 @@ private void doTest(final TransactionConcurrency concurrency) throws IgniteCheck } }, 1, "restart-thread"); - long stopTime = System.currentTimeMillis() + 2 * 60_000L; + long stopTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(2 * 60_000, 20_000); for (int i = 0; System.currentTimeMillis() < stopTime; i++) { boolean detectionEnabled = grid(0).context().cache().context().tm().deadlockDetectionEnabled(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxDeadlockDetectionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxDeadlockDetectionTest.java index 7781d24dfacc6..708f87ee24ea1 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxDeadlockDetectionTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxDeadlockDetectionTest.java @@ -131,7 +131,7 @@ public void testNoHangs() throws Exception { } }, 1, "restart-thread"); - long stopTime = System.currentTimeMillis() + 2 * 60_000L; + long stopTime = System.currentTimeMillis() + GridTestUtils.SF.applyLB(2 * 60_000, 20_000); for (int i = 0; System.currentTimeMillis() < stopTime; i++) { log.info(">>> Iteration " + i); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateAbstractTest.java index 65ef7afee2c40..232cef9e2a346 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateAbstractTest.java @@ -45,6 +45,7 @@ import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.IgnitionEx; import org.apache.ignite.internal.TestRecordingCommunicationSpi; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.processors.cache.PartitionUpdateCounter; import org.apache.ignite.internal.processors.cache.distributed.GridCacheTxRecoveryRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxFinishRequest; @@ -313,7 +314,7 @@ protected Map>> runOnPartition( futMap.put(req.futureId(), req.version()); - return cb.beforePrimaryPrepare(to, req.version().asIgniteUuid(), createSendFuture(clientWrappedSpi, msg)); + return cb.beforePrimaryPrepare(to, BinaryUtils.asIgniteUuid(req.version()), createSendFuture(clientWrappedSpi, msg)); } else if (msg instanceof GridNearTxFinishRequest) { IgniteEx to = IgnitionEx.gridxx(node.id()); @@ -440,7 +441,8 @@ else if (msg instanceof GridDhtTxFinishRequest) { IgniteInternalTx primTx = findTx(from, nearVer, true); IgniteInternalTx backupTx = findTx(to, nearVer, false); - return cb.beforeBackupFinish(from, to, primTx, backupTx, nearVer.asIgniteUuid(), createSendFuture(wrappedPrimSpi, msg)); + return cb.beforeBackupFinish(from, to, primTx, backupTx, BinaryUtils.asIgniteUuid(nearVer), + createSendFuture(wrappedPrimSpi, msg)); } else if (msg instanceof GridNearTxPrepareResponse) { GridNearTxPrepareResponse resp = (GridNearTxPrepareResponse)msg; @@ -451,7 +453,7 @@ else if (msg instanceof GridNearTxPrepareResponse) { IgniteInternalTx primTx = findTx(from, ver, true); - return cb.afterPrimaryPrepare(from, primTx, ver.asIgniteUuid(), createSendFuture(wrappedPrimSpi, msg)); + return cb.afterPrimaryPrepare(from, primTx, BinaryUtils.asIgniteUuid(ver), createSendFuture(wrappedPrimSpi, msg)); } else if (msg instanceof GridNearTxFinishResponse) { IgniteEx to = IgnitionEx.gridxx(node.id()); @@ -460,7 +462,7 @@ else if (msg instanceof GridNearTxFinishResponse) { IgniteEx from = fromNode(wrappedPrimSpi); - IgniteUuid nearVer = futMap.get(req.futureId()).asIgniteUuid(); + IgniteUuid nearVer = BinaryUtils.asIgniteUuid(futMap.get(req.futureId())); return cb.afterPrimaryFinish(from, nearVer, createSendFuture(wrappedPrimSpi, msg)); } @@ -490,7 +492,7 @@ private IgniteBiPredicate createBackupMessagePredicate(Tes IgniteInternalTx backupTx = findTx(from, ver, false); - return cb.afterBackupPrepare(to, from, backupTx, ver.asIgniteUuid(), createSendFuture(wrappedBackupSpi, msg)); + return cb.afterBackupPrepare(to, from, backupTx, BinaryUtils.asIgniteUuid(ver), createSendFuture(wrappedBackupSpi, msg)); } else if (msg instanceof GridDhtTxFinishResponse) { IgniteEx from = fromNode(wrappedBackupSpi); @@ -504,7 +506,7 @@ else if (msg instanceof GridDhtTxFinishResponse) { return false; // Message from parallel partition. // Version is null if message is a response to checkCommittedRequest. - return cb.afterBackupFinish(to, from, ver.asIgniteUuid(), createSendFuture(wrappedBackupSpi, msg)); + return cb.afterBackupFinish(to, from, BinaryUtils.asIgniteUuid(ver), createSendFuture(wrappedBackupSpi, msg)); } return false; @@ -973,7 +975,7 @@ private long countForNode(IgniteEx node, TxState state) { return false; runAsync(() -> { - futures.put(new T3<>(primary, TxState.COMMIT, tx.nearXidVersion().asIgniteUuid()), proceedFut); + futures.put(new T3<>(primary, TxState.COMMIT, BinaryUtils.asIgniteUuid(tx.nearXidVersion())), proceedFut); if (countForNode(primary, TxState.COMMIT) == txCnt) futures.remove(new T3<>(primary, TxState.COMMIT, version(commits.get(primary).poll()))).onDone(); @@ -993,11 +995,11 @@ private long countForNode(IgniteEx node, TxState state) { runAsync(() -> { if (assigns.get(primary) != null) { - int v0 = assignCntr.compute(new T2<>(primary, primaryTx.nearXidVersion().asIgniteUuid()), + int v0 = assignCntr.compute(new T2<>(primary, BinaryUtils.asIgniteUuid(primaryTx.nearXidVersion())), (key, val) -> (val == null ? 0 : val) + 1); if (v0 == 2) { - onCounterAssigned(primary, primaryTx, order(primaryTx.nearXidVersion().asIgniteUuid())); + onCounterAssigned(primary, primaryTx, order(BinaryUtils.asIgniteUuid(primaryTx.nearXidVersion()))); if (!assigns.get(primary).isEmpty()) futures.remove(new T3<>(primary, TxState.ASSIGN, @@ -1006,7 +1008,7 @@ private long countForNode(IgniteEx node, TxState state) { } if (prepares.get(backup) != null) { - futures.put(new T3<>(backup, TxState.PREPARE, primaryTx.nearXidVersion().asIgniteUuid()), proceedFut); + futures.put(new T3<>(backup, TxState.PREPARE, BinaryUtils.asIgniteUuid(primaryTx.nearXidVersion())), proceedFut); // Wait until all prep requests queued and force prepare order. if (countForNode(backup, TxState.PREPARE) == txCnt) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateConsistencyTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateConsistencyTest.java index 28b53c3cb36d1..c0bc58ee0b266 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateConsistencyTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateConsistencyTest.java @@ -274,7 +274,7 @@ public void testPartitionConsistencyWithPrimaryRestart() throws Exception { List primaryKeys = primaryKeys(prim.cache(DEFAULT_CACHE_NAME), 10_000); - long stop = U.currentTimeMillis() + 30_000; + long stop = U.currentTimeMillis() + GridTestUtils.SF.applyLB(30_000, 10_000); Random r = new Random(); @@ -326,7 +326,7 @@ public void testPartitionConsistencyWithBackupsRestart() throws Exception { assertFalse(backups.contains(prim)); - long stop = U.currentTimeMillis() + 30_000; + long stop = U.currentTimeMillis() + GridTestUtils.SF.applyLB(30_000, 10_000); long seed = System.nanoTime(); @@ -390,7 +390,7 @@ public void testPartitionConsistencyWithBackupRestart_ChangeBLT() throws Excepti assertFalse(backups.contains(prim)); - long stop = U.currentTimeMillis() + 30_000; + long stop = U.currentTimeMillis() + GridTestUtils.SF.applyLB(30_000, 10_000); long seed = System.nanoTime(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateOnePrimaryOneBackupTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateOnePrimaryOneBackupTest.java index cab77867215c0..219f188ded00c 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateOnePrimaryOneBackupTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPartitionCounterStateOnePrimaryOneBackupTest.java @@ -29,6 +29,7 @@ import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.TestRecordingCommunicationSpi; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.processors.cache.PartitionUpdateCounter; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage; import org.apache.ignite.internal.util.future.GridFutureAdapter; @@ -348,7 +349,7 @@ protected void onAllBackupCommitted(IgniteEx backup) { @Override public boolean beforeBackupPrepare(IgniteEx primary, IgniteEx backup, IgniteInternalTx primaryTx, GridFutureAdapter proceedFut) { runAsync(() -> { - IgniteUuid nearXidVer = primaryTx.nearXidVersion().asIgniteUuid(); + IgniteUuid nearXidVer = BinaryUtils.asIgniteUuid(primaryTx.nearXidVersion()); onPrimaryPrepared(primary, primaryTx, order(nearXidVer)); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/CacheFreeListSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/CacheFreeListSelfTest.java index d714f666aac9a..8817a3ba49ebc 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/CacheFreeListSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/CacheFreeListSelfTest.java @@ -294,7 +294,7 @@ protected void checkInsertDeleteMultiThreaded(final int pageSize, final boolean Random rnd = ThreadLocalRandom.current(); - for (int i = 0; i < 200_000; i++) { + for (int i = 0; i < GridTestUtils.SF.applyLB(200_000, 50_000); i++) { boolean grow0 = grow.get(); if (grow0) { diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessageSerializationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessageSerializationTest.java new file mode 100644 index 0000000000000..4de9416c1ff05 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessageSerializationTest.java @@ -0,0 +1,193 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.schema.message; + +import java.io.Externalizable; +import java.io.Serializable; +import java.lang.reflect.Modifier; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.ignite.cache.QueryEntity; +import org.apache.ignite.cache.QueryIndex; +import org.apache.ignite.cache.QueryIndexType; +import org.apache.ignite.internal.CoreMessagesProvider; +import org.apache.ignite.internal.direct.DirectMessageReader; +import org.apache.ignite.internal.direct.DirectMessageWriter; +import org.apache.ignite.internal.managers.communication.IgniteMessageFactoryImpl; +import org.apache.ignite.internal.processors.query.QueryEntityEx; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.marshaller.Marshaller; +import org.apache.ignite.plugin.extensions.communication.Message; +import org.apache.ignite.plugin.extensions.communication.MessageFactory; +import org.apache.ignite.plugin.extensions.communication.MessageFactoryProvider; +import org.apache.ignite.plugin.extensions.communication.MessageSerializer; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Test; + +import static org.apache.ignite.internal.util.CommonUtils.makeMessageType; +import static org.apache.ignite.marshaller.Marshallers.jdk; + +/** Test for serialization round-trip of {@link QueryEntityMessage} and {@link QueryEntityExMessage}. */ +public class QueryEntityMessageSerializationTest extends GridCommonAbstractTest { + /** Error suffix. */ + public static final String ERROR_SUFFIX = " count is not equal to the expected fields count. " + + "Has the number of fields in the `QueryEntity` or `QueryEntityEx` classes changed?"; + + /** */ + private final Marshaller marsh = jdk(); + + /** */ + private final MessageFactory msgFactory = new IgniteMessageFactoryImpl( + new MessageFactoryProvider[] {new CoreMessagesProvider(marsh, marsh, U.gridClassLoader())}); + + /** */ + @Test + public void testQueryEntity() throws Exception { + QueryEntity entity = queryEntity(); + + assertEquals(entity, serializeAndDeserialize(entity, serializableFieldsCount(QueryEntity.class))); + } + + /** */ + @Test + public void testQueryEntityEx() throws Exception { + QueryEntityEx entity = queryEntityEx(); + + long expReadWriteCnt = serializableFieldsCount(QueryEntityEx.class) - + /* QueryEntityEx duplicates 'notNullFields', but 'QueryEntityExMessage' doesn't */ 1; + + QueryEntity res = serializeAndDeserialize(entity, expReadWriteCnt); + + assertTrue(res instanceof QueryEntityEx); + assertEquals(entity, res); + + // Not part of QueryEntityEx.equals(), so assert it explicitly. + assertEquals(entity.fillAbsentPKsWithDefaults(), ((QueryEntityEx)res).fillAbsentPKsWithDefaults()); + } + + /** + * @param src Source entity. + * @param expReadsWritesCnt Expected count of field reads and writes. + * + * @return Entity read during a full serde round-trip. + */ + private QueryEntity serializeAndDeserialize(QueryEntity src, long expReadsWritesCnt) { + QueryEntityMessage msg = src instanceof QueryEntityEx + ? new QueryEntityExMessage((QueryEntityEx)src) : new QueryEntityMessage(src); + + return writeAndReadBack(msg, expReadsWritesCnt).toEntity(); + } + + /** + * @param cls Class of an object. + */ + private long serializableFieldsCount(Class cls) { + if (cls == Object.class) + return 0; + + assertTrue("Not a serializable class: " + cls, Serializable.class.isAssignableFrom(cls)); + assertFalse("Should not be Externalizable:" + cls, Externalizable.class.isAssignableFrom(cls)); + + return serializableFieldsCount(cls.getSuperclass()) + Arrays.stream(cls.getDeclaredFields()) + .filter(f -> !Modifier.isStatic(f.getModifiers()) && !Modifier.isTransient(f.getModifiers())) + .count(); + } + + /** + * @param msg Message to write and read back through {@link DirectMessageWriter}/{@link DirectMessageReader}. + * @param expReadsWritesCnt Expected count of field reads and writes. + * @param Type of Message. + * + * @return Restored message. + */ + private T writeAndReadBack(T msg, long expReadsWritesCnt) { + ByteBuffer buf = ByteBuffer.allocate(64 * 1024); + + MessageSerializer serde = (MessageSerializer)msgFactory.serializer(msg.directType()); + + DirectMessageWriter writer = new DirectMessageWriter(msgFactory); + writer.setBuffer(buf); + + assertTrue(serde.writeTo(msg, writer)); + assertEquals("Writes" + ERROR_SUFFIX, + expReadsWritesCnt, writer.state()); + + buf.flip(); + + DirectMessageReader reader = new DirectMessageReader(msgFactory, null); + reader.setBuffer(buf); + + T res = (T)msgFactory.create(makeMessageType(buf.get(), buf.get())); + + assertTrue(serde.readFrom(res, reader)); + assertEquals("Reads" + ERROR_SUFFIX, + expReadsWritesCnt, reader.state()); + + return res; + } + + /** @return Query entity with every field populated, including non-empty default field values. */ + private QueryEntity queryEntity() { + LinkedHashMap fields = new LinkedHashMap<>(); + fields.put("id", Integer.class.getName()); + fields.put("name", String.class.getName()); + fields.put("price", BigDecimal.class.getName()); + + return new QueryEntity() + .setKeyType(Integer.class.getName()) + .setValueType("org.apache.ignite.Person") + .setKeyFieldName("id") + .setValueFieldName("name") + .setTableName("PERSON") + .setFields(fields) + .setKeyFields(Set.of("id")) + .setAliases(Map.of("name", "NAME_ALIAS")) + .setIndexes(List.of(new QueryIndex("name", QueryIndexType.SORTED).setInlineSize(32))) + .setNotNullFields(Set.of("id", "name")) + .setDefaultFieldValues(Map.of( + "name", "unknown", + "price", new BigDecimal("9.99"), + "id", 42)) + .setFieldsPrecision(Map.of("name", 64)) + .setFieldsScale(Map.of("price", 2)); + } + + /** @return Extended query entity with all base and extended fields populated. */ + private QueryEntityEx queryEntityEx() { + QueryEntity base = queryEntity(); + base.setNotNullFields(null); + + QueryEntityEx entity = new QueryEntityEx(base); + + // Natural QueryEntityEx: notNullFields lives only in the Ex field, base shadow stays null. + entity.setNotNullFields(Set.of("id", "name")); + entity.setPreserveKeysOrder(true); + entity.implicitPk(true); + entity.fillAbsentPKsWithDefaults(true); + entity.sql(true); + entity.setPrimaryKeyInlineSize(16); + entity.setAffinityKeyInlineSize(24); + + return entity; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandlerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandlerSelfTest.java index f4e290d86c084..bb818a8e49f0e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandlerSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandlerSelfTest.java @@ -282,16 +282,6 @@ private static class TestableCacheCommandHandler extends GridCacheCommandHandler return fut; } - // Rewriting flagOn result to keep intercepting invocations after it. - if ("setSkipStore".equals(mtd.getName())) - return proxy; - - if ("forSubjectId".equals(mtd.getName())) - return proxy; - - if ("keepBinary".equals(mtd.getName())) - return proxy; - return mtd.invoke(cache, args); } }); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java new file mode 100644 index 0000000000000..98718dfb63515 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/AbstractRollingUpgradeTest.java @@ -0,0 +1,664 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.Ignition; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.events.Event; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgnitionEx; +import org.apache.ignite.internal.TestRecordingCommunicationSpi; +import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener; +import org.apache.ignite.internal.managers.eventstorage.HighPriorityListener; +import org.apache.ignite.internal.processors.nodevalidation.DiscoveryNodeValidationProcessor; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteComponentFeatureSet; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteComponentFeatureSetProvider; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteCoreFeature; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeature; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeatureSet; +import org.apache.ignite.internal.processors.rollingupgrade.feature.TestIgniteReleaseFeatures_2_18_0; +import org.apache.ignite.internal.processors.rollingupgrade.feature.TestPluginComponentFeatureSetProvider; +import org.apache.ignite.internal.processors.rollingupgrade.feature.TestPluginFeature; +import org.apache.ignite.internal.processors.rollingupgrade.feature.TestPluginReleaseFeatures_1_0_0; +import org.apache.ignite.internal.util.lang.ConsumerX; +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteProductVersion; +import org.apache.ignite.lang.IgniteRunnable; +import org.apache.ignite.plugin.AbstractTestPluginProvider; +import org.apache.ignite.plugin.ExtensionRegistry; +import org.apache.ignite.plugin.PluginContext; +import org.apache.ignite.spi.IgniteNodeValidationResult; +import org.apache.ignite.spi.IgniteSpiException; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.TestBlockingTcpDiscoverySpi; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.jspecify.annotations.Nullable; + +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.apache.ignite.events.EventType.EVT_NODE_VALIDATION_FAILED; +import static org.apache.ignite.internal.IgniteVersionUtils.semanticVersion; +import static org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteCoreFeature.COMPONENT_NAME; + +/** + * Provides the ability to override a node's version and supported {@link IgniteFeature}s in order to + * simulate a Rolling Upgrade procedure. + * + *

      For testing purposes, the following "fake" Ignite versions and their corresponding + * {@link IgniteFeature}s have been introduced. These versions are used solely for testing and do not + * correspond to any actual Ignite releases. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
      VersionFeatures
      2.18.0not supported
      2.19.0{@code IgniteFeatureSet [0]}
      2.19.1{@code IgniteFeatureSet [0, 1]}
      2.19.2{@code IgniteFeatureSet [0 -> 2]}
      2.19.3{@code IgniteFeatureSet [0 -> 2, 6]}
      2.20.0{@code IgniteFeatureSet [0 -> 4]}
      2.20.1{@code IgniteFeatureSet [0 -> 4, 6]}
      2.21.0{@code IgniteFeatureSet [3 -> 6]}
      2.21.1{@code IgniteFeatureSet [3 -> 7]}
      + */ +public abstract class AbstractRollingUpgradeTest extends GridCommonAbstractTest { + /** */ + protected static final String TEST_DEFAULT_VER = "2.19.0"; + + /** */ + protected static final String VER_INCOMPATIBLE_ERR = + "Joining node is not allowed to join the cluster because it is running a component with an incompatible version"; + + /** */ + protected static final String MULTIPLE_VER_IN_TOP_ERR = + "Cluster version finalization failed. The cluster contains nodes running different versions of one or more components"; + + /** */ + protected static final String VER_NOT_EQUAL_ERR = + "One or more component versions on the joining node differ from the corresponding versions active in the cluster"; + + /** */ + protected static final String RU_UNAVAILABLE_BETWEEN_VER_ERR = "Ignite component Rolling Upgrade is not supported" + + " between the component version active in the cluster and the version running on the joining node"; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + return getConfiguration(igniteInstanceName, TEST_DEFAULT_VER); + } + + /** */ + @Override protected void beforeTest() throws Exception { + super.beforeTest(); + + TestRollingUpgradeProcessor.nodeJoinValidationCompletedLatch = null; + TestRollingUpgradeProcessor.nodeJoinUnblockedLatch = null; + TestNodeValidationFailedEventListener.nodeValidationFailedEventUnblockedLatch = null; + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + super.afterTest(); + + stopAllGrids(); + } + + /** */ + protected IgniteConfiguration getConfiguration(int idx, String ver) throws Exception { + return getConfiguration(getTestIgniteInstanceName(idx), ver); + } + + /** */ + protected IgniteConfiguration getConfiguration(String igniteInstanceName, String ver) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + cfg.setCommunicationSpi(new TestRecordingCommunicationSpi()); + + TestVersions testVersions = TestVersions.parse(ver); + + IgniteComponentFeatureSet testCoreFeatures = new IgniteComponentFeatureSet( + COMPONENT_NAME, + IgniteProductVersion.fromString(testVersions.coreVersion()), + IgniteFeatureSet.buildFrom(readDeclaredCoreFeatures(testVersions.coreVersion())) + ); + + cfg.setPluginProviders(new AbstractTestPluginProvider() { + @Override public String name() { + return "test-rolling-upgrade-processor-provider"; + } + + /** {@inheritDoc} */ + @Override public void initExtensions(PluginContext ctx, ExtensionRegistry registry) { + if (testVersions.containsPlugin()) { + registry.registerExtension( + IgniteComponentFeatureSetProvider.class, + new TestPluginComponentFeatureSetProvider(testVersions.pluginVersion())); + } + } + + /** {@inheritDoc} */ + @Override public @Nullable T createComponent(PluginContext ctx, Class cls) { + if (cls.isAssignableFrom(DiscoveryNodeValidationProcessor.class)) + return (T)new TestRollingUpgradeProcessor(((IgniteEx)ctx.grid()).context(), testCoreFeatures); + + return null; + } + }); + + TcpDiscoverySpi discoSpi = new TestBlockingTcpDiscoverySpi(cfg) { + @Override public void setNodeAttributes(Map attrs, IgniteProductVersion ignored) { + super.setNodeAttributes(attrs, IgniteProductVersion.fromString(testVersions.coreVersion())); + } + }; + + cfg.setDiscoverySpi(discoSpi); + + return cfg; + } + + /** */ + protected IgniteEx startGrid(int idx, String ver) throws Exception { + return startGrid(getConfiguration(idx, ver)); + } + + /** */ + protected IgniteEx startClientGrid(int idx, String ver) throws Exception { + return startClientGrid(getConfiguration(idx, ver)); + } + + /** */ + protected IgniteEx startGrid(int idx, String ver, boolean isClient) throws Exception { + return isClient ? startClientGrid(idx, ver) : startGrid(idx, ver); + } + + /** */ + public static Collection readDeclaredCoreFeatures(String ver) throws Exception { + Class cls = Class.forName( + TestIgniteReleaseFeatures_2_18_0.class.getPackageName() + ".TestIgniteReleaseFeatures_" + ver.replace(".", "_")); + + return IgniteFeatureSet.readDeclaredFeatures(cls); + } + + /** */ + public static Collection readDeclaredPluginFeatures(String ver) throws Exception { + Class cls = Class.forName( + TestPluginReleaseFeatures_1_0_0.class.getPackageName() + ".TestPluginReleaseFeatures_" + ver.replace(".", "_")); + + return IgniteFeatureSet.readDeclaredFeatures(cls); + } + + /** */ + protected boolean isFeatureActive(Ignite ignite, IgniteFeature feature) { + return ((IgniteEx)ignite).context().rollingUpgrade().features().isActive(feature); + } + + /** */ + protected void listenFeatureActivation(Ignite ignite, IgniteFeature feature, IgniteRunnable lsnr) { + ((IgniteEx)ignite).context().rollingUpgrade().features().listenActivation(feature, lsnr); + } + + /** */ + protected void startCluster() throws Exception { + startCluster(TEST_DEFAULT_VER); + } + + /** */ + protected void startCluster(String ver) throws Exception { + startGrid(0, ver); + startGrid(1, ver); + startClientGrid(2, ver); + } + + /** */ + protected UUID extractFinalizeProcessId(int nodeIdx) { + Object proc = U.field(grid(nodeIdx).context().rollingUpgrade(), "finalizeProc"); + + return U.field(proc, "locInitOpId"); + } + + /** */ + protected void checkVersionFinalizationFailed(int initiatorNodeIdx, String msg) { + GridTestUtils.assertThrowsAnyCause( + log, + () -> { + ru(initiatorNodeIdx).finalizeClusterVersion(); + + return null; + }, + IgniteCheckedException.class, + msg + ); + } + + /** */ + protected void checkJoinSuccess(int nodeIdx, boolean isClient) throws Exception { + checkJoinSuccess(nodeIdx, TEST_DEFAULT_VER, isClient); + } + + /** */ + protected void checkJoinSuccess(int nodeIdx, String ver, boolean isClient) throws Exception { + int clusterSize = clusterNode().cluster().nodes().size(); + + startGrid(nodeIdx, ver, isClient); + + assertEquals(clusterSize + 1, clusterNode().cluster().nodes().size()); + } + + /** */ + protected void checkJoinFailed(int nodeIdx, String ver, String msg) { + checkJoinFailed(nodeIdx, ver, true, msg); + } + + /** */ + protected void checkJoinFailed(int nodeIdx, String ver, boolean checkClientNode, String msg) { + int expClusterSize = clusterNode().cluster().nodes().size(); + + GridTestUtils.assertThrowsAnyCause(log, () -> startGrid(nodeIdx, ver), IgniteSpiException.class, msg); + + if (checkClientNode) + GridTestUtils.assertThrowsAnyCause(log, () -> startClientGrid(nodeIdx, ver), IgniteSpiException.class, msg); + + assertEquals(expClusterSize, clusterNode().cluster().nodes().size()); + } + + /** */ + protected IgniteEx clusterNode() { + return (IgniteEx)Ignition.allGrids().stream().filter(i -> !i.cluster().localNode().isClient()).findFirst().orElseThrow(); + } + + /** */ + protected void checkVersionUpgradeInProgress(String srcVer, String targetVer) throws Exception { + checkVersionUpgradeInProgress(srcVer, srcVer, targetVer); + } + + /** */ + protected void checkVersionUpgradeInProgress(String logicalVer, String srcVer, String targetVer) throws Exception { + checkVersionUpgradeEnabledStatus(true); + checkRollingUpgradeState(logicalVer, srcVer, targetVer); + + checkFeaturesActive(logicalVer); + + TestVersions logicalVersions = TestVersions.parse(logicalVer); + TestVersions targetVersions = TestVersions.parse(targetVer); + + checkFeaturesNotActive(newFeatures( + logicalVersions.coreVersion() == null ? Collections.emptyList() : readDeclaredCoreFeatures(logicalVersions.coreVersion()), + targetVersions.coreVersion() == null ? Collections.emptyList() : readDeclaredCoreFeatures(targetVersions.coreVersion())) + ); + + checkFeaturesNotActive(newFeatures( + logicalVersions.containsPlugin() ? readDeclaredPluginFeatures(logicalVersions.pluginVersion()) : Collections.emptyList(), + targetVersions.containsPlugin() ? readDeclaredPluginFeatures(targetVersions.pluginVersion()) : Collections.emptyList()) + ); + } + + /** */ + protected void checkVersionUpgradeInactive(String expVer) throws Exception { + checkVersionUpgradeEnabledStatus(false); + checkFeaturesActive(expVer); + } + + /** */ + protected void checkVersionUpgradeEnabledStatus(boolean enabled) { + List cluster = Ignition.allGrids(); + + for (Ignite ignite : cluster) + assertEquals(enabled, ru(ignite).isVersionUpgradeEnabled()); + } + + /** */ + protected void checkFeaturesActive(String ver) throws Exception { + TestVersions versions = TestVersions.parse(ver); + + if (versions.coreVersion() != null) + checkFeaturesActive(readDeclaredCoreFeatures(versions.coreVersion())); + + if (versions.containsPlugin()) + checkFeaturesActive(readDeclaredPluginFeatures(versions.pluginVersion())); + } + + /** */ + protected void checkFeaturesActive(Collection features) { + List cluster = Ignition.allGrids(); + + AtomicInteger activationNotifiedCnt = new AtomicInteger(); + int expFeaturesCnt = 0; + + for (Ignite ignite : cluster) { + for (IgniteFeature feature : features) { + if ( + ignite.configuration().isClientMode() + && !ru(ignite).features().localVersionFeatures().components().contains(feature.componentName()) + ) + continue; + + assertTrue(isFeatureActive(ignite, feature)); + listenFeatureActivation(ignite, feature, activationNotifiedCnt::incrementAndGet); + + ++expFeaturesCnt; + } + } + + assertEquals(expFeaturesCnt, activationNotifiedCnt.get()); + } + + /** */ + protected void checkFeaturesNotActive(Collection features) { + if (F.isEmpty(features)) + return; + + for (Ignite ignite : Ignition.allGrids()) { + for (IgniteFeature feature : features) + assertFalse(isFeatureActive(ignite, feature)); + } + } + + /** */ + protected Collection newFeatures(Collection srcFeatures, Collection targetFeatures) { + List res = new ArrayList<>(); + + for (IgniteFeature targetFeature : targetFeatures) { + if (!srcFeatures.contains(targetFeature)) + res.add(targetFeature); + } + + return res; + } + + /** */ + protected void checkFeatureActivationSubscription(int nodeIdx, IgniteFeature feature, CountDownLatch featureActivationLatch) { + long expCnt = featureActivationLatch.getCount(); + + assertFalse(isFeatureActive(grid(nodeIdx), feature)); + listenFeatureActivation(grid(nodeIdx), feature, featureActivationLatch::countDown); + assertEquals(expCnt, featureActivationLatch.getCount()); + } + + /** */ + protected void upgradeNodeVersion(int nodeIdx, String targetVer) throws Exception { + upgradeNodeVersion(nodeIdx, TEST_DEFAULT_VER, targetVer); + } + + /** */ + protected void upgradeNodeVersion(int nodeIdx, String srcVer, String targetVer) throws Exception { + upgradeNodeVersion(nodeIdx, srcVer, srcVer, targetVer); + } + + /** */ + protected void upgradeNodeVersion(int nodeIdx, String logicalVer, String srcVer, String targetVer) throws Exception { + boolean isClient = grid(nodeIdx).context().clientNode(); + + stopGrid(nodeIdx); + checkJoinSuccess(nodeIdx, targetVer, isClient); + checkVersionUpgradeInProgress(logicalVer, srcVer, targetVer); + } + + /** */ + protected void finalizeClusterVersion(int nodeIdx, String expVer) throws Exception { + ru(nodeIdx).finalizeClusterVersion(); + + checkVersionUpgradeInactive(expVer); + } + + /** */ + protected void restartNode(int nodeIdx) throws Exception { + String ver = resolveNodeCompoundVersion(nodeIdx); + boolean isClient = grid(nodeIdx).context().clientNode(); + + stopGrid(nodeIdx); + checkJoinSuccess(nodeIdx, ver, isClient); + } + + /** */ + protected void forAllNodes(ConsumerX nodeProcessor) throws Exception { + for (Ignite ignite : Ignition.allGrids()) + nodeProcessor.accept(getTestIgniteInstanceIndex(ignite.name())); + } + + /** */ + protected void checkUpgradeFailed(int nodeIdx, String targetVer, String errMsg) throws Exception { + String srcVer = resolveNodeCompoundVersion(nodeIdx); + boolean isClient = grid(nodeIdx).context().clientNode(); + + stopGrid(nodeIdx); + + GridTestUtils.assertThrowsAnyCause(log, () -> startGrid(nodeIdx, targetVer, isClient), IgniteSpiException.class, errMsg); + + startGrid(nodeIdx, srcVer, isClient); + } + + /** */ + String resolveNodeCompoundVersion(int nodeIdx) { + return ru(nodeIdx).features().localVersionFeatures().values().stream() + .sorted(Comparator.comparing(IgniteComponentFeatureSet::componentName)) + .map(f -> semanticVersion(f.version())) + .collect(Collectors.joining("|")); + } + + /** */ + protected void checkRollingUpgradeState(String expLogicalVer, String expSrcVer, String expTargetVer) { + TestVersions expLogicalVersions = TestVersions.parse(expLogicalVer); + TestVersions expSrcVersions = TestVersions.parse(expSrcVer); + TestVersions expTargetVersions = TestVersions.parse(expTargetVer); + + for (Ignite ignite : Ignition.allGrids()) { + assertTrue(ru(ignite).isVersionUpgradeEnabled()); + + expLogicalVersions.cmpVersions.forEach((cmp, ver) -> { + IgniteComponentFeatureSet cmpFeatures = ru(ignite).features().activeComponentFeatures(cmp); + + assertEquals(ver, cmpFeatures == null ? null : semanticVersion(cmpFeatures.version())); + }); + + expSrcVersions.cmpVersions.forEach((cmp, ver) -> { + IgniteComponentUpgradeState state = ru(ignite).state(cmp); + + assertEquals(ver, state.srcVer == null ? null : semanticVersion(state.srcVer)); + }); + + expTargetVersions.cmpVersions.forEach((cmp, ver) -> { + IgniteComponentUpgradeState state = ru(ignite).state(cmp); + + String expVer = Objects.equals(expSrcVersions.cmpVersions.get(cmp), ver) ? null : ver; + + assertEquals(expVer, state.targetVer == null ? null : semanticVersion(state.targetVer)); + }); + } + } + + /** */ + protected int coordinatorIndex() { + for (Ignite grid : IgnitionEx.allGridsx()) { + if (U.isLocalNodeCoordinator(((IgniteEx)grid).context().discovery())) + return getTestIgniteInstanceIndex(grid.name()); + } + + fail("Failed to resolve coordinator node"); + + return -1; + } + + /** */ + protected RollingUpgradeProcessor ru(int nodeIdx) { + return ru(grid(nodeIdx)); + } + + /** */ + protected static RollingUpgradeProcessor ru(Ignite ignite) { + return ((IgniteEx)ignite).context().rollingUpgrade(); + } + + /** */ + protected static class TestVersions { + /** */ + private final Map cmpVersions = new HashMap<>(); + + /** */ + public TestVersions(List cmpVersions) { + assertTrue(!cmpVersions.isEmpty()); + assertTrue(cmpVersions.size() <= 2); + + this.cmpVersions.put(IgniteCoreFeature.COMPONENT_NAME, cmpVersions.get(0)); + + if (cmpVersions.size() > 1) + this.cmpVersions.put(TestPluginFeature.COMPONENT_NAME, cmpVersions.get(1)); + } + + /** */ + public static TestVersions parse(String ver) { + if (ver == null) + return new TestVersions(Collections.singletonList(null)); + + return new TestVersions(Arrays.stream(ver.split("\\|")) + .map(String::trim) + .map(v -> "null".equals(v) ? null : v) + .collect(Collectors.toList())); + } + + /** */ + public String pluginVersion() { + return cmpVersions.get(TestPluginFeature.COMPONENT_NAME); + } + + /** */ + public String coreVersion() { + return cmpVersions.get(IgniteCoreFeature.COMPONENT_NAME); + } + + /** */ + public boolean containsPlugin() { + return cmpVersions.get(TestPluginFeature.COMPONENT_NAME) != null; + } + } + + /** */ + protected static class TestRollingUpgradeProcessor extends RollingUpgradeProcessor { + /** */ + public static CountDownLatch nodeJoinUnblockedLatch; + + /** */ + public static CountDownLatch nodeJoinValidationCompletedLatch; + + /** */ + public TestRollingUpgradeProcessor(GridKernalContext ctx, IgniteComponentFeatureSet testCoreFeatures) { + super(ctx, testCoreFeatures); + + ctx.event().addLocalEventListener(new TestNodeValidationFailedEventListener(), EVT_NODE_VALIDATION_FAILED); + } + + /** {@inheritDoc} */ + @Override @Nullable public IgniteNodeValidationResult validateNode(ClusterNode joiningNode) { + IgniteNodeValidationResult res = super.validateNode(joiningNode); + + if (res != null) + return res; + + if (nodeJoinValidationCompletedLatch != null) + nodeJoinValidationCompletedLatch.countDown(); + + if (nodeJoinUnblockedLatch != null) { + try { + assertTrue(nodeJoinUnblockedLatch.await(5_000, MILLISECONDS)); + } + catch (InterruptedException e) { + Thread.currentThread().interrupt(); + + log.error(e.getMessage(), e); + + return new IgniteNodeValidationResult(joiningNode.id(), e.getMessage()); + } + } + + return null; + } + } + + /** */ + protected static class TestNodeValidationFailedEventListener implements GridLocalEventListener, HighPriorityListener { + /** */ + public static CountDownLatch nodeValidationFailedEventUnblockedLatch; + + /** {@inheritDoc} */ + @Override public void onEvent(Event evt) { + try { + if (nodeValidationFailedEventUnblockedLatch != null) + assertTrue(nodeValidationFailedEventUnblockedLatch.await(5_000, MILLISECONDS)); + } + catch (InterruptedException e) { + Thread.currentThread().interrupt(); + + log.error(e.getMessage(), e); + + throw new IgniteException(e); + } + } + + /** {@inheritDoc} */ + @Override public int order() { + return 0; + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/CoreVersionRollingUpgradeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/CoreVersionRollingUpgradeTest.java new file mode 100644 index 0000000000000..e852649829a6d --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/CoreVersionRollingUpgradeTest.java @@ -0,0 +1,951 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade; + +import java.util.UUID; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicReference; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.configuration.BinaryConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.distributed.FullMessage; +import org.apache.ignite.internal.util.distributed.InitMessage; +import org.apache.ignite.internal.util.distributed.SingleNodeMessage; +import org.apache.ignite.internal.util.typedef.X; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.spi.IgniteSpiException; +import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryAbstractMessage; +import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCustomEventMessage; +import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryJoinRequestMessage; +import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessage; +import org.apache.ignite.testframework.GridTestUtils; +import org.junit.Test; + +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.apache.ignite.events.EventType.EVT_CLIENT_NODE_RECONNECTED; +import static org.apache.ignite.internal.TestRecordingCommunicationSpi.spi; +import static org.apache.ignite.internal.processors.rollingupgrade.feature.TestIgniteReleaseFeatures_2_19_2.VER_2_19_2_ID_1_FEATURE; +import static org.apache.ignite.spi.discovery.tcp.TestBlockingTcpDiscoverySpi.blockingDiscovery; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; + +/** */ +public class CoreVersionRollingUpgradeTest extends AbstractRollingUpgradeTest { + /** */ + @Test + public void testVersionUpgradeDisabledSingleServer() throws Exception { + startGrid(0); + + checkVersionUpgradeInactive("2.19.0"); + } + + /** */ + @Test + public void testVersionUpgradeDisabledNodeJoin() throws Exception { + startCluster(); + + checkVersionUpgradeInactive(TEST_DEFAULT_VER); + + String msg = VER_NOT_EQUAL_ERR; + + checkJoinFailed(3, "2.18.0", msg); + checkJoinFailed(3, "2.19.1", msg); + } + + /** */ + @Test + public void testVersionUpgradeDisabledFinalization() throws Exception { + startCluster(); + + ru(1).finalizeClusterVersion(); + + checkVersionUpgradeInactive(TEST_DEFAULT_VER); + } + + /** */ + @Test + public void testVersionsFinalizationNoVersionUpgrade() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + checkVersionUpgradeInProgress(TEST_DEFAULT_VER, null); + + ru(1).finalizeClusterVersion(); + + checkVersionUpgradeInactive(TEST_DEFAULT_VER); + + restartNode(1); + restartNode(2); + } + + /** */ + @Test + public void testVersionUpgradeCommandsIdempotency() throws Exception { + startCluster(); + + ru(0).enableVersionUpgrade(); + ru(1).enableVersionUpgrade(); + + checkVersionUpgradeInProgress(TEST_DEFAULT_VER, null); + + ru(0).finalizeClusterVersion(); + ru(0).finalizeClusterVersion(); + + checkVersionUpgradeInactive(TEST_DEFAULT_VER); + } + + /** */ + @Test + public void testVersionUpgradeEnabledNodeJoin() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + checkVersionUpgradeInProgress(TEST_DEFAULT_VER, null); + + restartNode(2); + restartNode(0); + + checkJoinSuccess(3, false); + checkJoinSuccess(4, true); + + checkVersionUpgradeInProgress(TEST_DEFAULT_VER, null); + + checkJoinFailed(5, "2.18.0", VER_INCOMPATIBLE_ERR); + + upgradeNodeVersion(0, "2.19.1"); + upgradeNodeVersion(2, "2.19.1"); + + checkVersionUpgradeInProgress(TEST_DEFAULT_VER, "2.19.1"); + + checkJoinFailed(5, "2.19.2", VER_INCOMPATIBLE_ERR); + + restartNode(3); + restartNode(4); + + restartNode(0); + restartNode(2); + + upgradeNodeVersion(1, "2.19.1"); + upgradeNodeVersion(3, "2.19.1"); + upgradeNodeVersion(4, "2.19.1"); + + finalizeClusterVersion(1, "2.19.1"); + } + + /** */ + @Test + public void testClusterVersionUpgrade() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + upgradeNodeVersion(1, "2.19.2"); + + checkVersionFinalizationFailed(1, MULTIPLE_VER_IN_TOP_ERR); + + upgradeNodeVersion(0, "2.19.2"); + + checkVersionFinalizationFailed(1, MULTIPLE_VER_IN_TOP_ERR); + + upgradeNodeVersion(2, "2.19.2"); + + finalizeClusterVersion(1, "2.19.2"); + } + + /** */ + @Test + public void testJoinAfterClusterVersionFinalization() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + upgradeNodeVersion(0, "2.19.2"); + upgradeNodeVersion(2, "2.19.2"); + stopGrid(1); + + finalizeClusterVersion(0, "2.19.2"); + + checkJoinSuccess(1, "2.19.2", false); + checkJoinSuccess(4, "2.19.2", true); + + checkVersionUpgradeInactive("2.19.2"); + } + + /** */ + @Test + public void testFeatureActivationListener() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + CountDownLatch featureActivationLatch = new CountDownLatch(3); + + forAllNodes(nodeIdx -> { + upgradeNodeVersion(nodeIdx, "2.19.2"); + checkFeatureActivationSubscription(nodeIdx, VER_2_19_2_ID_1_FEATURE, featureActivationLatch); + }); + + finalizeClusterVersion(1, "2.19.2"); + + assertTrue(featureActivationLatch.await(getTestTimeout(), MILLISECONDS)); + } + + /** */ + @Test + public void testIterativeClusterVersionUpgrade() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.2")); + + upgradeNodeVersion(0, TEST_DEFAULT_VER, "2.19.2", "2.19.3"); + + stopGrid(0); + + checkJoinSuccess(3, TEST_DEFAULT_VER, false); + checkJoinSuccess(4, TEST_DEFAULT_VER, true); + + checkUpgradeFailed(2, "2.19.3", VER_INCOMPATIBLE_ERR); + checkUpgradeFailed(1, "2.19.3", VER_INCOMPATIBLE_ERR); + + upgradeNodeVersion(3, "2.19.2"); + upgradeNodeVersion(4, "2.19.2"); + checkJoinSuccess(0, "2.19.3", false); + + checkUpgradeFailed(2, TEST_DEFAULT_VER, VER_INCOMPATIBLE_ERR); + checkUpgradeFailed(1, TEST_DEFAULT_VER, VER_INCOMPATIBLE_ERR); + + restartNode(1); + restartNode(2); + + upgradeNodeVersion(2, TEST_DEFAULT_VER, "2.19.2", "2.19.3"); + upgradeNodeVersion(1, TEST_DEFAULT_VER, "2.19.2", "2.19.3"); + upgradeNodeVersion(3, TEST_DEFAULT_VER, "2.19.2", "2.19.3"); + // After all cluster nodes have been upgraded, the Rolling Upgrade source version becomes equal to the cluster logical version. + upgradeNodeVersion(4, TEST_DEFAULT_VER, TEST_DEFAULT_VER, "2.19.3"); + + checkJoinSuccess(5, "2.19.2", false); + checkJoinSuccess(6, "2.19.2", false); + + upgradeNodeVersion(5, TEST_DEFAULT_VER, "2.19.2", "2.19.3"); + // After all cluster nodes have been upgraded, the Rolling Upgrade source version becomes equal to the cluster logical version. + upgradeNodeVersion(6, TEST_DEFAULT_VER, TEST_DEFAULT_VER, "2.19.3"); + + finalizeClusterVersion(1, "2.19.3"); + } + + /** */ + @Test + public void testMultipleClusterVersionUpgrades() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.2")); + finalizeClusterVersion(1, "2.19.2"); + + ru(1).enableVersionUpgrade(); + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.2", "2.20.0")); + finalizeClusterVersion(1, "2.20.0"); + + ru(1).enableVersionUpgrade(); + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.20.0", "2.21.0")); + finalizeClusterVersion(1, "2.21.0"); + } + + /** */ + @Test + public void testProductVersionChangeDuringClusterVersionUpgrade() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + upgradeNodeVersion(0, "2.19.2"); + + upgradeNodeVersion(0, "2.19.3"); + + checkUpgradeFailed(1, "2.19.2", VER_INCOMPATIBLE_ERR); + checkUpgradeFailed(2, "2.19.2", VER_INCOMPATIBLE_ERR); + + upgradeNodeVersion(1, "2.19.3"); + upgradeNodeVersion(2, "2.19.3"); + + finalizeClusterVersion(1, "2.19.3"); + } + + /** */ + @Test + public void testUpgradeBetweenVersionsWithCherryPicks() throws Exception { + startCluster("2.19.3"); + + ru(1).enableVersionUpgrade(); + + checkJoinFailed(3, "2.20.0", RU_UNAVAILABLE_BETWEEN_VER_ERR); + + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.3", "2.20.1")); + + finalizeClusterVersion(1, "2.20.1"); + } + + /** */ + @Test + public void testUpgradeBetweenVersionWithCherryPicksAndContinuousRange() throws Exception { + startCluster("2.20.1"); + + ru(1).enableVersionUpgrade(); + + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.20.1", "2.21.1")); + + finalizeClusterVersion(1, "2.21.1"); + } + + /** */ + @Test + public void testConcurrentFinalization() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + spi(grid(1)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + try { + IgniteInternalFuture firstFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(1, TEST_DEFAULT_VER)); + + spi(grid(1)).waitForBlocked(); + + IgniteInternalFuture secondFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(0, TEST_DEFAULT_VER)); + + spi(grid(1)).waitForBlocked(2); + + spi(grid(1)).stopBlock(); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> secondFut.get(getTestTimeout(), MILLISECONDS), + IgniteCheckedException.class, + "Cluster version finalization process is already in progress" + ); + + firstFut.get(getTestTimeout(), MILLISECONDS); + + checkVersionUpgradeInactive(TEST_DEFAULT_VER); + } + finally { + spi(grid(1)).stopBlock(); + } + } + + /** */ + @Test + public void testConcurrentFinalizationFromSameNode() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + spi(grid(1)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + try { + IgniteInternalFuture firstFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(0, TEST_DEFAULT_VER)); + + spi(grid(1)).waitForBlocked(); + + IgniteInternalFuture secondFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(0, TEST_DEFAULT_VER)); + + U.sleep(1000); + + spi(grid(1)).stopBlock(); + + secondFut.get(getTestTimeout(), MILLISECONDS); + + firstFut.get(getTestTimeout(), MILLISECONDS); + + checkVersionUpgradeInactive(TEST_DEFAULT_VER); + } + finally { + spi(grid(1)).stopBlock(); + } + } + + /** */ + @Test + public void testNodeJoinDuringFinalization() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + spi(grid(1)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + try { + IgniteInternalFuture finalizationFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(1, TEST_DEFAULT_VER)); + + spi(grid(1)).waitForBlocked(); + + checkJoinFailed(3, TEST_DEFAULT_VER, "Node joins are not allowed during cluster version finalization"); + + spi(grid(1)).stopBlock(); + + finalizationFut.get(getTestTimeout(), MILLISECONDS); + + checkVersionUpgradeInactive(TEST_DEFAULT_VER); + } + finally { + spi(grid(1)).stopBlock(); + } + } + + /** */ + @Test + public void testValidatedJoiningNodesAccountedDuringFinalization() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + TestRollingUpgradeProcessor.nodeJoinValidationCompletedLatch = new CountDownLatch(1); + TestRollingUpgradeProcessor.nodeJoinUnblockedLatch = new CountDownLatch(1); + + try { + IgniteInternalFuture startFut = GridTestUtils.runAsync(() -> startGrid(3, "2.19.2")); + + assertTrue(TestRollingUpgradeProcessor.nodeJoinValidationCompletedLatch.await(getTestTimeout(), MILLISECONDS)); + + blockingDiscovery(grid(0)).block(); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(1, TEST_DEFAULT_VER)); + + waitForBlockedDiscoveryMessages(grid(0), 1, InitMessage.class); + + TestRollingUpgradeProcessor.nodeJoinUnblockedLatch.countDown(); + + blockingDiscovery(grid(0)).unblock(); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> finalizeFut.get(getTestTimeout(), MILLISECONDS), + IgniteCheckedException.class, + MULTIPLE_VER_IN_TOP_ERR + ); + + startFut.get(getTestTimeout(), MILLISECONDS); + + checkVersionUpgradeInProgress(TEST_DEFAULT_VER, "2.19.2"); + } + finally { + TestRollingUpgradeProcessor.nodeJoinUnblockedLatch.countDown(); + } + } + + /** */ + @Test + public void testCoordinatorChangeAfterVersionFinalizationFailedOnCoordinator() throws Exception { + startCluster(); + startGrid(3, TEST_DEFAULT_VER); + + ru(1).enableVersionUpgrade(); + + TestRollingUpgradeProcessor.nodeJoinValidationCompletedLatch = new CountDownLatch(1); + TestNodeValidationFailedEventListener.nodeValidationFailedEventUnblockedLatch = new CountDownLatch(1); + + try { + IgniteConfiguration cfg = getConfiguration(4, "2.19.1") + .setBinaryConfiguration(new BinaryConfiguration().setCompactFooter(false)); + + IgniteInternalFuture startFut = GridTestUtils.runAsync(() -> startGrid(cfg)); + + assertTrue(TestRollingUpgradeProcessor.nodeJoinValidationCompletedLatch.await(getTestTimeout(), MILLISECONDS)); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(1, TEST_DEFAULT_VER)); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> finalizeFut.get(getTestTimeout(), MILLISECONDS), + IgniteCheckedException.class, + MULTIPLE_VER_IN_TOP_ERR + ); + + TestNodeValidationFailedEventListener.nodeValidationFailedEventUnblockedLatch.countDown(); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> startFut.get(getTestTimeout(), MILLISECONDS), + IgniteCheckedException.class, + "Local node's binary configuration is not equal to remote node's binary configuration" + ); + } + finally { + TestNodeValidationFailedEventListener.nodeValidationFailedEventUnblockedLatch.countDown(); + } + + stopGrid(coordinatorIndex()); + + forAllNodes(n -> upgradeNodeVersion(n, "2.19.1")); + + finalizeClusterVersion(1, "2.19.1"); + } + + /** */ + @Test + public void testConcurrentFinalizationErrorPreserveNodeFence() throws Exception { + startGrid(0, TEST_DEFAULT_VER); + startGrid(1, TEST_DEFAULT_VER); + startGrid(2, TEST_DEFAULT_VER); + + startClientGrid(3, TEST_DEFAULT_VER); + + ru(1).enableVersionUpgrade(); + + blockingDiscovery(grid(0)).block(); + + try { + IgniteInternalFuture firstFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(1, TEST_DEFAULT_VER)); + + waitForBlockedDiscoveryMessages(grid(0), 1, InitMessage.class); + + IgniteInternalFuture secondFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(3, TEST_DEFAULT_VER)); + + waitForBlockedDiscoveryMessages(grid(0), 2, InitMessage.class); + + UUID startedFinalizeProcId = extractFinalizeProcessId(1); + + spi(grid(2)).blockMessages((node, msg) -> { + if (!(msg instanceof SingleNodeMessage singleNodeMsg)) + return false; + + return singleNodeMsg.processId().equals(startedFinalizeProcId); + }); + + blockingDiscovery(grid(0)).unblock(); + + spi(grid(2)).waitForBlocked(); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> secondFut.get(getTestTimeout(), MILLISECONDS), + IgniteCheckedException.class, + "Cluster version finalization process is already in progress" + ); + + checkJoinFailed(4, TEST_DEFAULT_VER, "Node joins are not allowed during cluster version finalization"); + + spi(grid(2)).stopBlock(); + + firstFut.get(getTestTimeout(), MILLISECONDS); + } + finally { + blockingDiscovery(grid(0)).unblock(); + spi(grid(2)).stopBlock(); + } + } + + /** */ + @Test + public void testClientNodeDisconnectDuringFinalization() throws Exception { + startCluster(); + + ru(2).enableVersionUpgrade(); + + spi(grid(2)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + try { + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> ru(2).finalizeClusterVersion()); + + spi(grid(2)).waitForBlocked(); + + grid(0).context().discovery().failNode(grid(2).context().localNodeId(), "test"); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> finalizeFut.get(getTestTimeout(), MILLISECONDS), + IgniteException.class, + "Client node has disconnected"); + + assertTrue(waitForCondition(() -> !ru(1).isVersionUpgradeEnabled(), getTestTimeout())); + } + finally { + spi(grid(2)).stopBlock(); + } + } + + /** */ + @Test + public void testClientNodeClearsActiveFinalizationProcessOnDisconnect() throws Exception { + startCluster(); + startClientGrid(3, TEST_DEFAULT_VER); + + CountDownLatch cliReconnectedLatch = new CountDownLatch(1); + + grid(3).events().localListen(evt -> { + cliReconnectedLatch.countDown(); + + return true; + }, EVT_CLIENT_NODE_RECONNECTED); + + ru(1).enableVersionUpgrade(); + + spi(grid(3)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> ru(1).finalizeClusterVersion()); + + spi(grid(3)).waitForBlocked(); + + AtomicReference cliJoinReq = new AtomicReference<>(); + CountDownLatch cliJoinReqReceivedLatch = new CountDownLatch(1); + + blockingDiscovery(grid(0)).messageFilter(m -> { + if ((m instanceof TcpDiscoveryJoinRequestMessage joinReq) && joinReq.node().isClient()) { + cliJoinReq.set(joinReq); + cliJoinReqReceivedLatch.countDown(); + + return true; + } + + return false; + }); + + grid(0).context().discovery().failNode(grid(3).context().localNodeId(), "test"); + + finalizeFut.get(getTestTimeout(), MILLISECONDS); + + assertTrue(cliJoinReqReceivedLatch.await(getTestTimeout(), MILLISECONDS)); + + blockingDiscovery(grid(0)).messageQueue().addLast(cliJoinReq.get()); + + assertTrue(cliReconnectedLatch.await(getTestTimeout(), MILLISECONDS)); + + spi(grid(3)).stopBlock(); + + ru(1).enableVersionUpgrade(); + + finalizeClusterVersion(1, TEST_DEFAULT_VER); + } + + /** */ + @Test + public void testFailedNodeDoesNotAffectFinalization() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.1")); + + IgniteConfiguration cfg = getConfiguration(3, TEST_DEFAULT_VER) + .setBinaryConfiguration(new BinaryConfiguration().setCompactFooter(false)); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> startGrid(cfg), + IgniteSpiException.class, + "Local node's binary configuration is not equal to remote node's binary configuration" + ); + + finalizeClusterVersion(2, "2.19.1"); + } + + /** */ + @Test + public void testAbortNoFinalizationInProgress() throws Exception { + startCluster(); + + ru(1).abortClusterVersionFinalization(); + + ru(2).enableVersionUpgrade(); + + ru(0).abortClusterVersionFinalization(); + + startGrid(3); + + finalizeClusterVersion(2, TEST_DEFAULT_VER); + } + + /** */ + @Test + public void testConcurrentAbortAndPrepareFinalization() throws Exception { + startCluster(); + + ru(2).enableVersionUpgrade(); + + blockingDiscovery(grid(0)).block(); + + IgniteInternalFuture abortFut = GridTestUtils.runAsync(() -> ru(0).abortClusterVersionFinalization()); + + waitForBlockedDiscoveryMessages(grid(0), 1, InitMessage.class); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> ru(1).finalizeClusterVersion()); + + waitForBlockedDiscoveryMessages(grid(0), 2, InitMessage.class); + + blockingDiscovery(grid(0)).unblock(); + + abortFut.get(getTestTimeout(), MILLISECONDS); + finalizeFut.get(getTestTimeout(), MILLISECONDS); + } + + /** */ + @Test + public void testAbortAfterFinalizationPrepare() throws Exception { + startCluster(); + + ru(2).enableVersionUpgrade(); + + spi(grid(1)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> ru(1).finalizeClusterVersion()); + + spi(grid(1)).waitForBlocked(); + + blockingDiscovery(grid(0)).block(); + + IgniteInternalFuture abortFut = GridTestUtils.runAsync(() -> ru(2).abortClusterVersionFinalization()); + + waitForBlockedDiscoveryMessages(grid(0), 1, InitMessage.class); + + blockingDiscovery(grid(0)).unblock(); + spi(grid(1)).stopBlock(); + + abortFut.get(getTestTimeout(), MILLISECONDS); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> finalizeFut.get(getTestTimeout(), MILLISECONDS), + IgniteException.class, + "Operation has been aborted by administrator"); + + checkVersionUpgradeInProgress(TEST_DEFAULT_VER, null); + + startGrid(3, TEST_DEFAULT_VER); + + finalizeClusterVersion(2, TEST_DEFAULT_VER); + } + + /** */ + @Test + public void testAbortBeforeFinalizationComplete() throws Exception { + startCluster(); + + ru(2).enableVersionUpgrade(); + + spi(grid(1)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> ru(1).finalizeClusterVersion()); + + spi(grid(1)).waitForBlocked(); + + UUID startedFinalizeProcId = extractFinalizeProcessId(1); + + CountDownLatch finalizeCompleteStartedLatch = new CountDownLatch(1); + AtomicReference finalizeCompleteStartMsg = new AtomicReference<>(); + + blockingDiscovery(grid(0)).messageFilter(m -> { + if ((m instanceof TcpDiscoveryCustomEventMessage customMsg) + && (customMsg.message() instanceof InitMessage initMsg) + && initMsg.processId().equals(startedFinalizeProcId) + ) { + finalizeCompleteStartMsg.set(m); + finalizeCompleteStartedLatch.countDown(); + + return true; + } + + return false; + }); + + spi(grid(1)).stopBlock(); + + assertTrue(finalizeCompleteStartedLatch.await(getTestTimeout(), MILLISECONDS)); + + blockingDiscovery(grid(0)).block(); + + IgniteInternalFuture abortFut = GridTestUtils.runAsync(() -> ru(2).abortClusterVersionFinalization()); + + waitForBlockedDiscoveryMessages(grid(0), 1, InitMessage.class); + + blockingDiscovery(grid(0)).messageQueue().addLast(finalizeCompleteStartMsg.get()); + + blockingDiscovery(grid(0)).unblock(); + + abortFut.get(getTestTimeout(), MILLISECONDS); + + GridTestUtils.assertThrowsAnyCause( + log, + () -> finalizeFut.get(getTestTimeout(), MILLISECONDS), + IgniteException.class, + "Operation has been aborted by administrator"); + + checkVersionUpgradeInProgress(TEST_DEFAULT_VER, null); + + startGrid(3, TEST_DEFAULT_VER); + + finalizeClusterVersion(2, TEST_DEFAULT_VER); + } + + /** */ + @Test + public void testAbortedAfterFinalizationComplete() throws Exception { + startGrid(0, TEST_DEFAULT_VER); + startGrid(1, TEST_DEFAULT_VER); + startGrid(2, TEST_DEFAULT_VER); + startClientGrid(3, TEST_DEFAULT_VER); + + ru(2).enableVersionUpgrade(); + + spi(grid(1)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> ru(1).finalizeClusterVersion()); + + spi(grid(1)).waitForBlocked(); + + blockingDiscovery(grid(0)).block(); + + spi(grid(1)).stopBlock(); + + waitForBlockedDiscoveryMessages(grid(0), 1, FullMessage.class); + + spi(grid(1)).blockMessages((node, msg) -> msg instanceof SingleNodeMessage); + + blockingDiscovery(grid(0)).unblock(); + + spi(grid(1)).waitForBlocked(); + + IgniteInternalFuture abortFut = GridTestUtils.runAsync(() -> ru(2).abortClusterVersionFinalization()); + + spi(grid(1)).stopBlock(); + + abortFut.get(getTestTimeout(), MILLISECONDS); + + finalizeFut.get(getTestTimeout(), MILLISECONDS); + + checkVersionUpgradeInactive(TEST_DEFAULT_VER); + + ru(2).enableVersionUpgrade(); + + startGrid(4, TEST_DEFAULT_VER); + + finalizeClusterVersion(2, TEST_DEFAULT_VER); + } + + /** */ + @Test + public void testAbortedAfterFinalizationFinished() throws Exception { + startCluster(); + + ru(2).enableVersionUpgrade(); + + finalizeClusterVersion(2, TEST_DEFAULT_VER); + + ru(1).abortClusterVersionFinalization(); + + ru(2).enableVersionUpgrade(); + + startGrid(3, TEST_DEFAULT_VER); + + finalizeClusterVersion(2, TEST_DEFAULT_VER); + } + + /** */ + @Test + public void testConcurrentNodeJoinAndFinalization() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + TestRollingUpgradeProcessor.nodeJoinValidationCompletedLatch = new CountDownLatch(1); + TestRollingUpgradeProcessor.nodeJoinUnblockedLatch = new CountDownLatch(1); + + try { + IgniteInternalFuture startFut = GridTestUtils.runAsync(() -> startGrid(3, TEST_DEFAULT_VER)); + + assertTrue(TestRollingUpgradeProcessor.nodeJoinValidationCompletedLatch.await(getTestTimeout(), MILLISECONDS)); + + blockingDiscovery(grid(0)).block(); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> finalizeClusterVersion(1, TEST_DEFAULT_VER)); + + waitForBlockedDiscoveryMessages(grid(0), 1, InitMessage.class); + + TestRollingUpgradeProcessor.nodeJoinUnblockedLatch.countDown(); + + waitForBlockedDiscoveryMessages(grid(0), 1, TcpDiscoveryNodeAddedMessage.class); + + blockingDiscovery(grid(0)).unblock(); + + finalizeFut.get(getTestTimeout(), MILLISECONDS); + + startFut.get(getTestTimeout(), MILLISECONDS); + } + finally { + TestRollingUpgradeProcessor.nodeJoinUnblockedLatch.countDown(); + } + } + + /** */ + @Test + public void testConcurrentFinalizationAndNodeJoin() throws Exception { + startCluster(); + + ru(1).enableVersionUpgrade(); + + blockingDiscovery(grid(0)).block(); + + IgniteInternalFuture finalizeFut = GridTestUtils.runAsync(() -> ru(1).finalizeClusterVersion()); + + waitForBlockedDiscoveryMessages(grid(0), 1, InitMessage.class); + + IgniteInternalFuture startFut = GridTestUtils.runAsync(() -> startGrid(3, TEST_DEFAULT_VER)); + + waitForBlockedDiscoveryMessages(grid(0), 1, TcpDiscoveryJoinRequestMessage.class); + + blockingDiscovery(grid(0)).unblock(); + + finalizeFut.get(getTestTimeout(), MILLISECONDS); + + try { + startFut.get(getTestTimeout(), MILLISECONDS); + } + catch (IgniteCheckedException e) { + assertTrue(X.hasCause(e, "Node joins are not allowed during cluster version finalization", IgniteSpiException.class)); + } + } + + /** */ + private void waitForBlockedDiscoveryMessages( + IgniteEx ignite, + int expCnt, + Class msgCls + ) throws Exception { + assertTrue(waitForCondition(() -> queuedDiscoveryMessageCountMatches(ignite, expCnt, msgCls), getTestTimeout())); + } + + /** */ + private boolean queuedDiscoveryMessageCountMatches(IgniteEx ignite, int expCnt, Class msgCls) { + int cnt = 0; + + for (TcpDiscoveryAbstractMessage msg : blockingDiscovery(ignite).messageQueue()) { + Class queuedMsgCls = (msg instanceof TcpDiscoveryCustomEventMessage customMsg) + ? customMsg.message().getClass() + : msg.getClass(); + + if (msgCls.isAssignableFrom(queuedMsgCls)) + cnt++; + } + + return expCnt == cnt; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/PluginVersionRollingUpgradeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/PluginVersionRollingUpgradeTest.java new file mode 100644 index 0000000000000..02879bf669c5c --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/PluginVersionRollingUpgradeTest.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade; + +import org.junit.Test; + +/** */ +public class PluginVersionRollingUpgradeTest extends AbstractRollingUpgradeTest { + /** */ + @Test + public void testUpgradeDisabledJoinWithExtraComponent() throws Exception { + startGrid(0, "2.19.0"); + + checkJoinFailed(1, "2.19.0 | 1.0.0", VER_NOT_EQUAL_ERR); + } + + /** */ + @Test + public void testUpgradeDisabledJoinWithMissingComponent() throws Exception { + startGrid(0, "2.19.0 | 1.0.0"); + + checkJoinFailed(1, "2.19.0", false, VER_NOT_EQUAL_ERR); + + checkJoinFailed(1, "2.19.0 | 2.0.0", VER_NOT_EQUAL_ERR); + + checkJoinSuccess(1, "2.19.0", true); + } + + /** */ + @Test + public void testNewPluginActivation() throws Exception { + startCluster("2.19.0"); + + ru(1).enableVersionUpgrade(); + + checkVersionUpgradeInProgress("2.19.0 | null", "null | null"); + + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.0 | null", "2.19.0 | 1.0.0")); + + finalizeClusterVersion(1, "2.19.0 | 1.0.0"); + } + + /** */ + @Test + public void testPluginVersionUpgrade() throws Exception { + startCluster("2.19.0 | 1.0.0"); + + ru(1).enableVersionUpgrade(); + + checkVersionUpgradeInProgress("2.19.0 | 1.0.0", "null | null"); + + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.0 | 1.0.0", "2.19.0 | 2.0.0")); + + finalizeClusterVersion(1, "2.19.0 | 2.0.0"); + + ru(1).enableVersionUpgrade(); + + checkVersionUpgradeInProgress("2.19.0 | 2.0.0", "null | null"); + + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.0 | 2.0.0", "2.19.0 | 3.0.0")); + + finalizeClusterVersion(1, "2.19.0 | 3.0.0"); + } + + /** */ + @Test + public void testPluginAndIgniteVersionUpgrade() throws Exception { + startCluster("2.19.0 | 1.0.0"); + + ru(1).enableVersionUpgrade(); + + forAllNodes(nodeIdx -> upgradeNodeVersion(nodeIdx, "2.19.0 | 1.0.0", "2.20.0 | 2.0.0")); + + finalizeClusterVersion(1, "2.20.0 | 2.0.0"); + } + + /** */ + @Test + public void testComponentVersionValidationDuringFinalization() throws Exception { + startGrid(0, "2.19.0 | 1.0.0"); + startGrid(1, "2.19.0 | 1.0.0"); + startClientGrid(2, "2.19.0"); + + ru(1).enableVersionUpgrade(); + + startClientGrid(3, "2.19.0 | 2.0.0"); + checkVersionFinalizationFailed(0, MULTIPLE_VER_IN_TOP_ERR); + stopGrid(3); + + startGrid(4, "2.19.0 | 2.0.0"); + checkVersionFinalizationFailed(0, MULTIPLE_VER_IN_TOP_ERR); + stopGrid(4); + + startClientGrid(3, "2.19.0 | 1.0.0"); + startGrid(4, "2.19.0 | 1.0.0"); + + finalizeClusterVersion(1, "2.19.0 | 1.0.0"); + } + + /** */ + @Test + public void testNodeValidationDuringUpgrade() throws Exception { + startCluster("2.19.0 | 1.0.0"); + + ru(1).enableVersionUpgrade(); + + checkJoinFailed(3, "2.20.0", false, "Some components active in the cluster are not configured on the joining server node"); + checkJoinSuccess(3, "2.20.0", true); + + checkJoinFailed(4, "2.20.0 | 3.0.0", RU_UNAVAILABLE_BETWEEN_VER_ERR); + + checkJoinSuccess(4, "2.20.0 | 2.0.0", true); + + checkJoinFailed(5, "2.20.0 | 3.0.0", VER_INCOMPATIBLE_ERR); + + upgradeNodeVersion(0, "2.19.0 | 1.0.0", "2.20.0 | 2.0.0"); + upgradeNodeVersion(1, "2.19.0 | 1.0.0", "2.20.0 | 2.0.0"); + upgradeNodeVersion(2, "2.19.0 | 1.0.0", "2.20.0 | 2.0.0"); + upgradeNodeVersion(4, "2.19.0 | 1.0.0", "2.20.0 | 2.0.0"); + + finalizeClusterVersion(1, "2.20.0 | 2.0.0"); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureSetTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureSetTest.java new file mode 100644 index 0000000000000..2f5ca5e16796f --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/IgniteFeatureSetTest.java @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import org.apache.ignite.internal.util.GridIntList; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Test; + +import static java.util.Arrays.asList; +import static org.apache.ignite.testframework.GridTestUtils.assertThrows; + +/** */ +public class IgniteFeatureSetTest extends GridCommonAbstractTest { + /** */ + @Test + public void testFeatureSetElements() { + checkFeatureSetElements(List.of(0), featureSetOf(0)); + checkFeatureSetElements(asList(0, 1, 2), featureSetOf(0, 1, 2)); + checkFeatureSetElements(asList(0, 2, 4, 6), featureSetOf(0, 2, 4, 6)); + checkFeatureSetElements(asList(0, 1, 2, 3), featureSetOf(3)); + checkFeatureSetElements(asList(0, 1, 2, 3, 4), featureSetOf(2, 3, 4)); + checkFeatureSetElements(asList(0, 10), featureSetOf(0, 10)); + checkFeatureSetElements(asList(0, 1, 2, 10), featureSetOf(0, 1, 2, 10)); + checkFeatureSetElements(asList(0, 1, 2, 3, 4, 10), featureSetOf(2, 3, 4, 10)); + checkFeatureSetElements(asList(0, 1, 2, 3, 4, 10, 15), featureSetOf(2, 3, 4, 10, 15)); + checkFeatureSetElements(asList(0, 1, 2, 3, 4, 5, 10, 15), featureSetOf(5, 2, 10, 3, 15, 4)); + } + + /** */ + @Test + public void testNotContains() { + IgniteFeatureSet featureSet = featureSetOf(2, 3, 4, 10, 15); + + assertFalse(featureSet.contains(5)); + assertFalse(featureSet.contains(11)); + assertFalse(featureSet.contains(16)); + } + + /** */ + @Test + public void testUpgradeAvailability() { + assertTrue(featureSetOf(0).isUpgradableTo(featureSetOf(0))); + assertTrue(featureSetOf(0).isUpgradableTo(featureSetOf(0, 1, 2))); + assertTrue(featureSetOf(0, 1, 2).isUpgradableTo(featureSetOf(0, 1, 2, 3))); + assertTrue(featureSetOf(0, 1, 2).isUpgradableTo(featureSetOf(2, 3, 4))); + assertTrue(featureSetOf(0, 1, 2).isUpgradableTo(featureSetOf(3, 4, 5))); + assertTrue(featureSetOf(1).isUpgradableTo(featureSetOf(1))); + assertTrue(featureSetOf(2, 3, 4).isUpgradableTo(featureSetOf(2, 3, 4))); + assertTrue(featureSetOf(2, 3, 4).isUpgradableTo(featureSetOf(2, 3, 4, 5, 6))); + assertTrue(featureSetOf(2, 3, 4).isUpgradableTo(featureSetOf(2, 3, 4, 5, 10))); + assertTrue(featureSetOf(0, 10).isUpgradableTo(featureSetOf(0, 1, 2, 10))); + assertTrue(featureSetOf(2, 3, 4, 8, 10).isUpgradableTo(featureSetOf(2, 3, 4, 5, 6, 8, 10))); + assertTrue(featureSetOf(2, 3, 4, 8, 10).isUpgradableTo(featureSetOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 10))); + + assertFalse(featureSetOf(1).isUpgradableTo(featureSetOf(0))); + assertFalse(featureSetOf(0, 1, 2).isUpgradableTo(featureSetOf(4, 5, 6))); + assertFalse(featureSetOf(0, 1, 2, 3).isUpgradableTo(featureSetOf(1, 2))); + assertFalse(featureSetOf(2, 3, 4).isUpgradableTo(featureSetOf(0, 1))); + assertFalse(featureSetOf(2, 3, 4, 10).isUpgradableTo(featureSetOf(2, 3, 4, 5, 6, 11))); + assertFalse(featureSetOf(2, 3, 4, 8, 10).isUpgradableTo(featureSetOf(2, 3, 4, 5, 6, 10))); + } + + /** */ + @Test + public void testDifference() { + assertTrue(featureSetOf(0).difference(featureSetOf(0)).isEmpty()); + assertTrue(featureSetOf(0, 1, 2).difference(featureSetOf(0, 1, 2)).isEmpty()); + assertTrue(featureSetOf(0, 1, 2, 10).difference(featureSetOf(0, 1, 2, 10)).isEmpty()); + assertTrue(featureSetOf(2).difference(featureSetOf(2)).isEmpty()); + assertTrue(featureSetOf(2, 3, 4).difference(featureSetOf(2, 3, 4)).isEmpty()); + assertTrue(featureSetOf(2, 3, 4, 10).difference(featureSetOf(2, 3, 4, 10)).isEmpty()); + + assertEquals(intList(3), featureSetOf(0, 1, 2).difference(featureSetOf(0, 1, 2, 3))); + + assertEquals(intList(3, 4), featureSetOf(0, 1, 2, 10).difference(featureSetOf(0, 1, 2, 3, 4, 10))); + + assertEquals(intList(6, 7, 8), featureSetOf(2, 3, 4, 5).difference(featureSetOf(2, 3, 4, 5, 6, 7, 8))); + + assertEquals(intList(6, 7, 8, 15), featureSetOf(2, 3, 4, 5, 10).difference(featureSetOf(2, 3, 4, 5, 6, 7, 8, 10, 15))); + } + + /** */ + @Test + public void testEqualsIdenticalSets() { + assertTrue(isIdentical(featureSetOf(0, 1, 2), featureSetOf(0, 1, 2))); + assertTrue(isIdentical(featureSetOf(0, 1, 2, 10), featureSetOf(0, 1, 2, 10))); + assertTrue(isIdentical(featureSetOf(1, 2, 3), featureSetOf(1, 2, 3))); + assertTrue(isIdentical(featureSetOf(1, 2, 3, 10), featureSetOf(1, 2, 3, 10))); + + assertFalse(isIdentical(featureSetOf(0, 1, 2), null)); + assertFalse(isIdentical(featureSetOf(0, 1, 2), featureSetOf(0, 1, 2, 3))); + assertFalse(isIdentical(featureSetOf(1, 2, 3), featureSetOf(1, 2, 3, 10))); + assertFalse(isIdentical(featureSetOf(0, 1, 2, 10), featureSetOf(0, 1, 2, 8, 10))); + } + + /** */ + @Test + public void testToString() { + assertEquals("IgniteFeatureSet [2 -> 5]", featureSetOf(2, 3, 4, 5).toString()); + assertEquals("IgniteFeatureSet [2, 8, 10]", featureSetOf(2, 8, 10).toString()); + assertEquals("IgniteFeatureSet [2, 3, 8, 10]", featureSetOf(2, 3, 8, 10).toString()); + assertEquals("IgniteFeatureSet [2 -> 5, 8, 10]", featureSetOf(2, 3, 4, 5, 8, 10).toString()); + } + + /** */ + @Test + public void testBuildInput() { + assertThrows(log, () -> IgniteFeatureSet.buildFrom(Collections.emptyList()), IllegalArgumentException.class, null); + assertThrows(log, () -> IgniteFeatureSet.buildFrom((Class)null), NullPointerException.class, null); + assertThrows(log, () -> IgniteFeatureSet.buildFrom((List)null), NullPointerException.class, null); + } + + /** */ + private IgniteFeatureSet featureSetOf(int... ids) { + List features = new ArrayList<>(); + + for (int id : ids) + features.add(new IgniteCoreFeature(id)); + + return IgniteFeatureSet.buildFrom(features); + } + + /** */ + private void checkFeatureSetElements(List expElements, IgniteFeatureSet featureSet) { + List curElements = new ArrayList<>(); + + Iterator iter = featureSet.iterator(); + + while (iter.hasNext()) + curElements.add(iter.next()); + + assertThrows(log, iter::next, NoSuchElementException.class, null); + + assertEquals(expElements, curElements); + assertTrue(expElements.stream().allMatch(featureSet::contains)); + } + + /** */ + private boolean isIdentical(IgniteFeatureSet lhs, IgniteFeatureSet rhs) { + return lhs.equals(rhs) && lhs.hashCode() == rhs.hashCode(); + } + + /** */ + private static GridIntList intList(int... vals) { + return new GridIntList(vals); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_18_0.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_18_0.java new file mode 100644 index 0000000000000..7f19bd5e9ed91 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_18_0.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_18_0 { + /** */ + public static final IgniteFeature STUB_FEATURE = new IgniteCoreFeature(Integer.MAX_VALUE); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_0.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_0.java new file mode 100644 index 0000000000000..3cb497ee64701 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_0.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_19_0 { + /** */ + public static final IgniteFeature ROLLING_UPGRADE_FEATURE = new IgniteCoreFeature(0); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_1.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_1.java new file mode 100644 index 0000000000000..33fd6ce2710f7 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_1.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_19_1 { + /** */ + public static final IgniteFeature ROLLING_UPGRADE_FEATURE = TestIgniteReleaseFeatures_2_19_0.ROLLING_UPGRADE_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_1_ID_1_FEATURE = new IgniteCoreFeature(1); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_2.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_2.java new file mode 100644 index 0000000000000..cc1775597e44f --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_2.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_19_2 { + /** */ + public static final IgniteFeature ROLLING_UPGRADE_FEATURE = TestIgniteReleaseFeatures_2_19_1.ROLLING_UPGRADE_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_2_ID_1_FEATURE = TestIgniteReleaseFeatures_2_19_1.VER_2_19_1_ID_1_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_2_ID_2_FEATURE = new IgniteCoreFeature(2); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_3.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_3.java new file mode 100644 index 0000000000000..7ede0b867f316 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_19_3.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_19_3 { + /** */ + public static final IgniteFeature ROLLING_UPGRADE_FEATURE = TestIgniteReleaseFeatures_2_19_2.ROLLING_UPGRADE_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_2_ID_1_FEATURE = TestIgniteReleaseFeatures_2_19_2.VER_2_19_2_ID_1_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_2_ID_2_FEATURE = TestIgniteReleaseFeatures_2_19_2.VER_2_19_2_ID_2_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_3_ID_6_FEATURE = TestIgniteReleaseFeatures_2_21_0.VER_2_21_0_ID_6_FEATURE; +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_20_0.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_20_0.java new file mode 100644 index 0000000000000..94719dfd6aabb --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_20_0.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_20_0 { + /** */ + public static final IgniteFeature ROLLING_UPGRADE_FEATURE = TestIgniteReleaseFeatures_2_19_2.ROLLING_UPGRADE_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_2_ID_1_FEATURE = TestIgniteReleaseFeatures_2_19_2.VER_2_19_2_ID_1_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_2_ID_2_FEATURE = TestIgniteReleaseFeatures_2_19_2.VER_2_19_2_ID_2_FEATURE; + + /** */ + public static final IgniteFeature VER_2_20_0_ID_3_FEATURE = new IgniteCoreFeature(3); + + /** */ + public static final IgniteFeature VER_2_20_0_ID_4_FEATURE = new IgniteCoreFeature(4); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_20_1.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_20_1.java new file mode 100644 index 0000000000000..4bb051bb631ab --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_20_1.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_20_1 { + /** */ + public static final IgniteFeature ROLLING_UPGRADE_FEATURE = TestIgniteReleaseFeatures_2_20_0.ROLLING_UPGRADE_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_2_ID_1_FEATURE = TestIgniteReleaseFeatures_2_20_0.VER_2_19_2_ID_1_FEATURE; + + /** */ + public static final IgniteFeature VER_2_19_2_ID_2_FEATURE = TestIgniteReleaseFeatures_2_20_0.VER_2_19_2_ID_2_FEATURE; + + /** */ + public static final IgniteFeature VER_2_20_0_ID_3_FEATURE = TestIgniteReleaseFeatures_2_20_0.VER_2_20_0_ID_3_FEATURE; + + /** */ + public static final IgniteFeature VER_2_20_0_ID_4_FEATURE = TestIgniteReleaseFeatures_2_20_0.VER_2_20_0_ID_4_FEATURE; + + /** */ + public static final IgniteFeature VER_2_20_1_ID_6_FEATURE = new IgniteCoreFeature(6); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_21_0.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_21_0.java new file mode 100644 index 0000000000000..fe6b190119774 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_21_0.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_21_0 { + /** */ + public static final IgniteFeature VER_2_20_0_ID_3_FEATURE = TestIgniteReleaseFeatures_2_20_1.VER_2_20_0_ID_3_FEATURE; + + /** */ + public static final IgniteFeature VER_2_20_0_ID_4_FEATURE = TestIgniteReleaseFeatures_2_20_1.VER_2_20_0_ID_4_FEATURE; + + /** */ + public static final IgniteFeature VER_2_21_0_ID_5_FEATURE = new IgniteCoreFeature(5); + + /** */ + public static final IgniteFeature VER_2_21_0_ID_6_FEATURE = new IgniteCoreFeature(6); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_21_1.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_21_1.java new file mode 100644 index 0000000000000..6ec00046d1b51 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestIgniteReleaseFeatures_2_21_1.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestIgniteReleaseFeatures_2_21_1 { + /** */ + public static final IgniteFeature VER_2_20_0_ID_3_FEATURE = TestIgniteReleaseFeatures_2_21_0.VER_2_20_0_ID_3_FEATURE; + + /** */ + public static final IgniteFeature VER_2_20_0_ID_4_FEATURE = TestIgniteReleaseFeatures_2_21_0.VER_2_20_0_ID_4_FEATURE; + + /** */ + public static final IgniteFeature VER_2_21_0_ID_5_FEATURE = TestIgniteReleaseFeatures_2_21_0.VER_2_21_0_ID_5_FEATURE; + + /** */ + public static final IgniteFeature VER_2_21_0_ID_6_FEATURE = TestIgniteReleaseFeatures_2_21_0.VER_2_21_0_ID_6_FEATURE; + + /** */ + public static final IgniteFeature VER_2_21_1_ID_7_FEATURE = new IgniteCoreFeature(7); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginComponentFeatureSetProvider.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginComponentFeatureSetProvider.java new file mode 100644 index 0000000000000..a15242e4d33e2 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginComponentFeatureSetProvider.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +import java.util.Collection; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.processors.rollingupgrade.AbstractRollingUpgradeTest; +import org.apache.ignite.lang.IgniteProductVersion; + +/** */ +public class TestPluginComponentFeatureSetProvider implements IgniteComponentFeatureSetProvider { + /** */ + private final String pluginVer; + + /** */ + public TestPluginComponentFeatureSetProvider(String pluginVer) { + this.pluginVer = pluginVer; + } + + /** {@inheritDoc} */ + @Override public String componentName() { + return TestPluginFeature.COMPONENT_NAME; + } + + /** {@inheritDoc} */ + @Override public IgniteProductVersion componentVersion() { + return IgniteProductVersion.fromString(pluginVer); + } + + /** {@inheritDoc} */ + @Override public Collection features() { + try { + return AbstractRollingUpgradeTest.readDeclaredPluginFeatures(pluginVer); + } + catch (Exception e) { + throw new IgniteException(e); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginFeature.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginFeature.java new file mode 100644 index 0000000000000..c7527529ca923 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginFeature.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestPluginFeature implements IgniteFeature { + /** */ + public static final String COMPONENT_NAME = "plugin"; + + /** */ + private final int id; + + /** */ + public TestPluginFeature(int id) { + this.id = id; + } + + /** {@inheritDoc} */ + @Override public int id() { + return id; + } + + /** {@inheritDoc} */ + @Override public String componentName() { + return COMPONENT_NAME; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_1_0_0.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_1_0_0.java new file mode 100644 index 0000000000000..65d0521b2e1e3 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_1_0_0.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestPluginReleaseFeatures_1_0_0 { + /** */ + public static final IgniteFeature VER_1_0_0_ID_0_FEATURE = new TestPluginFeature(0); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_2_0_0.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_2_0_0.java new file mode 100644 index 0000000000000..d661f5cff66bc --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_2_0_0.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestPluginReleaseFeatures_2_0_0 { + /** */ + public static final IgniteFeature VER_2_0_0_ID_1_FEATURE = new TestPluginFeature(1); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_3_0_0.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_3_0_0.java new file mode 100644 index 0000000000000..b40cea1590d2b --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rollingupgrade/feature/TestPluginReleaseFeatures_3_0_0.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.rollingupgrade.feature; + +/** */ +public class TestPluginReleaseFeatures_3_0_0 { + /** */ + public static final IgniteFeature VER_3_0_0_ID_2_FEATURE = new TestPluginFeature(2); +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessorTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessorTest.java index 32da11cbc7da6..44a272821bb5f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessorTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessorTest.java @@ -17,21 +17,20 @@ package org.apache.ignite.internal.processors.security; -import java.lang.reflect.Method; import java.util.UUID; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteDiagnosticRequest; import org.apache.ignite.internal.IgniteEx; -import org.apache.ignite.internal.managers.GridManagerAdapter; -import org.apache.ignite.internal.managers.communication.GridIoSecurityAwareMessage; -import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; +import org.apache.ignite.internal.processors.security.impl.TestSecurityContext; +import org.apache.ignite.internal.processors.security.impl.TestSecuritySubject; +import org.apache.ignite.internal.thread.context.Scope; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.ListeningTestLogger; import org.apache.ignite.testframework.LogListener; import org.junit.Test; import static org.apache.ignite.internal.GridTopic.TOPIC_CACHE; -import static org.apache.ignite.internal.managers.communication.GridIoPolicy.PUBLIC_POOL; +import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; /** * Unit test for {@link IgniteSecurityProcessor}. @@ -60,15 +59,8 @@ public class IgniteSecurityProcessorTest extends AbstractSecurityTest { @Test public void testThrowIllegalStateExceptionIfNodeNotFoundInDiscoCache() throws Exception { IgniteEx srv = startGridAllowAll("srv"); - IgniteEx cli = startClientAllowAll("cli"); - Method getSpiMethod = GridManagerAdapter.class.getDeclaredMethod("getSpi"); - - getSpiMethod.setAccessible(true); - - TcpCommunicationSpi spi = (TcpCommunicationSpi)getSpiMethod.invoke(cli.context().io()); - LogListener logPattern = LogListener .matches(s -> s.contains("Failed to obtain a security context.")) .times(1) @@ -76,15 +68,11 @@ public void testThrowIllegalStateExceptionIfNodeNotFoundInDiscoCache() throws Ex listeningLog.registerListener(logPattern); - spi.sendMessage(srv.localNode(), new GridIoSecurityAwareMessage( - UUID.randomUUID(), - PUBLIC_POOL, - TOPIC_CACHE, - new IgniteDiagnosticRequest(), - false, - 0, - false - )); + TestSecurityContext unknownCtx = new TestSecurityContext(new TestSecuritySubject().setId(UUID.randomUUID())); + + try (Scope ignored = cli.context().security().withContext(unknownCtx)) { + cli.context().io().sendToGridTopic(srv.localNode().id(), TOPIC_CACHE, new IgniteDiagnosticRequest(), SYSTEM_POOL); + } GridTestUtils.waitForCondition(logPattern::check, getTestTimeout()); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/NodeSecurityContextPropagationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/NodeSecurityContextPropagationTest.java index 8619509d5cd34..c0a4a503c7179 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/NodeSecurityContextPropagationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/NodeSecurityContextPropagationTest.java @@ -20,14 +20,10 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; -import java.util.Iterator; import java.util.Objects; import java.util.UUID; -import java.util.concurrent.BlockingDeque; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import java.util.function.Predicate; -import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; @@ -37,22 +33,20 @@ import org.apache.ignite.internal.managers.discovery.SecurityAwareCustomMessageWrapper; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.spi.MessagesPluginProvider; -import org.apache.ignite.spi.discovery.DiscoverySpi; import org.apache.ignite.spi.discovery.DiscoverySpiCustomMessage; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.TestBlockingTcpDiscoverySpi; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryAbstractMessage; import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCustomEventMessage; import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessage; import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeLeftMessage; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.junit.Test; import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IGNITE_INSTANCE_NAME; import static org.apache.ignite.internal.events.DiscoveryCustomEvent.EVT_DISCOVERY_CUSTOM_EVT; +import static org.apache.ignite.spi.discovery.tcp.TestBlockingTcpDiscoverySpi.blockingDiscovery; import static org.apache.ignite.testframework.GridTestUtils.runAsync; import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; @@ -81,9 +75,8 @@ public class NodeSecurityContextPropagationTest extends GridCommonAbstractTest { .setMaxSize(100L * 1024 * 1024))) .setAuthenticationEnabled(true); - ((TcpDiscoverySpi)cfg.getDiscoverySpi()) - .setIpFinder(new TcpDiscoveryVmIpFinder() - .setAddresses(Collections.singleton("127.0.0.1:47500"))); + cfg.setDiscoverySpi(new TestBlockingTcpDiscoverySpi(new TcpDiscoveryVmIpFinder() + .setAddresses(Collections.singleton("127.0.0.1:47500")))); cfg.setPluginProviders(new MessagesPluginProvider(TestDiscoveryMessage.class, TestDiscoveryAcknowledgeMessage.class)); @@ -104,15 +97,6 @@ public class NodeSecurityContextPropagationTest extends GridCommonAbstractTest { cleanPersistenceDir(); } - /** {@inheritDoc} */ - @Override protected IgniteEx startGrid(int idx) throws Exception { - IgniteEx ignite = super.startGrid(idx); - - wrapRingMessageWorkerQueue(ignite); - - return ignite; - } - /** */ @Test public void testProcessCustomDiscoveryMessageFromLeftNode() throws Exception { @@ -133,12 +117,7 @@ public void testProcessCustomDiscoveryMessageFromLeftNode() throws Exception { EVT_NODE_LEFT ); - discoveryRingMessageWorkerQueue(srv).block(); - - long pollingTimeout = U.field(discoveryRingMessageWorker(srv), "pollingTimeout"); - - // We need to wait for any active BlockingDeque#poll operation to complete. - U.sleep(5 * pollingTimeout); + blockingDiscovery(srv).block(); cli.context().discovery().sendCustomEvent(new TestDiscoveryMessage()); @@ -158,7 +137,7 @@ public void testProcessCustomDiscoveryMessageFromLeftNode() throws Exception { waitForCondition(() -> anyReceivedMessageMatch(srv, msg -> isDiscoveryNodeAddedMessage(msg, 3)), getTestTimeout()); - discoveryRingMessageWorkerQueue(srv).unblock(); + blockingDiscovery(srv).unblock(); waitForCondition( () -> grid(0).cluster().nodes().size() == 4 @@ -173,14 +152,9 @@ private boolean isDiscoveryNodeAddedMessage(Object msg, int joiningNdeIdx) { ((TcpDiscoveryNodeAddedMessage)msg).node().attribute(ATTR_IGNITE_INSTANCE_NAME)); } - /** */ - private BlockingDequeWrapper discoveryRingMessageWorkerQueue(IgniteEx ignite) { - return U.field(discoveryRingMessageWorker(ignite), "queue"); - } - /** */ private boolean anyReceivedMessageMatch(IgniteEx ignite, Predicate predicate) { - for (TcpDiscoveryAbstractMessage msg : discoveryRingMessageWorkerQueue(ignite)) { + for (TcpDiscoveryAbstractMessage msg : blockingDiscovery(ignite).messageQueue()) { Object unwrappedMsg = msg; if (msg instanceof TcpDiscoveryCustomEventMessage) { @@ -197,298 +171,4 @@ private boolean anyReceivedMessageMatch(IgniteEx ignite, Predicate predi return false; } - - /** */ - private void wrapRingMessageWorkerQueue(IgniteEx ignite) throws Exception { - Object discoMsgWorker = discoveryRingMessageWorker(ignite); - - BlockingDeque queue = U.field(discoMsgWorker, "queue"); - - BlockingDequeWrapper wrapper = new BlockingDequeWrapper<>(queue); - - FieldUtils.writeField(discoMsgWorker, "queue", wrapper, true); - } - - /** */ - private Object discoveryRingMessageWorker(IgniteEx ignite) { - DiscoverySpi[] discoverySpis = U.field(ignite.context().discovery(), "spis"); - - Object impl = U.field(discoverySpis[0], "impl"); - - return U.field(impl, "msgWorker"); - } - - /** */ - public static class BlockingDequeWrapper implements BlockingDeque { - /** */ - private volatile boolean isBlocked; - - /** */ - private final BlockingDeque delegate; - - /** */ - public BlockingDequeWrapper(BlockingDeque delegate) { - this.delegate = delegate; - } - - /** */ - public void block() { - isBlocked = true; - } - - /** */ - public void unblock() { - isBlocked = false; - } - - /** {@inheritDoc} */ - @Override public T poll(long timeout, TimeUnit unit) throws InterruptedException { - return isBlocked ? null : delegate.poll(timeout, unit); - } - - /** {@inheritDoc} */ - @Override public int remainingCapacity() { - return delegate.remainingCapacity(); - } - - /** {@inheritDoc} */ - @NotNull @Override public T element() { - return delegate.element(); - } - - /** {@inheritDoc} */ - @Override public T peek() { - return delegate.peek(); - } - - /** {@inheritDoc} */ - @Override public boolean remove(Object o) { - return delegate.remove(o); - } - - /** {@inheritDoc} */ - @Override public boolean containsAll(@NotNull Collection c) { - return delegate.containsAll(c); - } - - /** {@inheritDoc} */ - @Override public boolean addAll(@NotNull Collection c) { - return delegate.addAll(c); - } - - /** {@inheritDoc} */ - @Override public boolean removeAll(@NotNull Collection c) { - return delegate.removeAll(c); - } - - /** {@inheritDoc} */ - @Override public boolean retainAll(@NotNull Collection c) { - return delegate.retainAll(c); - } - - /** {@inheritDoc} */ - @Override public void clear() { - delegate.clear(); - } - - /** {@inheritDoc} */ - @Override public void addFirst(T t) { - delegate.addFirst(t); - } - - /** {@inheritDoc} */ - @Override public void addLast(@NotNull T t) { - delegate.addLast(t); - } - - /** {@inheritDoc} */ - @Override public boolean offerFirst(@NotNull T t) { - return delegate.offerFirst(t); - } - - /** {@inheritDoc} */ - @Override public boolean offerLast(@NotNull T t) { - return delegate.offerLast(t); - } - - /** {@inheritDoc} */ - @Override public T removeFirst() { - return delegate.removeFirst(); - } - - /** {@inheritDoc} */ - @Override public T removeLast() { - return delegate.removeLast(); - } - - /** {@inheritDoc} */ - @Override public T pollFirst() { - return delegate.pollFirst(); - } - - /** {@inheritDoc} */ - @Override public T pollLast() { - return delegate.pollLast(); - } - - /** {@inheritDoc} */ - @Override public T getFirst() { - return delegate.getFirst(); - } - - /** {@inheritDoc} */ - @Override public T getLast() { - return delegate.getLast(); - } - - /** {@inheritDoc} */ - @Override public T peekFirst() { - return delegate.peekFirst(); - } - - /** {@inheritDoc} */ - @Override public T peekLast() { - return delegate.peekLast(); - } - - /** {@inheritDoc} */ - @Override public void putFirst(@NotNull T t) throws InterruptedException { - delegate.putFirst(t); - } - - /** {@inheritDoc} */ - @Override public void putLast(@NotNull T t) throws InterruptedException { - delegate.putLast(t); - } - - /** {@inheritDoc} */ - @Override public boolean offerFirst(@NotNull T t, long timeout, TimeUnit unit) throws InterruptedException { - return delegate.offerFirst(t, timeout, unit); - } - - /** {@inheritDoc} */ - @Override public boolean offerLast(@NotNull T t, long timeout, TimeUnit unit) throws InterruptedException { - return delegate.offerLast(t, timeout, unit); - } - - /** {@inheritDoc} */ - @NotNull @Override public T takeFirst() throws InterruptedException { - return delegate.takeFirst(); - } - - /** {@inheritDoc} */ - @NotNull @Override public T takeLast() throws InterruptedException { - return delegate.takeLast(); - } - - /** {@inheritDoc} */ - @Nullable @Override public T pollFirst(long timeout, TimeUnit unit) throws InterruptedException { - return delegate.pollFirst(timeout, unit); - } - - /** {@inheritDoc} */ - @Nullable @Override public T pollLast(long timeout, TimeUnit unit) throws InterruptedException { - return delegate.pollLast(timeout, unit); - } - - /** {@inheritDoc} */ - @Override public boolean removeFirstOccurrence(Object o) { - return delegate.removeFirstOccurrence(o); - } - - /** {@inheritDoc} */ - @Override public boolean removeLastOccurrence(Object o) { - return delegate.removeLastOccurrence(o); - } - - /** {@inheritDoc} */ - @Override public boolean add(T t) { - return delegate.add(t); - } - - /** {@inheritDoc} */ - @Override public boolean offer(@NotNull T t) { - return delegate.offer(t); - } - - /** {@inheritDoc} */ - @Override public void put(@NotNull T t) throws InterruptedException { - delegate.put(t); - } - - /** {@inheritDoc} */ - @Override public boolean offer(@NotNull T t, long timeout, TimeUnit unit) throws InterruptedException { - return delegate.offer(t, timeout, unit); - } - - /** {@inheritDoc} */ - @NotNull @Override public T remove() { - return delegate.remove(); - } - - /** {@inheritDoc} */ - @Override public T poll() { - return delegate.poll(); - } - - /** {@inheritDoc} */ - @NotNull @Override public T take() throws InterruptedException { - return delegate.take(); - } - - /** {@inheritDoc} */ - @Override public boolean contains(Object o) { - return delegate.contains(o); - } - - /** {@inheritDoc} */ - @Override public int drainTo(@NotNull Collection c) { - return delegate.drainTo(c); - } - - /** {@inheritDoc} */ - @Override public int drainTo(@NotNull Collection c, int maxElements) { - return delegate.drainTo(c, maxElements); - } - - /** {@inheritDoc} */ - @Override public int size() { - return delegate.size(); - } - - /** {@inheritDoc} */ - @Override public boolean isEmpty() { - return delegate.isEmpty(); - } - - /** {@inheritDoc} */ - @Override public Iterator iterator() { - return delegate.iterator(); - } - - /** {@inheritDoc} */ - @NotNull @Override public Object[] toArray() { - return delegate.toArray(); - } - - /** {@inheritDoc} */ - @NotNull @Override public T1[] toArray(@NotNull T1[] a) { - return delegate.toArray(a); - } - - /** {@inheritDoc} */ - @NotNull @Override public Iterator descendingIterator() { - return delegate.descendingIterator(); - } - - /** {@inheritDoc} */ - @Override public void push(@NotNull T t) { - delegate.push(t); - } - - /** {@inheritDoc} */ - @Override public T pop() { - return delegate.pop(); - } - } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java index 9de906b27290c..8255437422b9e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/thread/context/OperationContextAttributesTest.java @@ -17,13 +17,17 @@ package org.apache.ignite.internal.thread.context; +import java.net.InetAddress; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Set; +import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Delayed; import java.util.concurrent.ExecutorService; @@ -35,9 +39,20 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import org.apache.ignite.Ignite; import org.apache.ignite.IgniteException; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.GridTopic; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.managers.communication.GridIoPolicy; +import org.apache.ignite.internal.managers.communication.GridMessageListener; +import org.apache.ignite.internal.managers.communication.IgniteIoTestMessage; +import org.apache.ignite.internal.managers.discovery.CustomEventListener; +import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; +import org.apache.ignite.internal.processors.cache.DynamicCacheChangeBatch; import org.apache.ignite.internal.processors.timeout.GridTimeoutObject; import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor; import org.apache.ignite.internal.thread.context.concurrent.IgniteCompletableFuture; @@ -47,7 +62,10 @@ import org.apache.ignite.internal.thread.pool.IgniteStripedExecutor; import org.apache.ignite.internal.thread.pool.IgniteStripedThreadPoolExecutor; import org.apache.ignite.internal.thread.pool.IgniteThreadPoolExecutor; +import org.apache.ignite.internal.util.GridByteArrayList; +import org.apache.ignite.internal.util.GridIntList; import org.apache.ignite.internal.util.future.GridFutureAdapter; +import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.internal.util.worker.queue.IgniteAsyncObjectHandler; import org.apache.ignite.internal.util.worker.queue.IgniteDelayedObjectHandler; @@ -56,14 +74,21 @@ import org.apache.ignite.lang.IgniteOutClosure; import org.apache.ignite.lang.IgniteRunnable; import org.apache.ignite.lang.IgniteUuid; +import org.apache.ignite.plugin.AbstractTestPluginProvider; +import org.apache.ignite.plugin.PluginContext; +import org.apache.ignite.plugin.PluginProvider; +import org.apache.ignite.spi.discovery.tcp.messages.InetSocketAddressMessage; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.thread.IgniteThread; import org.junit.Test; import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.apache.ignite.testframework.GridTestUtils.assertThrows; import static org.apache.ignite.testframework.GridTestUtils.assertThrowsAnyCause; import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause; +import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; /** */ public class OperationContextAttributesTest extends GridCommonAbstractTest { @@ -85,6 +110,9 @@ public class OperationContextAttributesTest extends GridCommonAbstractTest { /** */ private int beforeTestReservedAttrIds; + /** */ + private @Nullable PluginProvider pluginProvider; + /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { super.beforeTest(); @@ -98,6 +126,8 @@ public class OperationContextAttributesTest extends GridCommonAbstractTest { @Override protected void afterTest() throws Exception { super.afterTest(); + stopAllGrids(); + if (poolToShutdownAfterTest != null) poolToShutdownAfterTest.shutdownNow(); @@ -105,6 +135,16 @@ public class OperationContextAttributesTest extends GridCommonAbstractTest { OperationContextAttribute.ID_GEN.set(beforeTestReservedAttrIds); } + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + if (pluginProvider != null) + cfg.setPluginProviders(pluginProvider); + + return cfg; + } + /** */ @Test public void testNotAttachedAttribute() { @@ -808,6 +848,209 @@ public void testContextAwareDelayQueue() throws Exception { } } + /** */ + @Test + public void testSendAttributesByDiscovery() throws Exception { + doTestOperationContextAttributesPropagation(true); + } + + /** */ + @Test + public void testSendAttributesByCommunication() throws Exception { + doTestOperationContextAttributesPropagation(false); + } + + /** */ + private void doTestOperationContextAttributesPropagation(boolean discovery) throws Exception { + OperationContextAttribute dAttr1 = + OperationContextAttribute.newInstance(new InetSocketAddressMessage(InetAddress.getLoopbackAddress(), 80)); + + OperationContextAttribute dAttr2 = OperationContextAttribute.newInstance(new GridIntList(new int[]{1, 1, 1})); + + OperationContextAttribute otherTestAttr = OperationContextAttribute.newInstance(new GridByteArrayList()); + + pluginProvider = new AbstractTestPluginProvider() { + @Override public String name() { + return "TestDistributedOperationContextAttributesRegistrator"; + } + + @Override public void start(PluginContext ctx) { + GridKernalContext kctx = ((IgniteEx)ctx.grid()).context(); + + int dAttr1Id = OperationContextDispatcher.MAX_ATTRS_CNT - 2; + int dAttr2Id = OperationContextDispatcher.MAX_ATTRS_CNT - 1; + + kctx.operationContextDispatcher().registerDistributedAttribute(dAttr1Id, dAttr1); + kctx.operationContextDispatcher().registerDistributedAttribute(dAttr2Id, dAttr2); + + assertThrowsAnyCause( + log, + () -> { + kctx.operationContextDispatcher().registerDistributedAttribute(dAttr2Id, otherTestAttr); + return null; + + }, IgniteException.class, + "Duplicated distributed attribute id" + ); + } + }; + + // Local attribute 1. + OperationContextAttribute.newInstance(1000); + + startGrids(2); + startClientGrid(2); + + assertThrows( + null, + () -> grid(0).context().operationContextDispatcher().registerDistributedAttribute(1, null), + IgniteException.class, + "Initialization of distributed operation context attributes has already finished" + ); + + // Local attribute 2. + OperationContextAttribute.newInstance("locaAttr2"); + + InetSocketAddressMessage valToSend1 = new InetSocketAddressMessage(dAttr1.initialValue().address(), 443); + GridIntList valToSend2 = new GridIntList(new int[]{2, 2, 2}); + + if (discovery) + doTestOperationContextAttributesPropagationThroughDiscovery(dAttr1, valToSend1, dAttr2, valToSend2); + else + doTestOperationContextAttributesPropagationThroughCommunication(dAttr1, valToSend1, dAttr2, valToSend2); + } + + /** */ + private void doTestOperationContextAttributesPropagationThroughDiscovery( + OperationContextAttribute dAttr1, + InetSocketAddressMessage valToSend1, + OperationContextAttribute dAttr2, + GridIntList valToSend2 + ) throws Exception { + Set checkedNodes = ConcurrentHashMap.newKeySet(); + + for (int i = 0; i < G.allGrids().size(); ++i) { + int i0 = i; + + grid(i).context().discovery().setCustomEventListener( + DynamicCacheChangeBatch.class, new CustomEventListener<>() { + @Override public void onCustomEvent(AffinityTopologyVersion topVer, ClusterNode snd, + DynamicCacheChangeBatch msg) { + + InetSocketAddressMessage receivedVal1 = OperationContext.get(dAttr1); + GridIntList receivedVal2 = OperationContext.get(dAttr2); + + assertTrue(receivedVal1 != null && valToSend1.port() == receivedVal1.port()); + assertTrue(receivedVal1 != null && valToSend1.address().equals(receivedVal1.address())); + + assertEquals(valToSend2, receivedVal2); + + checkedNodes.add(i0); + } + }); + } + + // Send from the coordinator. + try (Scope ignored = OperationContext.set(dAttr1, valToSend1, dAttr2, valToSend2)) { + grid(0).createCache(defaultCacheConfiguration()); + } + + assertTrue(waitForCondition(() -> checkedNodes.size() == 3, getTestTimeout(), 50)); + checkedNodes.clear(); + + // Send from a server. + try (Scope ignored = OperationContext.set(dAttr1, valToSend1, dAttr2, valToSend2)) { + grid(1).destroyCache(DEFAULT_CACHE_NAME); + } + + assertTrue(waitForCondition(() -> checkedNodes.size() == 3, getTestTimeout(), 50)); + checkedNodes.clear(); + + // Send from a client. + try (Scope ignored = OperationContext.set(dAttr1, valToSend1, dAttr2, valToSend2)) { + grid(2).createCache(defaultCacheConfiguration()); + } + + assertTrue(waitForCondition(() -> checkedNodes.size() == 3, getTestTimeout(), 50)); + checkedNodes.clear(); + } + + /** */ + private void doTestOperationContextAttributesPropagationThroughCommunication( + OperationContextAttribute dAttr1, + InetSocketAddressMessage valToSend1, + OperationContextAttribute dAttr2, + GridIntList valToSend2 + ) throws Exception { + // Coordinator -> Server, Coordinator -> Client, Server -> Client, Client -> Server, etc. + for (int fromIdx = 0; fromIdx < 3; ++fromIdx) { + for (int toIdx = 0; toIdx < 3; ++toIdx) { + if (fromIdx == toIdx) + continue; + + // One value. + try (Scope ignored = OperationContext.set(dAttr1, valToSend1)) { + checkOperationContextCommunicationTransmission(fromIdx, toIdx, dAttr1, null); + } + + // A couple of values. + try (Scope ignored = OperationContext.set(dAttr1, valToSend1, dAttr2, valToSend2)) { + checkOperationContextCommunicationTransmission(fromIdx, toIdx, dAttr1, dAttr2); + } + } + } + } + + /** */ + private void checkOperationContextCommunicationTransmission( + int gridFromIdx, + int gridToIdx, + OperationContextAttribute attr1, + @Nullable OperationContextAttribute attr2 + ) throws Exception { + IgniteEx from = grid(gridFromIdx); + IgniteEx to = grid(gridToIdx); + + CountDownLatch rcvLatch = new CountDownLatch(2); + + InetSocketAddressMessage expVal1 = OperationContext.get(attr1); + GridIntList expVal2 = attr2 == null ? null : OperationContext.get(attr2); + + GridMessageListener lsnr = new GridMessageListener() { + @Override public void onMessage(UUID nodeId, Object msg, byte plc) { + if (msg instanceof IgniteIoTestMessage && ((IgniteIoTestMessage)msg).request()) { + InetSocketAddressMessage receivedVal1 = OperationContext.get(attr1); + GridIntList receivedVal2 = attr2 == null ? null : OperationContext.get(attr2); + + assertTrue(receivedVal1 != null && expVal1.port() == receivedVal1.port()); + assertTrue(receivedVal1 != null && expVal1.address().equals(receivedVal1.address())); + + if (attr2 != null) + assertEquals(expVal2, receivedVal2); + + rcvLatch.countDown(); + } + } + }; + + to.context().io().addMessageListener(GridTopic.TOPIC_IO_TEST, lsnr); + + try { + from.context().io().sendIoTest(node(from, to), null, false); + from.context().io().sendIoTest(node(from, to), null, true); + + assertTrue(rcvLatch.await(getTestTimeout(), MILLISECONDS)); + } + finally { + assertTrue(to.context().io().removeMessageListener(GridTopic.TOPIC_IO_TEST, lsnr)); + } + } + + /** Prevents {@link ClusterNode#isLocal()} to be negative. */ + private ClusterNode node(Ignite from, Ignite to) { + return from.cluster().node(((IgniteEx)to).localNode().id()); + } + /** */ private void doContextAwareExecutorServiceTest(ExecutorService pool) throws Exception { CountDownLatch poolUnblockedLatch = blockPool(pool); @@ -923,9 +1166,8 @@ public AttributeValueChecker(String expStrAttrVal, Integer expIntAttrVal) { /** */ static void assertAllCreatedChecksPassed() throws Exception { - for (AttributeValueChecker check : CHECKS) { + for (AttributeValueChecker check : CHECKS) check.get(5_000, MILLISECONDS); - } } /** */ diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessClientAwaitTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessClientAwaitTest.java index bfbc4128accc0..f0d57b48a1993 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessClientAwaitTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessClientAwaitTest.java @@ -204,7 +204,7 @@ public TestDistributedProcess( super( ctx, TEST_PROCESS, - (req) -> new GridFinishedFuture<>(), + (uuid, req) -> new GridFinishedFuture<>(), (uuid, res, err) -> { try { assertEquals(expNodeIdsRes, res.keySet()); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessCoordinatorLeftTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessCoordinatorLeftTest.java index 19d3c1621cbee..6c78ad7f53b2b 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessCoordinatorLeftTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessCoordinatorLeftTest.java @@ -118,7 +118,7 @@ public void testCoordinatorFailed() throws Exception { for (Ignite grid : G.allGrids()) { DistributedProcess dp = new DistributedProcess<>(((IgniteEx)grid).context(), TEST_PROCESS, - req -> { + (uuid, req) -> { IgniteInternalFuture fut = runAsync(() -> { try { nodeLeftLatch.await(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessErrorHandlingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessErrorHandlingTest.java index 6ffb7cc7988a6..d80cd9884efb6 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessErrorHandlingTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/util/distributed/DistributedProcessErrorHandlingTest.java @@ -80,7 +80,7 @@ public static Iterable params() { public void testBackgroundExecFailureHandled() throws Exception { checkDistributedProcess((ign, latch) -> new DistributedProcess<>(ign.context(), TEST_PROCESS, - req -> runAsync(() -> { + (id, req) -> runAsync(() -> { failOnNode(ign); // Fails processing request in a spawned thread. return null; @@ -103,7 +103,7 @@ public void testBackgroundExecFailureHandled() throws Exception { public void testExecFailureHandled() throws Exception { checkDistributedProcess((ign, latch) -> new DistributedProcess<>(ign.context(), TEST_PROCESS, - req -> { + (id, req) -> { failOnNode(ign); // Fails processing request in the discovery thread. return new GridFinishedFuture<>(); @@ -126,7 +126,7 @@ public void testExecFailureHandled() throws Exception { public void testFinishFailureHandled() throws Exception { checkDistributedProcess((ign, latch) -> new DistributedProcess<>(ign.context(), TEST_PROCESS, - req -> new GridFinishedFuture<>(), + (uuid, req) -> new GridFinishedFuture<>(), (uuid, res, err) -> { assertEquals(SRV_NODES, res.values().size()); latch.countDown(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSslSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSslSelfTest.java index 79bc9f0ef82e7..9b2199f213e94 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSslSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSslSelfTest.java @@ -71,7 +71,7 @@ public class GridNioSslSelfTest extends GridNioSelfTest { .sendQueueLimit(0) .filters( new GridNioCodecFilter(parser, log, false), - new GridNioSslFilter(sslCtx, true, ByteOrder.nativeOrder(), log, null)); + new GridNioSslFilter(sslCtx, true, ByteOrder.nativeOrder(), log, null, null)); } /** {@inheritDoc} */ diff --git a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PJobClassLoaderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PJobClassLoaderSelfTest.java index b2e0ba1a384af..91e47ba1059f0 100644 --- a/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PJobClassLoaderSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/p2p/GridP2PJobClassLoaderSelfTest.java @@ -134,8 +134,8 @@ public static class Task extends ComputeTaskSplitAdapter { return Collections.singletonList(new ComputeJobAdapter() { /** {@inheritDoc} */ - @Override @SuppressWarnings({"ObjectEquality"}) - public Serializable execute() { + @SuppressWarnings({"ObjectEquality"}) + @Override public Serializable execute() { assert getClass().getClassLoader() == ldr; return null; diff --git a/modules/core/src/test/java/org/apache/ignite/session/GridSessionSetFutureAttributeWaitListenerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/session/GridSessionSetFutureAttributeWaitListenerSelfTest.java index 298b66884d088..be9e7b63e0a8b 100644 --- a/modules/core/src/test/java/org/apache/ignite/session/GridSessionSetFutureAttributeWaitListenerSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/session/GridSessionSetFutureAttributeWaitListenerSelfTest.java @@ -158,8 +158,8 @@ public static class GridTaskSessionTestTask extends ComputeTaskSplitAdapter> simulatedPrevNodeAddr = new AtomicReference<>(); /** {@inheritDoc} */ - @Override protected void initializeImpl() { - if (impl != null) - return; - - super.initializeImpl(); - - // To make the test stable, we want a loopback paddress of the previous node responds first. + @Override TcpDiscoveryImpl createServerTcpDiscoveryImplementation() { + // To make the test stable, we want a loopback address of the previous node responds first. // We don't need a concurrent ping execution. - if (impl instanceof ServerImpl) - impl = new ServerImpl(this, 1, DFLT_RMT_DC_PING_POOL_SIZE); + return new ServerImpl(this, 1, DFLT_RMT_DC_PING_POOL_SIZE); } /** */ diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java index bdd67ce404f5c..503d1198e5faa 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryPendingMessageDeliveryTest.java @@ -238,26 +238,17 @@ private void sendDummyCustomMessage(TcpDiscoverySpi disco) { /** {@link TcpDiscoverySpi} which doesn't itsring to current DC. */ private class NoRingClosingTcpDiscoverySpi extends TestTcpDiscoverySpi { /** {@inheritDoc} */ - @Override protected void initializeImpl() { - if (impl != null) - return; - - super.initializeImpl(); - - // In theory, might be a ClientImpl. - if (impl instanceof ServerImpl) { - impl = new ServerImpl(this, DFLT_UTLITY_POOL_SIZE, 0) { - @Override protected ServerImpl.RingMessageWorker createMessageWorker() { - return new ServerImpl.RingMessageWorker(impl.log) { - @Override protected ServerImpl.CrossRingMessageSendState createConnectionRecoveryState( - TcpDiscoveryNode n) { - // Do not start remote DC ping. - return new ServerImpl.CrossRingMessageSendState(); - } - }; - } - }; - } + @Override TcpDiscoveryImpl createServerTcpDiscoveryImplementation() { + return new ServerImpl(this, DFLT_UTLITY_POOL_SIZE, 0) { + @Override protected ServerImpl.RingMessageWorker createMessageWorker() { + return new ServerImpl.RingMessageWorker(log) { + @Override protected ServerImpl.CrossRingMessageSendState createConnectionRecoveryState(TcpDiscoveryNode n) { + // Do not start remote DC ping. + return new ServerImpl.CrossRingMessageSendState(); + } + }; + } + }; } } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java index ad98a2936b98f..4920d029538a6 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java @@ -58,6 +58,8 @@ import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage; import org.apache.ignite.internal.processors.continuous.StartRoutineAckDiscoveryMessage; +import org.apache.ignite.internal.processors.marshaller.MappedName; +import org.apache.ignite.internal.processors.marshaller.MarshallerDataBagItem; import org.apache.ignite.internal.processors.port.GridPortRecord; import org.apache.ignite.internal.util.GridConcurrentHashSet; import org.apache.ignite.internal.util.lang.GridAbsPredicate; @@ -2431,7 +2433,7 @@ private static class TestTcpDiscoveryMarshallerDataSpi extends TcpDiscoverySpi { DiscoveryDataBag bag = exchange.collect(dataBag); if (bag.commonData().containsKey(MARSHALLER_PROC.ordinal())) - marshalledItems = getJavaMappings(getAllMappings(dataBag)).size(); + marshalledItems = getJavaMappings(marshallerDataBagItem(dataBag)).size(); return bag; } @@ -2440,12 +2442,12 @@ private static class TestTcpDiscoveryMarshallerDataSpi extends TcpDiscoverySpi { exchange.onExchange(dataBag); } - private List getAllMappings(DiscoveryDataBag bag) { - return (List)bag.commonData().get(MARSHALLER_PROC.ordinal()); + private MarshallerDataBagItem marshallerDataBagItem(DiscoveryDataBag bag) { + return (MarshallerDataBagItem)bag.commonData().get(MARSHALLER_PROC.ordinal()); } - private Map getJavaMappings(List allMappings) { - return (Map)allMappings.get(JAVA_ID); + private Map getJavaMappings(MarshallerDataBagItem marshallerDataBagItem) { + return marshallerDataBagItem.mappings().get(JAVA_ID); } }); } diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestBlockingTcpDiscoverySpi.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestBlockingTcpDiscoverySpi.java new file mode 100644 index 0000000000000..834191722f6a0 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TestBlockingTcpDiscoverySpi.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.spi.discovery.tcp; + +import java.util.concurrent.BlockingDeque; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import org.apache.ignite.Ignite; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; +import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryAbstractMessage; +import org.jspecify.annotations.NonNull; + +/** */ +public class TestBlockingTcpDiscoverySpi extends TestTcpDiscoverySpi { + /** */ + private final BlockingDeque msgQueue = new TestBlockingLinkedDeque(); + + /** */ + private volatile boolean isBlocked; + + /** */ + private volatile Predicate msgFilter; + + /** */ + public TestBlockingTcpDiscoverySpi(TcpDiscoveryIpFinder ipFinder) { + setIpFinder(ipFinder); + } + + /** */ + public TestBlockingTcpDiscoverySpi(IgniteConfiguration cfg) { + this(((TcpDiscoverySpi)cfg.getDiscoverySpi()).getIpFinder()); + } + + /** {@inheritDoc} */ + @Override TcpDiscoveryImpl createServerTcpDiscoveryImplementation() { + return new ServerImpl(this, DFLT_UTLITY_POOL_SIZE, DFLT_RMT_DC_PING_POOL_SIZE) { + @Override protected ServerImpl.RingMessageWorker createMessageWorker() { + return new RingMessageWorker(log, msgQueue); + } + }; + } + + /** */ + public void block() { + isBlocked = true; + } + + /** */ + public void unblock() { + isBlocked = false; + } + + /** */ + public void messageFilter(Predicate msgFilter) { + this.msgFilter = msgFilter; + } + + /** */ + public BlockingDeque messageQueue() { + return msgQueue; + } + + /** */ + public static TestBlockingTcpDiscoverySpi blockingDiscovery(Ignite node) { + assert !node.configuration().isClientMode(); + + return (TestBlockingTcpDiscoverySpi)node.configuration().getDiscoverySpi(); + } + + /** */ + private class TestBlockingLinkedDeque extends LinkedBlockingDeque { + /** {@inheritDoc} */ + @Override public TcpDiscoveryAbstractMessage poll(long timeout, TimeUnit unit) throws InterruptedException { + if (isBlocked) + return null; + + TcpDiscoveryAbstractMessage msg = super.poll(timeout, unit); + + if (isBlocked && msg != null) { + // Since this queue is processed by a single thread, it is safe to simply put the element back. + super.addFirst(msg); + + return null; + } + + return msg; + } + + /** {@inheritDoc} */ + @Override public void addFirst(@NonNull TcpDiscoveryAbstractMessage t) { + if (msgFilter != null && msgFilter.test(t)) + return; + + super.addFirst(t); + } + + /** {@inheritDoc} */ + @Override public boolean add(@NonNull TcpDiscoveryAbstractMessage t) { + if (msgFilter != null && msgFilter.test(t)) + return true; + + return super.add(t); + } + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java index 152b209a533a7..a37e758c414ee 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java @@ -480,7 +480,7 @@ public IgniteMock(String name, String locHost, UUID nodeId, Marshaller marshalle bcfg.getTypeConfigurations(), CU.affinityFields(configuration()), bcfg.isCompactFooter(), - CU::affinityFieldName, + BinaryUtils::affinityFieldName, NullLogger.INSTANCE ) { @Override public int typeId(String typeName) { diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java index 8fef6371974c9..6432a528b3918 100755 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java @@ -2469,8 +2469,8 @@ protected void assertCountersSame(int partId, boolean withReserveCntr, String ca List> cntrMap = G.allGrids().stream().filter(ignite -> !ignite.configuration().isClientMode()).map(ignite -> - new T3<>(ignite.name(), counter(partId, cacheName, ignite.name()), - ignite.affinity(cacheName).isPrimary(ignite.cluster().localNode(), partId))).collect(toList()); + new T3<>(ignite.name(), counter(partId, cacheName, ignite.name()), + ignite.affinity(cacheName).isPrimary(ignite.cluster().localNode(), partId))).collect(toList()); for (T3 cntr : cntrMap) { if (cntr.get2() == null) @@ -2502,8 +2502,8 @@ protected void assertCountersAsExpected(int partId, boolean withReserveCntr, Str long reserved) throws AssertionFailedError { List> cntrMap = G.allGrids().stream().filter(ignite -> !ignite.configuration().isClientMode()).map(ignite -> - new T3<>(ignite.name(), counter(partId, cacheName, ignite.name()), - ignite.affinity(cacheName).isPrimary(ignite.cluster().localNode(), partId))).collect(toList()); + new T3<>(ignite.name(), counter(partId, cacheName, ignite.name()), + ignite.affinity(cacheName).isPrimary(ignite.cluster().localNode(), partId))).collect(toList()); for (T3 cntr : cntrMap) { if (cntr.get2() == null) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java index 40140614e7bf5..a36175a09ebac 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java @@ -28,7 +28,6 @@ import org.apache.ignite.internal.GridNodeMetricsLogSelfTest; import org.apache.ignite.internal.GridProjectionForCachesSelfTest; import org.apache.ignite.internal.GridReduceSelfTest; -import org.apache.ignite.internal.GridReleaseTypeSelfTest; import org.apache.ignite.internal.GridSelfTest; import org.apache.ignite.internal.GridStartStopSelfTest; import org.apache.ignite.internal.GridStopWithCancelSelfTest; @@ -64,6 +63,9 @@ import org.apache.ignite.internal.processors.odbc.OdbcConfigurationValidationSelfTest; import org.apache.ignite.internal.processors.odbc.OdbcEscapeSequenceSelfTest; import org.apache.ignite.internal.processors.odbc.SqlListenerUtilsTest; +import org.apache.ignite.internal.processors.rollingupgrade.CoreVersionRollingUpgradeTest; +import org.apache.ignite.internal.processors.rollingupgrade.PluginVersionRollingUpgradeTest; +import org.apache.ignite.internal.processors.rollingupgrade.feature.IgniteFeatureSetTest; import org.apache.ignite.internal.product.GridProductVersionSelfTest; import org.apache.ignite.internal.util.nio.IgniteExceptionInNioWorkerSelfTest; import org.apache.ignite.messaging.GridMessagingNoPeerClassLoadingSelfTest; @@ -104,7 +106,8 @@ GridMessagingSelfTest.class, GridMessagingNoPeerClassLoadingSelfTest.class, - GridReleaseTypeSelfTest.class, + CoreVersionRollingUpgradeTest.class, + PluginVersionRollingUpgradeTest.class, GridProductVersionSelfTest.class, GridAffinityAssignmentV2Test.class, GridAffinityAssignmentV2TestNoOptimizations.class, @@ -157,6 +160,8 @@ MessageFactoryMarshallerInitializationTest.class, LogEvictionResultsTest.class, + + IgniteFeatureSetTest.class, }) public class IgniteBasicTestSuite { } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheConsistencySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheConsistencySelfTestSuite.java index 82bd4b8785efe..cd68f2c9dc771 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheConsistencySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheConsistencySelfTestSuite.java @@ -18,14 +18,11 @@ package org.apache.ignite.testsuites; import org.apache.ignite.internal.processors.cache.consistency.inmem.AtomicReadRepairTest; -import org.apache.ignite.internal.processors.cache.consistency.inmem.ExplicitTransactionalReadRepairTest; import org.apache.ignite.internal.processors.cache.consistency.inmem.ImplicitTransactionalReadRepairTest; import org.apache.ignite.internal.processors.cache.consistency.inmem.ReplicatedExplicitTransactionalReadRepairTest; import org.apache.ignite.internal.processors.cache.consistency.inmem.ReplicatedImplicitTransactionalReadRepairTest; import org.apache.ignite.internal.processors.cache.consistency.inmem.SingleBackupExplicitTransactionalReadRepairTest; -import org.apache.ignite.internal.processors.cache.consistency.inmem.SingleBackupImplicitTransactionalReadRepairTest; import org.apache.ignite.internal.processors.cache.consistency.persistence.PdsAtomicReadRepairTest; -import org.apache.ignite.internal.processors.cache.consistency.persistence.PdsExplicitTransactionalReadRepairTest; import org.apache.ignite.internal.processors.cache.consistency.persistence.PdsImplicitTransactionalReadRepairTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -37,19 +34,16 @@ @Suite.SuiteClasses({ // Inmem AtomicReadRepairTest.class, - ExplicitTransactionalReadRepairTest.class, ImplicitTransactionalReadRepairTest.class, // PDS PdsAtomicReadRepairTest.class, - PdsExplicitTransactionalReadRepairTest.class, PdsImplicitTransactionalReadRepairTest.class, // Special (inmem) ReplicatedExplicitTransactionalReadRepairTest.class, ReplicatedImplicitTransactionalReadRepairTest.class, SingleBackupExplicitTransactionalReadRepairTest.class, - SingleBackupImplicitTransactionalReadRepairTest.class, }) public class IgniteCacheConsistencySelfTestSuite { } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheConsistencySelfTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheConsistencySelfTestSuite2.java new file mode 100644 index 0000000000000..9cac11a4ee4ba --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheConsistencySelfTestSuite2.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import org.apache.ignite.internal.processors.cache.consistency.inmem.ExplicitTransactionalReadRepairTest; +import org.apache.ignite.internal.processors.cache.consistency.inmem.SingleBackupImplicitTransactionalReadRepairTest; +import org.apache.ignite.internal.processors.cache.consistency.persistence.PdsExplicitTransactionalReadRepairTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Split off from {@link IgniteCacheConsistencySelfTestSuite} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + ExplicitTransactionalReadRepairTest.class, + PdsExplicitTransactionalReadRepairTest.class, + SingleBackupImplicitTransactionalReadRepairTest.class, +}) +public class IgniteCacheConsistencySelfTestSuite2 { +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java index dc7ab1d77655c..84a12b092f887 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite.java @@ -17,77 +17,43 @@ package org.apache.ignite.testsuites; -import org.apache.ignite.internal.processors.cache.AtomicCacheAffinityConfigurationTest; import org.apache.ignite.internal.processors.cache.datastructures.GridCacheQueueCleanupSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.GridCacheQueueClientDisconnectTest; import org.apache.ignite.internal.processors.cache.datastructures.GridCacheQueueMultiNodeConsistencySelfTest; import org.apache.ignite.internal.processors.cache.datastructures.IgniteAtomicLongClusterReadOnlyTest; import org.apache.ignite.internal.processors.cache.datastructures.IgniteAtomicReferenceClusterReadOnlyTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteAtomicSequenceClusterReadOnlyTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteAtomicStampedClusterReadOnlyTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteClientDataStructuresTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteCountDownLatchClusterReadOnlyTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteDataStructureUniqueNameTest; import org.apache.ignite.internal.processors.cache.datastructures.IgniteDataStructureWithJobTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteDataStructuresCreateDeniedInClusterReadOnlyMode; import org.apache.ignite.internal.processors.cache.datastructures.IgniteDataStructuresNoClassOnServerTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteQueueClusterReadOnlyTest; import org.apache.ignite.internal.processors.cache.datastructures.IgniteSequenceInternalCleanupTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteSetClusterReadOnlyTest; import org.apache.ignite.internal.processors.cache.datastructures.OutOfMemoryVolatileRegionTest; import org.apache.ignite.internal.processors.cache.datastructures.SemaphoreFailoverNoWaitingAcquirerTest; -import org.apache.ignite.internal.processors.cache.datastructures.SemaphoreFailoverSafeReleasePermitsTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicQueueApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicQueueCreateMultiNodeSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicQueueFailoverDataConsistencySelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicQueueMultiNodeSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicQueueRotativeMultiNodeTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicReferenceApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicReferenceMultiNodeTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicSequenceMultiThreadedTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicSequenceTxSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicSetFailoverSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicSetSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicStampedApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedDataStructuresFailoverSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedNodeRestartTxSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueCreateMultiNodeSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueEntryMoveSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueFailoverDataConsistencySelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueJoinedNodeSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueMultiNodeSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueRotativeMultiNodeTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSequenceApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSequenceMultiNodeSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSetFailoverSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSetSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSetWithClientSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSetWithNodeFilterSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.IgnitePartitionedAtomicLongApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.IgnitePartitionedCountDownLatchSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.IgnitePartitionedLockSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.IgnitePartitionedQueueNoBackupsTest; import org.apache.ignite.internal.processors.cache.datastructures.partitioned.IgnitePartitionedSemaphoreSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.partitioned.IgnitePartitionedSetNoBackupsSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedAtomicReferenceApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedAtomicReferenceMultiNodeTest; -import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedAtomicStampedApiSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedDataStructuresFailoverSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedQueueApiSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedQueueMultiNodeSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedQueueRotativeMultiNodeTest; -import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedSequenceApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedSequenceMultiNodeSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedSetSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedSetWithClientSelfTest; -import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedSetWithNodeFilterSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.replicated.IgniteReplicatedAtomicLongApiSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.replicated.IgniteReplicatedCountDownLatchSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.replicated.IgniteReplicatedLockSelfTest; import org.apache.ignite.internal.processors.cache.datastructures.replicated.IgniteReplicatedSemaphoreSelfTest; import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheAtomicReplicatedNodeRestartSelfTest; -import org.apache.ignite.internal.processors.datastructures.GridCacheReplicatedQueueRemoveSelfTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -96,98 +62,44 @@ */ @RunWith(Suite.class) @Suite.SuiteClasses({ - GridCachePartitionedQueueFailoverDataConsistencySelfTest.class, - GridCachePartitionedAtomicQueueFailoverDataConsistencySelfTest.class, - - GridCacheReplicatedSequenceApiSelfTest.class, GridCacheReplicatedSequenceMultiNodeSelfTest.class, - GridCacheReplicatedQueueApiSelfTest.class, - GridCacheReplicatedQueueMultiNodeSelfTest.class, - GridCacheReplicatedQueueRotativeMultiNodeTest.class, - GridCacheReplicatedSetSelfTest.class, GridCacheReplicatedSetWithClientSelfTest.class, - GridCacheReplicatedSetWithNodeFilterSelfTest.class, - GridCacheReplicatedDataStructuresFailoverSelfTest.class, IgniteReplicatedCountDownLatchSelfTest.class, IgniteReplicatedSemaphoreSelfTest.class, IgniteReplicatedLockSelfTest.class, IgniteCacheAtomicReplicatedNodeRestartSelfTest.class, - GridCacheReplicatedQueueRemoveSelfTest.class, OutOfMemoryVolatileRegionTest.class, - - GridCachePartitionedSequenceApiSelfTest.class, GridCachePartitionedSequenceMultiNodeSelfTest.class, GridCachePartitionedQueueApiSelfTest.class, GridCachePartitionedAtomicQueueApiSelfTest.class, GridCachePartitionedQueueMultiNodeSelfTest.class, GridCachePartitionedAtomicQueueMultiNodeSelfTest.class, GridCacheQueueClientDisconnectTest.class, - GridCachePartitionedQueueCreateMultiNodeSelfTest.class, GridCachePartitionedAtomicQueueCreateMultiNodeSelfTest.class, GridCachePartitionedSetSelfTest.class, - GridCachePartitionedSetWithClientSelfTest.class, - GridCachePartitionedSetWithNodeFilterSelfTest.class, - IgnitePartitionedSetNoBackupsSelfTest.class, - GridCachePartitionedAtomicSetSelfTest.class, IgnitePartitionedCountDownLatchSelfTest.class, IgniteDataStructureWithJobTest.class, IgnitePartitionedSemaphoreSelfTest.class, - SemaphoreFailoverSafeReleasePermitsTest.class, SemaphoreFailoverNoWaitingAcquirerTest.class, IgnitePartitionedLockSelfTest.class, - GridCachePartitionedSetFailoverSelfTest.class, GridCachePartitionedAtomicSetFailoverSelfTest.class, - - GridCachePartitionedQueueRotativeMultiNodeTest.class, - GridCachePartitionedAtomicQueueRotativeMultiNodeTest.class, GridCacheQueueCleanupSelfTest.class, - - GridCachePartitionedQueueEntryMoveSelfTest.class, - GridCachePartitionedDataStructuresFailoverSelfTest.class, GridCacheQueueMultiNodeConsistencySelfTest.class, - - IgnitePartitionedAtomicLongApiSelfTest.class, IgniteReplicatedAtomicLongApiSelfTest.class, - GridCachePartitionedAtomicSequenceMultiThreadedTest.class, GridCachePartitionedAtomicSequenceTxSelfTest.class, - - GridCachePartitionedAtomicStampedApiSelfTest.class, - GridCacheReplicatedAtomicStampedApiSelfTest.class, - - GridCachePartitionedAtomicReferenceApiSelfTest.class, GridCacheReplicatedAtomicReferenceApiSelfTest.class, - GridCachePartitionedAtomicReferenceMultiNodeTest.class, GridCacheReplicatedAtomicReferenceMultiNodeTest.class, - - GridCachePartitionedNodeRestartTxSelfTest.class, - GridCachePartitionedQueueJoinedNodeSelfTest.class, - - IgniteDataStructureUniqueNameTest.class, IgniteDataStructuresNoClassOnServerTest.class, - - IgniteClientDataStructuresTest.class, - IgnitePartitionedQueueNoBackupsTest.class, - IgniteSequenceInternalCleanupTest.class, - - AtomicCacheAffinityConfigurationTest.class, - IgniteCacheDataStructuresBinarySelfTestSuite.class, - IgniteAtomicLongClusterReadOnlyTest.class, IgniteAtomicReferenceClusterReadOnlyTest.class, - IgniteAtomicSequenceClusterReadOnlyTest.class, - IgniteAtomicStampedClusterReadOnlyTest.class, - IgniteCountDownLatchClusterReadOnlyTest.class, - IgniteDataStructuresCreateDeniedInClusterReadOnlyMode.class, - IgniteQueueClusterReadOnlyTest.class, - IgniteSetClusterReadOnlyTest.class }) public class IgniteCacheDataStructuresSelfTestSuite { } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite2.java new file mode 100644 index 0000000000000..36163ed4e4271 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheDataStructuresSelfTestSuite2.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import org.apache.ignite.internal.processors.cache.AtomicCacheAffinityConfigurationTest; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteAtomicSequenceClusterReadOnlyTest; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteAtomicStampedClusterReadOnlyTest; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteClientDataStructuresTest; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteCountDownLatchClusterReadOnlyTest; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteDataStructureUniqueNameTest; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteDataStructuresCreateDeniedInClusterReadOnlyMode; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteQueueClusterReadOnlyTest; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteSetClusterReadOnlyTest; +import org.apache.ignite.internal.processors.cache.datastructures.SemaphoreFailoverSafeReleasePermitsTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicQueueFailoverDataConsistencySelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicQueueRotativeMultiNodeTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicReferenceApiSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicSetSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedAtomicStampedApiSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedNodeRestartTxSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueEntryMoveSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueFailoverDataConsistencySelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueJoinedNodeSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedQueueRotativeMultiNodeTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSequenceApiSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSetWithClientSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.GridCachePartitionedSetWithNodeFilterSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.IgnitePartitionedAtomicLongApiSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.partitioned.IgnitePartitionedSetNoBackupsSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedAtomicStampedApiSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedDataStructuresFailoverSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedQueueApiSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedQueueMultiNodeSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedQueueRotativeMultiNodeTest; +import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedSequenceApiSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedSetSelfTest; +import org.apache.ignite.internal.processors.cache.datastructures.replicated.GridCacheReplicatedSetWithNodeFilterSelfTest; +import org.apache.ignite.internal.processors.datastructures.GridCacheReplicatedQueueRemoveSelfTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Split off from {@link IgniteCacheDataStructuresSelfTestSuite} to reduce the single-suite + * runtime in CI; contains an independent subset of the same test classes. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + GridCachePartitionedQueueFailoverDataConsistencySelfTest.class, + GridCachePartitionedAtomicQueueFailoverDataConsistencySelfTest.class, + GridCacheReplicatedSequenceApiSelfTest.class, + GridCacheReplicatedQueueApiSelfTest.class, + GridCacheReplicatedQueueMultiNodeSelfTest.class, + GridCacheReplicatedQueueRotativeMultiNodeTest.class, + GridCacheReplicatedSetSelfTest.class, + GridCacheReplicatedSetWithNodeFilterSelfTest.class, + GridCacheReplicatedDataStructuresFailoverSelfTest.class, + GridCacheReplicatedQueueRemoveSelfTest.class, + GridCachePartitionedSequenceApiSelfTest.class, + GridCachePartitionedSetWithClientSelfTest.class, + GridCachePartitionedSetWithNodeFilterSelfTest.class, + IgnitePartitionedSetNoBackupsSelfTest.class, + GridCachePartitionedAtomicSetSelfTest.class, + SemaphoreFailoverSafeReleasePermitsTest.class, + GridCachePartitionedQueueRotativeMultiNodeTest.class, + GridCachePartitionedAtomicQueueRotativeMultiNodeTest.class, + GridCachePartitionedQueueEntryMoveSelfTest.class, + IgnitePartitionedAtomicLongApiSelfTest.class, + GridCachePartitionedAtomicStampedApiSelfTest.class, + GridCacheReplicatedAtomicStampedApiSelfTest.class, + GridCachePartitionedAtomicReferenceApiSelfTest.class, + GridCachePartitionedNodeRestartTxSelfTest.class, + GridCachePartitionedQueueJoinedNodeSelfTest.class, + IgniteDataStructureUniqueNameTest.class, + IgniteClientDataStructuresTest.class, + AtomicCacheAffinityConfigurationTest.class, + IgniteAtomicSequenceClusterReadOnlyTest.class, + IgniteAtomicStampedClusterReadOnlyTest.class, + IgniteCountDownLatchClusterReadOnlyTest.class, + IgniteDataStructuresCreateDeniedInClusterReadOnlyMode.class, + IgniteQueueClusterReadOnlyTest.class, + IgniteSetClusterReadOnlyTest.class, +}) +public class IgniteCacheDataStructuresSelfTestSuite2 { +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java index ed447fd940885..384e79a0b4e62 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java @@ -19,23 +19,13 @@ import org.apache.ignite.internal.processors.cache.GridCacheIncrementTransformTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheAtomicNodeJoinTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheSizeFailoverTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheTxNearDisabledPutGetRestartTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheTxNodeJoinTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtAtomicRemoveFailureTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtClientRemoveFailureTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtRemoveFailureTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheTxNodeFailureSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteAtomicLongChangingTopologySelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.AtomicPutAllChangingTopologyTest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicClientInvalidPartitionHandlingSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicClientRemoveFailureTest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicInvalidPartitionHandlingSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicRemoveFailureTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearRemoveFailureTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearRemoveFailureTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingPartitionDistributionTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteChangingBaselineDownCacheRemoveFailoverTest; import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteChangingBaselineUpCacheRemoveFailoverTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -47,32 +37,18 @@ @Suite.SuiteClasses({ GridCacheAtomicInvalidPartitionHandlingSelfTest.class, GridCacheAtomicClientInvalidPartitionHandlingSelfTest.class, - GridCacheRebalancingPartitionDistributionTest.class, GridCacheIncrementTransformTest.class, // Failure consistency tests. GridCacheAtomicRemoveFailureTest.class, - GridCacheAtomicClientRemoveFailureTest.class, GridCacheDhtAtomicRemoveFailureTest.class, GridCacheDhtRemoveFailureTest.class, - GridCacheDhtClientRemoveFailureTest.class, GridCacheNearRemoveFailureTest.class, - GridCacheAtomicNearRemoveFailureTest.class, IgniteChangingBaselineUpCacheRemoveFailoverTest.class, - IgniteChangingBaselineDownCacheRemoveFailoverTest.class, IgniteCacheAtomicNodeJoinTest.class, - IgniteCacheTxNodeJoinTest.class, - - IgniteCacheTxNearDisabledPutGetRestartTest.class, - - IgniteCacheSizeFailoverTest.class, - - IgniteAtomicLongChangingTopologySelfTest.class, - - GridCacheTxNodeFailureSelfTest.class, AtomicPutAllChangingTopologyTest.class, }) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite2.java index b8514bfda74fa..919656c2599d3 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite2.java @@ -17,47 +17,16 @@ package org.apache.ignite.testsuites; -import org.apache.ignite.internal.processors.cache.CacheGetFromJobTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheAsyncOperationsFailoverAtomicTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheAsyncOperationsFailoverTxTest; -import org.apache.ignite.internal.processors.cache.distributed.CachePutAllFailoverAtomicTest; -import org.apache.ignite.internal.processors.cache.distributed.CachePutAllFailoverTxTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedFailoverSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCacheCrossCacheTxFailoverTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicFailoverSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicReplicatedFailoverSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedFailoverSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.replicated.GridCacheReplicatedFailoverSelfTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteChangingBaselineDownCachePutAllFailoverTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteChangingBaselineUpCachePutAllFailoverTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteStableBaselineCachePutAllFailoverTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteStableBaselineCacheRemoveFailoverTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; /** */ @RunWith(Suite.class) @Suite.SuiteClasses({ - CacheGetFromJobTest.class, - - GridCacheAtomicFailoverSelfTest.class, - GridCacheAtomicReplicatedFailoverSelfTest.class, - - GridCachePartitionedFailoverSelfTest.class, - GridCacheColocatedFailoverSelfTest.class, - GridCacheReplicatedFailoverSelfTest.class, IgniteCacheCrossCacheTxFailoverTest.class, - CacheAsyncOperationsFailoverAtomicTest.class, - CacheAsyncOperationsFailoverTxTest.class, - - CachePutAllFailoverAtomicTest.class, - CachePutAllFailoverTxTest.class, - IgniteStableBaselineCachePutAllFailoverTest.class, - IgniteStableBaselineCacheRemoveFailoverTest.class, - IgniteChangingBaselineDownCachePutAllFailoverTest.class, - IgniteChangingBaselineUpCachePutAllFailoverTest.class }) public class IgniteCacheFailoverTestSuite2 { } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite4.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite4.java new file mode 100644 index 0000000000000..47575efccf5e6 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite4.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheSizeFailoverTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheTxNearDisabledPutGetRestartTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheTxNodeJoinTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtClientRemoveFailureTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheTxNodeFailureSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteAtomicLongChangingTopologySelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicClientRemoveFailureTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearRemoveFailureTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingPartitionDistributionTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteChangingBaselineDownCacheRemoveFailoverTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Split off from {@link IgniteCacheFailoverTestSuite} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + GridCacheRebalancingPartitionDistributionTest.class, + GridCacheAtomicClientRemoveFailureTest.class, + GridCacheDhtClientRemoveFailureTest.class, + GridCacheAtomicNearRemoveFailureTest.class, + IgniteChangingBaselineDownCacheRemoveFailoverTest.class, + IgniteCacheTxNodeJoinTest.class, + IgniteCacheTxNearDisabledPutGetRestartTest.class, + IgniteCacheSizeFailoverTest.class, + IgniteAtomicLongChangingTopologySelfTest.class, + GridCacheTxNodeFailureSelfTest.class, +}) +public class IgniteCacheFailoverTestSuite4 { +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite5.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite5.java new file mode 100644 index 0000000000000..d7d8407102eda --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite5.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import org.apache.ignite.internal.processors.cache.CacheGetFromJobTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheAsyncOperationsFailoverAtomicTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheAsyncOperationsFailoverTxTest; +import org.apache.ignite.internal.processors.cache.distributed.CachePutAllFailoverAtomicTest; +import org.apache.ignite.internal.processors.cache.distributed.CachePutAllFailoverTxTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedFailoverSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicFailoverSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicReplicatedFailoverSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedFailoverSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.replicated.GridCacheReplicatedFailoverSelfTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteChangingBaselineDownCachePutAllFailoverTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteChangingBaselineUpCachePutAllFailoverTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteStableBaselineCachePutAllFailoverTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteStableBaselineCacheRemoveFailoverTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Split off from {@link IgniteCacheFailoverTestSuite2} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + CacheGetFromJobTest.class, + GridCacheAtomicFailoverSelfTest.class, + GridCacheAtomicReplicatedFailoverSelfTest.class, + GridCachePartitionedFailoverSelfTest.class, + GridCacheColocatedFailoverSelfTest.class, + GridCacheReplicatedFailoverSelfTest.class, + CacheAsyncOperationsFailoverAtomicTest.class, + CacheAsyncOperationsFailoverTxTest.class, + CachePutAllFailoverAtomicTest.class, + CachePutAllFailoverTxTest.class, + IgniteStableBaselineCachePutAllFailoverTest.class, + IgniteStableBaselineCacheRemoveFailoverTest.class, + IgniteChangingBaselineDownCachePutAllFailoverTest.class, + IgniteChangingBaselineUpCachePutAllFailoverTest.class, +}) +public class IgniteCacheFailoverTestSuite5 { +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite13.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite13.java index a2a17c5d2b16d..2f4d1787be3f9 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite13.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite13.java @@ -35,10 +35,25 @@ import org.apache.ignite.internal.metric.OutboundIoMessageQueueSizeTest; import org.apache.ignite.internal.metric.ReadMetricsOnNodeStartupTest; import org.apache.ignite.internal.metric.SystemMetricsTest; +import org.apache.ignite.internal.metric.SystemViewBinaryMetaTest; import org.apache.ignite.internal.metric.SystemViewCacheExpiryPolicyTest; +import org.apache.ignite.internal.metric.SystemViewCacheTest; +import org.apache.ignite.internal.metric.SystemViewClientTest; import org.apache.ignite.internal.metric.SystemViewClusterActivationTest; import org.apache.ignite.internal.metric.SystemViewComputeJobTest; -import org.apache.ignite.internal.metric.SystemViewSelfTest; +import org.apache.ignite.internal.metric.SystemViewComputeTaskTest; +import org.apache.ignite.internal.metric.SystemViewConfigurationTest; +import org.apache.ignite.internal.metric.SystemViewDSTest; +import org.apache.ignite.internal.metric.SystemViewExecutorsTest; +import org.apache.ignite.internal.metric.SystemViewMetastorageTest; +import org.apache.ignite.internal.metric.SystemViewNodesTest; +import org.apache.ignite.internal.metric.SystemViewPageListsTest; +import org.apache.ignite.internal.metric.SystemViewPageTimestampsTest; +import org.apache.ignite.internal.metric.SystemViewPluginTest; +import org.apache.ignite.internal.metric.SystemViewQueriesTest; +import org.apache.ignite.internal.metric.SystemViewServiceTest; +import org.apache.ignite.internal.metric.SystemViewSnapshotsTest; +import org.apache.ignite.internal.metric.SystemViewTransactionsTest; import org.apache.ignite.internal.processors.cache.CacheClearAsyncDeadlockTest; import org.apache.ignite.internal.processors.cache.CacheDistributedGetLongRunningFutureDumpTest; import org.apache.ignite.internal.processors.cache.EntriesRemoveOnShutdownTest; @@ -88,10 +103,25 @@ public static List> suite(Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, SystemMetricsTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CustomMetricsTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, MetricsConfigurationTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, SystemViewSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, SystemViewClusterActivationTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, SystemViewComputeJobTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, SystemViewCacheExpiryPolicyTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewCacheTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewServiceTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewComputeTaskTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewClientTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewNodesTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewTransactionsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewDSTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewExecutorsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewPageListsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewBinaryMetaTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewMetastorageTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewSnapshotsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewPageTimestampsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewConfigurationTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewPluginTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, SystemViewQueriesTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheMetricsAddRemoveTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheMetricsConflictResolverTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, JmxExporterSpiTest.class, ignoredTests); diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite14.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite14.java new file mode 100644 index 0000000000000..2f8fc5a17dc71 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite14.java @@ -0,0 +1,190 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeAffinityBackupFilterSelfTest; +import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunctionFastPowerOfTwoHashSelfTest; +import org.apache.ignite.internal.processors.cache.CacheConcurrentReadThroughTest; +import org.apache.ignite.internal.processors.cache.CacheConfigurationLeakTest; +import org.apache.ignite.internal.processors.cache.CacheExchangeMessageDuplicatedStateTest; +import org.apache.ignite.internal.processors.cache.CacheOptimisticTransactionsWithFilterSingleServerTest; +import org.apache.ignite.internal.processors.cache.CrossCacheTxNearEnabledRandomOperationsTest; +import org.apache.ignite.internal.processors.cache.CrossCacheTxRandomOperationsTest; +import org.apache.ignite.internal.processors.cache.GridCacheAtomicMessageCountSelfTest; +import org.apache.ignite.internal.processors.cache.GridCacheFastNodeLeftForTransactionTest; +import org.apache.ignite.internal.processors.cache.GridCacheFinishPartitionsSelfTest; +import org.apache.ignite.internal.processors.cache.GridCacheVariableTopologySelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheEntryProcessorNodeJoinTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheNoSyncForGetTest; +import org.apache.ignite.internal.processors.cache.IgniteCachePartitionMapUpdateTest; +import org.apache.ignite.internal.processors.cache.IgniteClientCacheStartFailoverTest; +import org.apache.ignite.internal.processors.cache.IgniteNearClientCacheCloseTest; +import org.apache.ignite.internal.processors.cache.IgniteOnePhaseCommitInvokeTest; +import org.apache.ignite.internal.processors.cache.NoPresentCacheInterceptorOnClientTest; +import org.apache.ignite.internal.processors.cache.TransactionValidationTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheDetectLostPartitionsTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheLoadingConcurrentGridStartSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheLockReleaseNodeLeaveTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheTxLoadingConcurrentGridStartSelfTestAllowOverwrite; +import org.apache.ignite.internal.processors.cache.distributed.GridCachePartitionedNearDisabledTxMultiThreadedSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheClientNodePartitionsExchangeTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheServerNodeConcurrentStart; +import org.apache.ignite.internal.processors.cache.distributed.dht.CachePartitionPartialCountersMapSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedDebugTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedPreloadRestartSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedPrimarySyncSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedTxSingleThreadedSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtEntrySelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtEvictionsDisabledSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtMappingSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadBigDataSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadDelayedSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadDisabledSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadMessageCountTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadOnheapSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadPutGetSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadStartStopSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledLockSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedUnloadEventsSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCacheClearDuringRebalanceTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCacheContainsKeyColocatedSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteTxConsistencyColocatedRestartSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.RebalanceIsProcessingWhenAssignmentIsEmptyTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearEvictionEventSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearClientHitTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearEvictionEventSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearMultiGetSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearMultiNodeSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearPartitionedClearSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearPreloadRestartSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearReaderPreloadSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearTxForceKeyTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedAtomicGetAndTransformStoreSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedBasicStoreSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedEventSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedExplicitLockNodeFailureSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedMultiNodeSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedNestedTxTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedPreloadLifecycleSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedTxConcurrentGetTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedTxMultiThreadedSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedTxReadTest; +import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheRendezvousAffinityClientSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.NearCachePutAllMultinodeTest; +import org.apache.ignite.internal.processors.continuous.IgniteNoCustomEventsOnNodeStart; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.DynamicSuite; +import org.junit.runner.RunWith; + +/** + * Split off from {@link IgniteCacheTestSuite2} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(DynamicSuite.class) +public class IgniteCacheTestSuite14 { + /** + * @return Test suite. + */ + public static List> suite() { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + */ + public static List> suite(Collection ignoredTests) { + List> suite = new ArrayList<>(); + + GridTestUtils.addTestIfNeeded(suite, GridCacheFastNodeLeftForTransactionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheNearMultiGetSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheNearMultiNodeSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheNearReaderPreloadSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedAtomicGetAndTransformStoreSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedBasicStoreSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheConcurrentReadThroughTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNearDisabledLockSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedMultiNodeSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedExplicitLockNodeFailureSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheLockReleaseNodeLeaveTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNestedTxTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTxConcurrentGetTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTxReadTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedTxSingleThreadedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheFinishPartitionsSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTxMultiThreadedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNearDisabledTxMultiThreadedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtEntrySelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtMappingSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadOnheapSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadBigDataSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadPutGetSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadDisabledSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedPreloadRestartSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheNearPreloadRestartSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadStartStopSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedPreloadLifecycleSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadDelayedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, RebalanceIsProcessingWhenAssignmentIsEmptyTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheLoadingConcurrentGridStartSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheTxLoadingConcurrentGridStartSelfTestAllowOverwrite.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedEventSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtEvictionsDisabledSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheNearEvictionEventSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheAtomicNearEvictionEventSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedUnloadEventsSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheAtomicMessageCountSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheNearPartitionedClearSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheNearClientHitTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedPrimarySyncSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCachePartitionMapUpdateTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheClientNodePartitionsExchangeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheServerNodeConcurrentStart.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheEntryProcessorNodeJoinTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheNearTxForceKeyTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CrossCacheTxRandomOperationsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CrossCacheTxNearEnabledRandomOperationsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheVariableTopologySelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteNoCustomEventsOnNodeStart.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheExchangeMessageDuplicatedStateTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, NearCachePutAllMultinodeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteOnePhaseCommitInvokeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheNoSyncForGetTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheContainsKeyColocatedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteNearClientCacheCloseTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteClientCacheStartFailoverTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheOptimisticTransactionsWithFilterSingleServerTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheClearDuringRebalanceTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedDebugTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadMessageCountTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteTxConsistencyColocatedRestartSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheConfigurationLeakTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, RendezvousAffinityFunctionFastPowerOfTwoHashSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheRendezvousAffinityClientSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterNodeAttributeAffinityBackupFilterSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CachePartitionPartialCountersMapSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, NoPresentCacheInterceptorOnClientTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheDetectLostPartitionsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TransactionValidationTest.class, ignoredTests); + + return suite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite15.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite15.java new file mode 100644 index 0000000000000..cef8063e41e98 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite15.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.internal.processors.cache.CacheCreateDestroyClusterReadOnlyModeTest; +import org.apache.ignite.internal.processors.cache.CacheKeepBinaryTransactionTest; +import org.apache.ignite.internal.processors.cache.CacheNearReaderUpdateTest; +import org.apache.ignite.internal.processors.cache.CacheRebalancingSelfTest; +import org.apache.ignite.internal.processors.cache.ClusterActivationFailureTest; +import org.apache.ignite.internal.processors.cache.ClusterReadOnlyModeTest; +import org.apache.ignite.internal.processors.cache.ClusterStateClientPartitionedSelfTest; +import org.apache.ignite.internal.processors.cache.ClusterStateClientReplicatedSelfTest; +import org.apache.ignite.internal.processors.cache.ClusterStateNoRebalancePartitionedTest; +import org.apache.ignite.internal.processors.cache.ClusterStateNoRebalanceReplicatedTest; +import org.apache.ignite.internal.processors.cache.ClusterStatePartitionedSelfTest; +import org.apache.ignite.internal.processors.cache.ClusterStateReplicatedSelfTest; +import org.apache.ignite.internal.processors.cache.EntryVersionConsistencyReadThroughTest; +import org.apache.ignite.internal.processors.cache.IgniteCachePutStackOverflowSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheStoreCollectionTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheLateAffinityAssignmentNodeJoinValidationTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheLateAffinityAssignmentTest; +import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeCellularSwitchComplexOperationsTest; +import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeCellularSwitchIsolationTest; +import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeCellularSwitchTxContinuationTest; +import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeCellularSwitchTxCountersTest; +import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeSwitchTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheGroupsPartitionLossPolicySelfTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCachePartitionLossPolicySelfTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheTxIteratorSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.CacheManualRebalancingTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.RebalanceMetricsTest; +import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheSyncRebalanceModeSelfTest; +import org.apache.ignite.internal.processors.cache.store.IgniteCacheWriteBehindNoUpdateSelfTest; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.DynamicSuite; +import org.junit.runner.RunWith; + +/** + * Split off from {@link IgniteCacheTestSuite5} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(DynamicSuite.class) +public class IgniteCacheTestSuite15 { + /** + * @return Test suite. + */ + public static List> suite() { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + */ + public static List> suite(Collection ignoredTests) { + List> suite = new ArrayList<>(); + + GridTestUtils.addTestIfNeeded(suite, CacheNearReaderUpdateTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheStoreCollectionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheWriteBehindNoUpdateSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCachePutStackOverflowSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheKeepBinaryTransactionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheLateAffinityAssignmentTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheLateAffinityAssignmentNodeJoinValidationTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeSwitchTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeCellularSwitchComplexOperationsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeCellularSwitchIsolationTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeCellularSwitchTxContinuationTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeCellularSwitchTxCountersTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, EntryVersionConsistencyReadThroughTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheSyncRebalanceModeSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxIteratorSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterStatePartitionedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterStateClientPartitionedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterStateNoRebalancePartitionedTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterStateReplicatedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterStateClientReplicatedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterStateNoRebalanceReplicatedTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterReadOnlyModeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClusterActivationFailureTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheCreateDestroyClusterReadOnlyModeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCachePartitionLossPolicySelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheGroupsPartitionLossPolicySelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheRebalancingSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheManualRebalancingTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, RebalanceMetricsTest.class, ignoredTests); + + return suite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite16.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite16.java new file mode 100644 index 0000000000000..2171ab5a1d1f0 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite16.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.internal.processors.cache.PartitionedTransactionalOptimisticCacheGetsDistributionTest; +import org.apache.ignite.internal.processors.cache.ReplicatedAtomicCacheGetsDistributionTest; +import org.apache.ignite.internal.processors.cache.ReplicatedTransactionalOptimisticCacheGetsDistributionTest; +import org.apache.ignite.internal.processors.cache.ReplicatedTransactionalPessimisticCacheGetsDistributionTest; +import org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerDiscoHistoryTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheExchangeMergeMdcTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheParallelStartTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheTryLockMultithreadedTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheMultiClientsStartTest; +import org.apache.ignite.internal.processors.cache.distributed.IgnitePessimisticTxSuspendResumeTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.latch.ExchangeLatchManagerTest; +import org.apache.ignite.internal.processors.cache.transactions.TxMultiCacheAsyncOpsTest; +import org.apache.ignite.internal.processors.cache.transactions.TxOnCachesStartTest; +import org.apache.ignite.internal.processors.cache.transactions.TxOnCachesStopTest; +import org.apache.ignite.internal.processors.cache.transactions.TxOptimisticOnPartitionExchangeTest; +import org.apache.ignite.internal.processors.cache.transactions.TxOptimisticPrepareOnUnstableTopologyTest; +import org.apache.ignite.internal.processors.cache.transactions.TxOptimisticReadThroughTest; +import org.apache.ignite.internal.processors.cache.transactions.TxRollbackDuringPreparingTest; +import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnIncorrectParamsTest; +import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnMapOnInvalidTopologyTest; +import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTimeoutNearCacheTest; +import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTimeoutNoDeadlockDetectionTest; +import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTimeoutOnePhaseCommitTest; +import org.apache.ignite.internal.processors.cache.transactions.TxStateChangeEventTest; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.DynamicSuite; +import org.junit.runner.RunWith; + +/** + * Split off from {@link IgniteCacheTestSuite6} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(DynamicSuite.class) +public class IgniteCacheTestSuite16 { + /** + * @return Test suite. + */ + public static List> suite() { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + */ + public static List> suite(Collection ignoredTests) { + List> suite = new ArrayList<>(); + + GridTestUtils.addTestIfNeeded(suite, IgnitePessimisticTxSuspendResumeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheExchangeMergeMdcTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxRollbackOnTimeoutNoDeadlockDetectionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxRollbackOnTimeoutNearCacheTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxRollbackOnTimeoutOnePhaseCommitTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxOptimisticPrepareOnUnstableTopologyTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxRollbackOnIncorrectParamsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxStateChangeEventTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxMultiCacheAsyncOpsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxOnCachesStartTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxOnCachesStopTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheMultiClientsStartTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ReplicatedAtomicCacheGetsDistributionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ReplicatedTransactionalOptimisticCacheGetsDistributionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ReplicatedTransactionalPessimisticCacheGetsDistributionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, PartitionedTransactionalOptimisticCacheGetsDistributionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxOptimisticOnPartitionExchangeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxOptimisticReadThroughTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteExchangeLatchManagerDiscoHistoryTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ExchangeLatchManagerTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheTryLockMultithreadedTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheParallelStartTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxRollbackOnMapOnInvalidTopologyTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxRollbackDuringPreparingTest.class, ignoredTests); + + return suite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite17.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite17.java new file mode 100644 index 0000000000000..e2fcb00410d7e --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite17.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.internal.processors.cache.CachePutIfAbsentTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheGetCustomCollectionsSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheLoadRebalanceEvictionSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteTxCachePrimarySyncTest; +import org.apache.ignite.internal.processors.cache.transactions.PartitionUpdateCounterTest; +import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateConsistencyHistoryRebalanceTest; +import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateConsistencyTest; +import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateConsistencyVolatileRebalanceTest; +import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryOneBackupHistoryRebalanceTest; +import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryOneBackupTest; +import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryTwoBackupsHistoryRebalanceTest; +import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStatePutTest; +import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateWithFilterTest; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.DynamicSuite; +import org.junit.runner.RunWith; + +/** + * Split off from {@link IgniteCacheTestSuite9} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(DynamicSuite.class) +public class IgniteCacheTestSuite17 { + /** + * @return Test suite. + */ + public static List> suite() { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + */ + public static List> suite(Collection ignoredTests) { + List> suite = new ArrayList<>(); + + GridTestUtils.addTestIfNeeded(suite, IgniteCacheGetCustomCollectionsSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheLoadRebalanceEvictionSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteTxCachePrimarySyncTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CachePutIfAbsentTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryOneBackupHistoryRebalanceTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryOneBackupTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryTwoBackupsHistoryRebalanceTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStatePutTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateWithFilterTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, PartitionUpdateCounterTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateConsistencyTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateConsistencyHistoryRebalanceTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateConsistencyVolatileRebalanceTest.class, ignoredTests); + + return suite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite18.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite18.java new file mode 100644 index 0000000000000..49018af640fd2 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite18.java @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.cache.store.CacheStoreListenerRWThroughDisabledAtomicCacheTest; +import org.apache.ignite.cache.store.CacheStoreSessionListenerLifecycleSelfTest; +import org.apache.ignite.cache.store.CacheStoreWithIgniteTxFailureTest; +import org.apache.ignite.cache.store.jdbc.CacheJdbcStoreSessionListenerSelfTest; +import org.apache.ignite.internal.processors.GridCacheTxLoadFromStoreOnLockSelfTest; +import org.apache.ignite.internal.processors.cache.CacheEventWithTxLabelTest; +import org.apache.ignite.internal.processors.cache.CacheGetEntryOptimisticReadCommittedSelfTest; +import org.apache.ignite.internal.processors.cache.CacheGetEntryOptimisticRepeatableReadSelfTest; +import org.apache.ignite.internal.processors.cache.CacheGetEntryPessimisticRepeatableReadSelfTest; +import org.apache.ignite.internal.processors.cache.CacheGetRemoveSkipStoreTest; +import org.apache.ignite.internal.processors.cache.CacheReadThroughAtomicRestartSelfTest; +import org.apache.ignite.internal.processors.cache.CacheRemoveAllSelfTest; +import org.apache.ignite.internal.processors.cache.CacheStopAndDestroySelfTest; +import org.apache.ignite.internal.processors.cache.CacheStoreUsageMultinodeDynamicStartAtomicTest; +import org.apache.ignite.internal.processors.cache.CacheStoreUsageMultinodeStaticStartAtomicTest; +import org.apache.ignite.internal.processors.cache.CrossCacheLockTest; +import org.apache.ignite.internal.processors.cache.GridCacheMarshallingNodeJoinSelfTest; +import org.apache.ignite.internal.processors.cache.GridCacheMultinodeUpdateSelfTest; +import org.apache.ignite.internal.processors.cache.GridCacheProcessorActiveTxTest; +import org.apache.ignite.internal.processors.cache.GridCacheStoreManagerDeserializationTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicNearEnabledStoreValueTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicNearPeekModesTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicReplicatedPeekModesTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicStoreValueTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheContainsKeyAtomicTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheReadThroughStoreCallTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheTxCopyOnReadDisabledTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheTxPeekModesTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheTxPreloadNoWriteTest; +import org.apache.ignite.internal.processors.cache.IgniteClientCacheInitializationFailTest; +import org.apache.ignite.internal.processors.cache.IgniteDiscoDataHandlingInNewClusterTest; +import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartCoordinatorFailoverTest; +import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartNoExchangeTimeoutTest; +import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartStopConcurrentTest; +import org.apache.ignite.internal.processors.cache.IgniteDynamicClientCacheStartSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteInternalCacheTypesTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheAffinityEarlyTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheGetFutureHangsSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheNoValueClassOnServerNodeTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheResultIsNotNullOnPartitionLossTest; +import org.apache.ignite.internal.processors.cache.distributed.CacheStartOnJoinTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheCreatePutMultiNodeSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheReadFromBackupTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheSingleGetMessageTest; +import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCacheLockFailoverSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheNearOnlyTxTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheNearReadCommittedTest; +import org.apache.ignite.internal.processors.cache.distributed.replicated.GridReplicatedTxPreloadTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicLoaderWriterTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNearEnabledNoLoadPreviousValueTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNearEnabledNoReadThroughTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNoWriteThroughTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicStoreSessionTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNearEnabledNoLoadPreviousValueTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNearEnabledNoReadThroughTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNoLoadPreviousValueTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNoWriteThroughTest; +import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxStoreSessionWriteBehindTest; +import org.apache.ignite.internal.processors.cache.version.CacheVersionedEntryPartitionedTransactionalSelfTest; +import org.apache.ignite.internal.processors.cache.version.CacheVersionedEntryReplicatedAtomicSelfTest; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.DynamicSuite; +import org.junit.runner.RunWith; + +/** + * Split off from {@link IgniteCacheTestSuite4} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(DynamicSuite.class) +public class IgniteCacheTestSuite18 { + /** + * @return Test suite. + */ + public static List> suite() { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + */ + public static List> suite(Collection ignoredTests) { + List> suite = new ArrayList<>(); + + GridTestUtils.addTestIfNeeded(suite, GridCacheMultinodeUpdateSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicLoaderWriterTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicStoreSessionTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxStoreSessionWriteBehindTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearEnabledNoReadThroughTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNearEnabledNoReadThroughTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheGetRemoveSkipStoreTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearEnabledNoLoadPreviousValueTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNoLoadPreviousValueTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNearEnabledNoLoadPreviousValueTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNoWriteThroughTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNoWriteThroughTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearPeekModesTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicReplicatedPeekModesTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxPeekModesTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheReadThroughStoreCallTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheNearReadCommittedTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxCopyOnReadDisabledTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxPreloadNoWriteTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartCoordinatorFailoverTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartStopConcurrentTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteDynamicClientCacheStartSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartNoExchangeTimeoutTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheAffinityEarlyTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheCreatePutMultiNodeSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheStartOnJoinTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteDiscoDataHandlingInNewClusterTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteClientCacheInitializationFailTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheTxLoadFromStoreOnLockSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheMarshallingNodeJoinSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicStoreValueTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearEnabledStoreValueTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheLockFailoverSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteInternalCacheTypesTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheNoValueClassOnServerNodeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheRemoveAllSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheGetEntryOptimisticReadCommittedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheGetEntryOptimisticRepeatableReadSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheGetEntryPessimisticRepeatableReadSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheStopAndDestroySelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheJdbcStoreSessionListenerSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheStoreSessionListenerLifecycleSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheStoreListenerRWThroughDisabledAtomicCacheTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheStoreWithIgniteTxFailureTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheStoreUsageMultinodeStaticStartAtomicTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheStoreUsageMultinodeDynamicStartAtomicTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheStoreManagerDeserializationTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheReadThroughAtomicRestartSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheVersionedEntryPartitionedTransactionalSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheVersionedEntryReplicatedAtomicSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridReplicatedTxPreloadTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CrossCacheLockTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheGetFutureHangsSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheSingleGetMessageTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheReadFromBackupTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheNearOnlyTxTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheContainsKeyAtomicTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheResultIsNotNullOnPartitionLossTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheEventWithTxLabelTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheProcessorActiveTxTest.class, ignoredTests); + + return suite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite19.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite19.java new file mode 100644 index 0000000000000..317f933c7c5eb --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite19.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.cache.ClientCreateCacheGroupOnJoinNodeMapsTest; +import org.apache.ignite.internal.processors.cache.CacheStoreTxPutAllMultiNodeTest; +import org.apache.ignite.internal.processors.cache.GridCacheOrderedPreloadingSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCachePutKeyAttachedBinaryObjectTest; +import org.apache.ignite.internal.processors.cache.distributed.IgniteTxCacheWithWriteThroughCheckTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRabalancingDelayedPartitionMapExchangeSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalanceOrderTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingAsyncSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingCancelTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingSyncCheckDataTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingSyncSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingUnmarshallingFailedSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.rebalancing.MultiDcRebalancingTest; +import org.apache.ignite.internal.processors.cache.persistence.CleanupRestoredCachesSlowTest; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.DynamicSuite; +import org.junit.runner.RunWith; + +/** + * Split off from {@link IgniteCacheTestSuite8} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(DynamicSuite.class) +public class IgniteCacheTestSuite19 { + /** + * @return Test suite. + */ + public static List> suite() { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + */ + public static List> suite(Collection ignoredTests) { + List> suite = new ArrayList<>(); + + // Eviction. + suite.addAll(IgniteCacheEvictionSelfTestSuite.suite(ignoredTests)); + + // Rebalancing and other cache tests. + GridTestUtils.addTestIfNeeded(suite, GridCacheOrderedPreloadingSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheRebalanceOrderTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingSyncSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingSyncCheckDataTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingUnmarshallingFailedSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingAsyncSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheRabalancingDelayedPartitionMapExchangeSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingCancelTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, MultiDcRebalancingTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheStoreTxPutAllMultiNodeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CleanupRestoredCachesSlowTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, ClientCreateCacheGroupOnJoinNodeMapsTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCachePutKeyAttachedBinaryObjectTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteTxCacheWithWriteThroughCheckTest.class, ignoredTests); + + return suite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java index b89ea7a0a4df7..6b6dd442dad8f 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java @@ -20,148 +20,79 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeAffinityBackupFilterSelfTest; import org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeColocatedBackupFilterSelfTest; import org.apache.ignite.cache.affinity.rendezvous.MdcAffinityBackupFilterSelfTest; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunctionBackupFilterSelfTest; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunctionExcludeNeighborsSelfTest; -import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunctionFastPowerOfTwoHashSelfTest; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunctionStandardHashSelfTest; import org.apache.ignite.internal.IgniteReflectionFactorySelfTest; import org.apache.ignite.internal.processors.cache.CacheComparatorTest; -import org.apache.ignite.internal.processors.cache.CacheConcurrentReadThroughTest; -import org.apache.ignite.internal.processors.cache.CacheConfigurationLeakTest; import org.apache.ignite.internal.processors.cache.CacheDhtLocalPartitionAfterRemoveSelfTest; import org.apache.ignite.internal.processors.cache.CacheEnumOperationsSingleNodeTest; import org.apache.ignite.internal.processors.cache.CacheEnumOperationsTest; -import org.apache.ignite.internal.processors.cache.CacheExchangeMessageDuplicatedStateTest; import org.apache.ignite.internal.processors.cache.CacheGroupLocalConfigurationSelfTest; -import org.apache.ignite.internal.processors.cache.CacheOptimisticTransactionsWithFilterSingleServerTest; import org.apache.ignite.internal.processors.cache.CacheOptimisticTransactionsWithFilterTest; -import org.apache.ignite.internal.processors.cache.CrossCacheTxNearEnabledRandomOperationsTest; -import org.apache.ignite.internal.processors.cache.CrossCacheTxRandomOperationsTest; -import org.apache.ignite.internal.processors.cache.GridCacheAtomicMessageCountSelfTest; -import org.apache.ignite.internal.processors.cache.GridCacheFastNodeLeftForTransactionTest; -import org.apache.ignite.internal.processors.cache.GridCacheFinishPartitionsSelfTest; import org.apache.ignite.internal.processors.cache.GridCacheOffheapUpdateSelfTest; import org.apache.ignite.internal.processors.cache.GridCachePartitionedGetSelfTest; import org.apache.ignite.internal.processors.cache.GridCachePartitionedProjectionAffinitySelfTest; -import org.apache.ignite.internal.processors.cache.GridCacheVariableTopologySelfTest; import org.apache.ignite.internal.processors.cache.IgniteAtomicCacheEntryProcessorNodeJoinTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheEntryProcessorNodeJoinTest; import org.apache.ignite.internal.processors.cache.IgniteCacheIncrementTxTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheNoSyncForGetTest; import org.apache.ignite.internal.processors.cache.IgniteCachePartitionMapUpdateSafeLossPolicyTest; -import org.apache.ignite.internal.processors.cache.IgniteCachePartitionMapUpdateTest; -import org.apache.ignite.internal.processors.cache.IgniteClientCacheStartFailoverTest; import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheAndNodeStop; -import org.apache.ignite.internal.processors.cache.IgniteNearClientCacheCloseTest; -import org.apache.ignite.internal.processors.cache.IgniteOnePhaseCommitInvokeTest; import org.apache.ignite.internal.processors.cache.IgniteOnePhaseCommitNearReadersTest; -import org.apache.ignite.internal.processors.cache.NoPresentCacheInterceptorOnClientTest; +import org.apache.ignite.internal.processors.cache.MdcCacheMetricsTest; import org.apache.ignite.internal.processors.cache.NonAffinityCoordinatorDynamicStartStopTest; import org.apache.ignite.internal.processors.cache.RebalanceIteratorLargeEntriesOOMTest; -import org.apache.ignite.internal.processors.cache.TransactionValidationTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheDetectLostPartitionsTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheLoadingConcurrentGridStartSelfTest; import org.apache.ignite.internal.processors.cache.distributed.CacheLoadingConcurrentGridStartSelfTestAllowOverwrite; -import org.apache.ignite.internal.processors.cache.distributed.CacheLockReleaseNodeLeaveTest; import org.apache.ignite.internal.processors.cache.distributed.CachePartitionStateTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheTxLoadingConcurrentGridStartSelfTestAllowOverwrite; import org.apache.ignite.internal.processors.cache.distributed.GridCachePartitionNotLoadedEventSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.GridCachePartitionedNearDisabledTxMultiThreadedSelfTest; import org.apache.ignite.internal.processors.cache.distributed.GridCacheTransformEventSelfTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheClientNodeChangingTopologyTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheClientNodePartitionsExchangeTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheServerNodeConcurrentStart; import org.apache.ignite.internal.processors.cache.distributed.dht.CacheGetReadFromBackupFailoverTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.CachePartitionPartialCountersMapSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedDebugTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedOptimisticTransactionSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedPreloadRestartSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedPrimarySyncSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheColocatedTxSingleThreadedSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtAtomicEvictionNearReadersSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtEntrySelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtEvictionNearReadersSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtEvictionsDisabledSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtMappingSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadBigDataSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadDelayedSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadDisabledSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadMessageCountTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadMultiThreadedSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadOnheapSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadPutGetSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadStartStopSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadUnloadSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtPreloadWaitForBackupsTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledLockSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledMetricsSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedSupplyEventsSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedTopologyChangeSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedUnloadEventsSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCacheClearDuringRebalanceTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCacheContainsKeyColocatedSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCachePartitionedBackupNodeFailureRecoveryTest; import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCrossCacheTxNearEnabledSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteTxConsistencyColocatedRestartSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.RebalanceIsProcessingWhenAssignmentIsEmptyTest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.IgniteCacheContainsKeyColocatedAtomicSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.IgniteCacheContainsKeyNearAtomicSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearEvictionEventSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearMultiNodeSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearReadersSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearClientHitTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearDynamicStartTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearEvictionEventSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearJobExecutionSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearMultiGetSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearMultiNodeSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearOneNodeSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearPartitionedClearSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearPreloadRestartSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearPrimarySyncSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearReaderPreloadSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearReadersSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearTxForceKeyTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedAffinitySelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedAtomicGetAndTransformStoreSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedBasicApiTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedBasicOpSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedBasicStoreMultiNodeSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedBasicStoreSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedEventSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedEvictionSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedExplicitLockNodeFailureSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedGetAndTransformStoreSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedLoadCacheSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedLockSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedMultiNodeLockSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedMultiNodeSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedMultiThreadedPutGetSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedNearDisabledBasicStoreMultiNodeSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedNestedTxTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedNodeFailureSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedPreloadLifecycleSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedTxConcurrentGetTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedTxMultiThreadedSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedTxReadTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedTxSingleThreadedSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedTxTimeoutSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheRendezvousAffinityClientSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheStoreUpdateTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridPartitionedBackupLoadSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheContainsKeyNearSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheNearTxRollbackTest; import org.apache.ignite.internal.processors.cache.distributed.near.NearCacheMultithreadedUpdateTest; -import org.apache.ignite.internal.processors.cache.distributed.near.NearCachePutAllMultinodeTest; import org.apache.ignite.internal.processors.cache.distributed.near.NearCacheSyncUpdateTest; import org.apache.ignite.internal.processors.cache.distributed.near.NoneRebalanceModeSelfTest; import org.apache.ignite.internal.processors.cache.distributed.replicated.GridCacheReplicatedJobExecutionTest; import org.apache.ignite.internal.processors.continuous.IgniteContinuousQueryMetadataUpdateTest; -import org.apache.ignite.internal.processors.continuous.IgniteNoCustomEventsOnNodeStart; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; import org.junit.runner.RunWith; @@ -185,148 +116,83 @@ public static List> suite() { public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); - GridTestUtils.addTestIfNeeded(suite, GridCacheFastNodeLeftForTransactionTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheTransformEventSelfTest.class, ignoredTests); // Partitioned cache. GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedGetSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedBasicApiTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedBasicOpSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheNearMultiGetSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, NoneRebalanceModeSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheNearOneNodeSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheNearMultiNodeSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheAtomicNearMultiNodeSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheNearReadersSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheNearReaderPreloadSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheAtomicNearReadersSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedGetAndTransformStoreSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedAtomicGetAndTransformStoreSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedBasicStoreSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridNearCacheStoreUpdateTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedBasicStoreMultiNodeSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNearDisabledBasicStoreMultiNodeSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheConcurrentReadThroughTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedLockSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNearDisabledLockSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedMultiNodeLockSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedMultiNodeSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedMultiThreadedPutGetSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNodeFailureSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedExplicitLockNodeFailureSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheLockReleaseNodeLeaveTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNestedTxTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTxConcurrentGetTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTxReadTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTxSingleThreadedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedTxSingleThreadedSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTxTimeoutSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheFinishPartitionsSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTxMultiThreadedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNearDisabledTxMultiThreadedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtEntrySelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtMappingSelfTest.class, ignoredTests); // Preload GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadOnheapSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadBigDataSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadPutGetSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadDisabledSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadMultiThreadedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedPreloadRestartSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheNearPreloadRestartSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadStartStopSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadUnloadSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedPreloadLifecycleSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadDelayedSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadWaitForBackupsTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, RebalanceIsProcessingWhenAssignmentIsEmptyTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheDhtLocalPartitionAfterRemoveSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheLoadingConcurrentGridStartSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheLoadingConcurrentGridStartSelfTestAllowOverwrite.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheTxLoadingConcurrentGridStartSelfTestAllowOverwrite.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridPartitionedBackupLoadSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheGetReadFromBackupFailoverTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedLoadCacheSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedEventSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionNotLoadedEventSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtEvictionsDisabledSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheNearEvictionEventSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheAtomicNearEvictionEventSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedEvictionSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedTopologyChangeSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedUnloadEventsSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedSupplyEventsSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedOptimisticTransactionSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheAtomicMessageCountSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheNearPartitionedClearSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheOffheapUpdateSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheNearClientHitTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheNearDynamicStartTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheNearPrimarySyncSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedPrimarySyncSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCachePartitionMapUpdateTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheClientNodePartitionsExchangeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheClientNodeChangingTopologyTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheServerNodeConcurrentStart.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCachePartitionMapUpdateSafeLossPolicyTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheEntryProcessorNodeJoinTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteAtomicCacheEntryProcessorNodeJoinTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheNearTxForceKeyTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CrossCacheTxRandomOperationsTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CrossCacheTxNearEnabledRandomOperationsTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheAndNodeStop.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, NearCacheSyncUpdateTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheEnumOperationsSingleNodeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheEnumOperationsTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheIncrementTxTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCachePartitionedBackupNodeFailureRecoveryTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheVariableTopologySelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteNoCustomEventsOnNodeStart.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheExchangeMessageDuplicatedStateTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteContinuousQueryMetadataUpdateTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, NearCacheMultithreadedUpdateTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, NearCachePutAllMultinodeTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteOnePhaseCommitInvokeTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheNoSyncForGetTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheNearTxRollbackTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheContainsKeyNearSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheContainsKeyColocatedSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheContainsKeyNearAtomicSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheContainsKeyColocatedAtomicSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteOnePhaseCommitNearReadersTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteNearClientCacheCloseTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteClientCacheStartFailoverTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheOptimisticTransactionsWithFilterSingleServerTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheOptimisticTransactionsWithFilterTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, NonAffinityCoordinatorDynamicStartStopTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheClearDuringRebalanceTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, GridCacheColocatedDebugTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheDhtAtomicEvictionNearReadersSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheDhtEvictionNearReadersSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheDhtPreloadMessageCountTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCachePartitionedNearDisabledMetricsSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCrossCacheTxNearEnabledSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteTxConsistencyColocatedRestartSelfTest.class, ignoredTests); // Configuration validation - GridTestUtils.addTestIfNeeded(suite, CacheConfigurationLeakTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheGroupLocalConfigurationSelfTest.class, ignoredTests); // Affinity and collocation @@ -338,22 +204,16 @@ public static List> suite(Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, GridCacheReplicatedJobExecutionTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, RendezvousAffinityFunctionExcludeNeighborsSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, RendezvousAffinityFunctionFastPowerOfTwoHashSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, RendezvousAffinityFunctionStandardHashSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheRendezvousAffinityClientSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, RendezvousAffinityFunctionBackupFilterSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClusterNodeAttributeAffinityBackupFilterSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ClusterNodeAttributeColocatedBackupFilterSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, MdcAffinityBackupFilterSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, MdcCacheMetricsTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CachePartitionStateTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheComparatorTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CachePartitionPartialCountersMapSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteReflectionFactorySelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, NoPresentCacheInterceptorOnClientTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheDetectLostPartitionsTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TransactionValidationTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, RebalanceIteratorLargeEntriesOOMTest.class, ignoredTests); diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite4.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite4.java index bce6d557f1bd6..5cd49400af78b 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite4.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite4.java @@ -20,128 +20,70 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.ignite.cache.store.CacheStoreListenerRWThroughDisabledAtomicCacheTest; import org.apache.ignite.cache.store.CacheStoreListenerRWThroughDisabledTransactionalCacheTest; -import org.apache.ignite.cache.store.CacheStoreSessionListenerLifecycleSelfTest; import org.apache.ignite.cache.store.CacheStoreSessionListenerWriteBehindEnabledTest; -import org.apache.ignite.cache.store.CacheStoreWithIgniteTxFailureTest; -import org.apache.ignite.cache.store.jdbc.CacheJdbcStoreSessionListenerSelfTest; -import org.apache.ignite.internal.processors.GridCacheTxLoadFromStoreOnLockSelfTest; import org.apache.ignite.internal.processors.cache.CacheClientStoreSelfTest; import org.apache.ignite.internal.processors.cache.CacheConnectionLeakStoreTxTest; -import org.apache.ignite.internal.processors.cache.CacheEventWithTxLabelTest; -import org.apache.ignite.internal.processors.cache.CacheGetEntryOptimisticReadCommittedSelfTest; -import org.apache.ignite.internal.processors.cache.CacheGetEntryOptimisticRepeatableReadSelfTest; import org.apache.ignite.internal.processors.cache.CacheGetEntryOptimisticSerializableSelfTest; import org.apache.ignite.internal.processors.cache.CacheGetEntryPessimisticReadCommittedSelfTest; -import org.apache.ignite.internal.processors.cache.CacheGetEntryPessimisticRepeatableReadSelfTest; import org.apache.ignite.internal.processors.cache.CacheGetEntryPessimisticSerializableSelfTest; -import org.apache.ignite.internal.processors.cache.CacheGetRemoveSkipStoreTest; import org.apache.ignite.internal.processors.cache.CacheOffheapMapEntrySelfTest; -import org.apache.ignite.internal.processors.cache.CacheReadThroughAtomicRestartSelfTest; +import org.apache.ignite.internal.processors.cache.CacheOperationContextTransactionalLockTest; import org.apache.ignite.internal.processors.cache.CacheReadThroughReplicatedAtomicRestartSelfTest; import org.apache.ignite.internal.processors.cache.CacheReadThroughReplicatedRestartSelfTest; import org.apache.ignite.internal.processors.cache.CacheReadThroughRestartSelfTest; -import org.apache.ignite.internal.processors.cache.CacheRemoveAllSelfTest; -import org.apache.ignite.internal.processors.cache.CacheStopAndDestroySelfTest; -import org.apache.ignite.internal.processors.cache.CacheStoreUsageMultinodeDynamicStartAtomicTest; import org.apache.ignite.internal.processors.cache.CacheStoreUsageMultinodeDynamicStartTxTest; -import org.apache.ignite.internal.processors.cache.CacheStoreUsageMultinodeStaticStartAtomicTest; import org.apache.ignite.internal.processors.cache.CacheStoreUsageMultinodeStaticStartTxTest; import org.apache.ignite.internal.processors.cache.CacheTxNotAllowReadFromBackupTest; -import org.apache.ignite.internal.processors.cache.CrossCacheLockTest; -import org.apache.ignite.internal.processors.cache.GridCacheMarshallingNodeJoinSelfTest; +import org.apache.ignite.internal.processors.cache.CacheVersionedEntryTransactionalLockTest; import org.apache.ignite.internal.processors.cache.GridCacheMultinodeUpdateAtomicNearEnabledSelfTest; import org.apache.ignite.internal.processors.cache.GridCacheMultinodeUpdateAtomicSelfTest; import org.apache.ignite.internal.processors.cache.GridCacheMultinodeUpdateNearEnabledNoBackupsSelfTest; import org.apache.ignite.internal.processors.cache.GridCacheMultinodeUpdateNearEnabledSelfTest; -import org.apache.ignite.internal.processors.cache.GridCacheMultinodeUpdateSelfTest; -import org.apache.ignite.internal.processors.cache.GridCacheProcessorActiveTxTest; -import org.apache.ignite.internal.processors.cache.GridCacheStoreManagerDeserializationTest; import org.apache.ignite.internal.processors.cache.GridCacheVersionMultinodeTest; import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicCopyOnReadDisabledTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicNearEnabledStoreValueTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicNearPeekModesTest; import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicPeekModesTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicReplicatedPeekModesTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheAtomicStoreValueTest; import org.apache.ignite.internal.processors.cache.IgniteCacheConfigurationDefaultTemplateTest; import org.apache.ignite.internal.processors.cache.IgniteCacheConfigurationTemplateTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheContainsKeyAtomicTest; import org.apache.ignite.internal.processors.cache.IgniteCacheDynamicStopSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheInvokeReadThroughSingleNodeTest; import org.apache.ignite.internal.processors.cache.IgniteCacheInvokeReadThroughTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheReadThroughStoreCallTest; import org.apache.ignite.internal.processors.cache.IgniteCacheStartTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheTxCopyOnReadDisabledTest; import org.apache.ignite.internal.processors.cache.IgniteCacheTxNearEnabledStoreValueTest; import org.apache.ignite.internal.processors.cache.IgniteCacheTxNearPeekModesTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheTxPeekModesTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheTxPreloadNoWriteTest; import org.apache.ignite.internal.processors.cache.IgniteCacheTxReplicatedPeekModesTest; import org.apache.ignite.internal.processors.cache.IgniteCacheTxStoreValueTest; -import org.apache.ignite.internal.processors.cache.IgniteClientCacheInitializationFailTest; -import org.apache.ignite.internal.processors.cache.IgniteDiscoDataHandlingInNewClusterTest; import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheFilterTest; import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheMultinodeTest; -import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartCoordinatorFailoverTest; import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartFailTest; -import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartNoExchangeTimeoutTest; -import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheStartStopConcurrentTest; import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheWithConfigStartSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteDynamicClientCacheStartSelfTest; import org.apache.ignite.internal.processors.cache.IgniteExchangeFutureHistoryTest; -import org.apache.ignite.internal.processors.cache.IgniteInternalCacheTypesTest; import org.apache.ignite.internal.processors.cache.IgniteStartCacheInTransactionSelfTest; import org.apache.ignite.internal.processors.cache.IgniteSystemCacheOnClientTest; +import org.apache.ignite.internal.processors.cache.LockTxEntryOneNodeTest; import org.apache.ignite.internal.processors.cache.MarshallerCacheJobRunNodeRestartTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheAffinityEarlyTest; import org.apache.ignite.internal.processors.cache.distributed.CacheDirectoryNameTest; import org.apache.ignite.internal.processors.cache.distributed.CacheDiscoveryDataConcurrentJoinTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheGetFutureHangsSelfTest; import org.apache.ignite.internal.processors.cache.distributed.CacheGroupsPreloadTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheNoValueClassOnServerNodeTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheResultIsNotNullOnPartitionLossTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheStartOnJoinTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheCreatePutMultiNodeSelfTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheCreatePutTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheFailedUpdateResponseTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheReadFromBackupTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheSingleGetMessageTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtTxPreloadSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCacheLockFailoverSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCacheMultiTxLockSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteCrossCacheTxSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheNearTxPreloadSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheNearOnlyTxTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheNearReadCommittedTest; -import org.apache.ignite.internal.processors.cache.distributed.replicated.GridReplicatedTxPreloadTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicLoadAllTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicLoaderWriterTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNearEnabledNoLoadPreviousValueTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNearEnabledNoReadThroughTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNearEnabledNoWriteThroughTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNoLoadPreviousValueTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNoReadThroughTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicNoWriteThroughTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicStoreSessionTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheAtomicStoreSessionWriteBehindTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheJdbcBlobStoreNodeRestartTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxLoadAllTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxLoaderWriterTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNearEnabledNoLoadPreviousValueTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNearEnabledNoReadThroughTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNearEnabledNoWriteThroughTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNoLoadPreviousValueTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNoReadThroughTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxNoWriteThroughTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxStoreSessionTest; import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxStoreSessionWriteBehindCoalescingTest; -import org.apache.ignite.internal.processors.cache.integration.IgniteCacheTxStoreSessionWriteBehindTest; import org.apache.ignite.internal.processors.cache.version.CacheVersionedEntryPartitionedAtomicSelfTest; -import org.apache.ignite.internal.processors.cache.version.CacheVersionedEntryPartitionedTransactionalSelfTest; -import org.apache.ignite.internal.processors.cache.version.CacheVersionedEntryReplicatedAtomicSelfTest; import org.apache.ignite.internal.processors.cache.version.CacheVersionedEntryReplicatedTransactionalSelfTest; import org.apache.ignite.internal.processors.query.ScanQueriesTopologyMappingTest; import org.apache.ignite.testframework.GridTestUtils; @@ -154,7 +96,7 @@ @RunWith(DynamicSuite.class) public class IgniteCacheTestSuite4 { /** - * @return IgniteCache test suite. + * @return Test suite. */ public static List> suite() { return suite(null); @@ -167,171 +109,72 @@ public static List> suite() { public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); - // Multi node update. - GridTestUtils.addTestIfNeeded(suite, GridCacheMultinodeUpdateSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheMultinodeUpdateNearEnabledSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheMultinodeUpdateNearEnabledNoBackupsSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheMultinodeUpdateAtomicSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheMultinodeUpdateAtomicNearEnabledSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicLoadAllTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxLoadAllTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicLoaderWriterTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxLoaderWriterTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicStoreSessionTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxStoreSessionTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicStoreSessionWriteBehindTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxStoreSessionWriteBehindTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxStoreSessionWriteBehindCoalescingTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNoReadThroughTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearEnabledNoReadThroughTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNoReadThroughTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNearEnabledNoReadThroughTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheGetRemoveSkipStoreTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNoLoadPreviousValueTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearEnabledNoLoadPreviousValueTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNoLoadPreviousValueTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNearEnabledNoLoadPreviousValueTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNoWriteThroughTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearEnabledNoWriteThroughTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNoWriteThroughTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNearEnabledNoWriteThroughTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicPeekModesTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearPeekModesTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicReplicatedPeekModesTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxPeekModesTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNearPeekModesTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxReplicatedPeekModesTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheInvokeReadThroughSingleNodeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheInvokeReadThroughTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheReadThroughStoreCallTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheVersionMultinodeTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheNearReadCommittedTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicCopyOnReadDisabledTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxCopyOnReadDisabledTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxPreloadNoWriteTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheMultinodeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartFailTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartCoordinatorFailoverTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheWithConfigStartSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheDynamicStopSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartStopConcurrentTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheConfigurationTemplateTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheConfigurationDefaultTemplateTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteDynamicClientCacheStartSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheStartNoExchangeTimeoutTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheAffinityEarlyTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheCreatePutMultiNodeSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheCreatePutTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheStartOnJoinTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheStartTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteDiscoDataHandlingInNewClusterTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheDiscoveryDataConcurrentJoinTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteClientCacheInitializationFailTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ScanQueriesTopologyMappingTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheFailedUpdateResponseTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, GridCacheTxLoadFromStoreOnLockSelfTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, GridCacheMarshallingNodeJoinSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheJdbcBlobStoreNodeRestartTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicStoreValueTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheAtomicNearEnabledStoreValueTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxStoreValueTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxNearEnabledStoreValueTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheLockFailoverSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheMultiTxLockSelfTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteInternalCacheTypesTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteExchangeFutureHistoryTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheNoValueClassOnServerNodeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteSystemCacheOnClientTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheRemoveAllSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheGetEntryOptimisticReadCommittedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheGetEntryOptimisticRepeatableReadSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheGetEntryOptimisticSerializableSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheGetEntryPessimisticReadCommittedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheGetEntryPessimisticRepeatableReadSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheGetEntryPessimisticSerializableSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheTxNotAllowReadFromBackupTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheStopAndDestroySelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheOffheapMapEntrySelfTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheJdbcStoreSessionListenerSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheStoreSessionListenerLifecycleSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheStoreListenerRWThroughDisabledAtomicCacheTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheStoreListenerRWThroughDisabledTransactionalCacheTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheStoreSessionListenerWriteBehindEnabledTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheStoreWithIgniteTxFailureTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheClientStoreSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheStoreUsageMultinodeStaticStartAtomicTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheStoreUsageMultinodeStaticStartTxTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheStoreUsageMultinodeDynamicStartAtomicTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheStoreUsageMultinodeDynamicStartTxTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheConnectionLeakStoreTxTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, GridCacheStoreManagerDeserializationTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteStartCacheInTransactionSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheReadThroughRestartSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheReadThroughReplicatedRestartSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheReadThroughReplicatedAtomicRestartSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheReadThroughAtomicRestartSelfTest.class, ignoredTests); - - // Versioned entry tests GridTestUtils.addTestIfNeeded(suite, CacheVersionedEntryPartitionedAtomicSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheVersionedEntryPartitionedTransactionalSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheVersionedEntryReplicatedAtomicSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheVersionedEntryReplicatedTransactionalSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheVersionedEntryTransactionalLockTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, LockTxEntryOneNodeTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, CacheOperationContextTransactionalLockTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheDhtTxPreloadSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, GridCacheNearTxPreloadSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridReplicatedTxPreloadTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheGroupsPreloadTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteDynamicCacheFilterTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CrossCacheLockTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCrossCacheTxSelfTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheGetFutureHangsSelfTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheSingleGetMessageTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheReadFromBackupTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, MarshallerCacheJobRunNodeRestartTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheNearOnlyTxTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheContainsKeyAtomicTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheResultIsNotNullOnPartitionLossTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheEventWithTxLabelTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, GridCacheProcessorActiveTxTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheDirectoryNameTest.class, ignoredTests); return suite; diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java index 86735b1dbfbf4..cc426565d8f70 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java @@ -20,36 +20,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.ignite.internal.processors.cache.CacheCreateDestroyClusterReadOnlyModeTest; -import org.apache.ignite.internal.processors.cache.CacheKeepBinaryTransactionTest; -import org.apache.ignite.internal.processors.cache.CacheNearReaderUpdateTest; -import org.apache.ignite.internal.processors.cache.CacheRebalancingSelfTest; import org.apache.ignite.internal.processors.cache.CacheSerializableTransactionsTest; -import org.apache.ignite.internal.processors.cache.ClusterActivationFailureTest; -import org.apache.ignite.internal.processors.cache.ClusterReadOnlyModeTest; -import org.apache.ignite.internal.processors.cache.ClusterStateClientPartitionedSelfTest; -import org.apache.ignite.internal.processors.cache.ClusterStateClientReplicatedSelfTest; -import org.apache.ignite.internal.processors.cache.ClusterStateNoRebalancePartitionedTest; -import org.apache.ignite.internal.processors.cache.ClusterStateNoRebalanceReplicatedTest; -import org.apache.ignite.internal.processors.cache.ClusterStatePartitionedSelfTest; -import org.apache.ignite.internal.processors.cache.ClusterStateReplicatedSelfTest; -import org.apache.ignite.internal.processors.cache.EntryVersionConsistencyReadThroughTest; -import org.apache.ignite.internal.processors.cache.IgniteCachePutStackOverflowSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheStoreCollectionTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheLateAffinityAssignmentNodeJoinValidationTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheLateAffinityAssignmentTest; -import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeCellularSwitchComplexOperationsTest; -import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeCellularSwitchIsolationTest; -import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeCellularSwitchTxContinuationTest; -import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeCellularSwitchTxCountersTest; -import org.apache.ignite.internal.processors.cache.distributed.GridExchangeFreeSwitchTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheGroupsPartitionLossPolicySelfTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCachePartitionLossPolicySelfTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheTxIteratorSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.CacheManualRebalancingTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.RebalanceMetricsTest; -import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheSyncRebalanceModeSelfTest; -import org.apache.ignite.internal.processors.cache.store.IgniteCacheWriteBehindNoUpdateSelfTest; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; import org.junit.runner.RunWith; @@ -74,40 +45,6 @@ public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); GridTestUtils.addTestIfNeeded(suite, CacheSerializableTransactionsTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheNearReaderUpdateTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheStoreCollectionTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheWriteBehindNoUpdateSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCachePutStackOverflowSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheKeepBinaryTransactionTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheLateAffinityAssignmentTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheLateAffinityAssignmentNodeJoinValidationTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeSwitchTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeCellularSwitchComplexOperationsTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeCellularSwitchIsolationTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeCellularSwitchTxContinuationTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridExchangeFreeCellularSwitchTxCountersTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, EntryVersionConsistencyReadThroughTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheSyncRebalanceModeSelfTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheTxIteratorSelfTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, ClusterStatePartitionedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClusterStateClientPartitionedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClusterStateNoRebalancePartitionedTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClusterStateReplicatedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClusterStateClientReplicatedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClusterStateNoRebalanceReplicatedTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClusterReadOnlyModeTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClusterActivationFailureTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheCreateDestroyClusterReadOnlyModeTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCachePartitionLossPolicySelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheGroupsPartitionLossPolicySelfTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheRebalancingSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheManualRebalancingTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, RebalanceMetricsTest.class, ignoredTests); return suite; } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java index c99a42e921a2a..2b29ca6c08598 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java @@ -26,53 +26,29 @@ import org.apache.ignite.internal.processors.cache.ClientFastReplyCoordinatorFailureTest; import org.apache.ignite.internal.processors.cache.IgniteOutOfMemoryPropagationTest; import org.apache.ignite.internal.processors.cache.PartitionedAtomicCacheGetsDistributionTest; -import org.apache.ignite.internal.processors.cache.PartitionedTransactionalOptimisticCacheGetsDistributionTest; import org.apache.ignite.internal.processors.cache.PartitionedTransactionalPessimisticCacheGetsDistributionTest; import org.apache.ignite.internal.processors.cache.PartitionsExchangeCoordinatorFailoverTest; -import org.apache.ignite.internal.processors.cache.ReplicatedAtomicCacheGetsDistributionTest; -import org.apache.ignite.internal.processors.cache.ReplicatedTransactionalOptimisticCacheGetsDistributionTest; -import org.apache.ignite.internal.processors.cache.ReplicatedTransactionalPessimisticCacheGetsDistributionTest; import org.apache.ignite.internal.processors.cache.SysCacheInconsistencyInternalKeyTest; import org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerCoordinatorFailTest; -import org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerDiscoHistoryTest; import org.apache.ignite.internal.processors.cache.distributed.CacheClientsConcurrentStartTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheExchangeMergeMdcTest; import org.apache.ignite.internal.processors.cache.distributed.CacheExchangeMergeTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheParallelStartTest; import org.apache.ignite.internal.processors.cache.distributed.CachePartitionLossWithRestartsTest; -import org.apache.ignite.internal.processors.cache.distributed.CacheTryLockMultithreadedTest; import org.apache.ignite.internal.processors.cache.distributed.ExchangeMergeStaleServerNodesTest; import org.apache.ignite.internal.processors.cache.distributed.GridCachePartitionEvictionDuringReadThroughSelfTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheClientMultiNodeUpdateTopologyLockTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheMultiClientsStartTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheThreadLocalTxTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteOptimisticTxSuspendResumeTest; -import org.apache.ignite.internal.processors.cache.distributed.IgnitePessimisticTxSuspendResumeTest; import org.apache.ignite.internal.processors.cache.distributed.OnePhaseCommitAndNodeLeftTest; import org.apache.ignite.internal.processors.cache.distributed.PartitionsExchangeAwareTest; -import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.latch.ExchangeLatchManagerTest; import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingOrderingTest; import org.apache.ignite.internal.processors.cache.transactions.StartImplicitlyTxOnStopCacheTest; import org.apache.ignite.internal.processors.cache.transactions.TransactionContextCleanupTest; import org.apache.ignite.internal.processors.cache.transactions.TxLabelTest; -import org.apache.ignite.internal.processors.cache.transactions.TxMultiCacheAsyncOpsTest; -import org.apache.ignite.internal.processors.cache.transactions.TxOnCachesStartTest; -import org.apache.ignite.internal.processors.cache.transactions.TxOnCachesStopTest; -import org.apache.ignite.internal.processors.cache.transactions.TxOptimisticOnPartitionExchangeTest; -import org.apache.ignite.internal.processors.cache.transactions.TxOptimisticPrepareOnUnstableTopologyTest; -import org.apache.ignite.internal.processors.cache.transactions.TxOptimisticReadThroughTest; import org.apache.ignite.internal.processors.cache.transactions.TxRollbackAsyncNearCacheTest; import org.apache.ignite.internal.processors.cache.transactions.TxRollbackAsyncTest; -import org.apache.ignite.internal.processors.cache.transactions.TxRollbackDuringPreparingTest; -import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnIncorrectParamsTest; -import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnMapOnInvalidTopologyTest; -import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTimeoutNearCacheTest; -import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTimeoutNoDeadlockDetectionTest; -import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTimeoutOnePhaseCommitTest; import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTimeoutTest; import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTopologyChangeTest; import org.apache.ignite.internal.processors.cache.transactions.TxSavepointItTest; -import org.apache.ignite.internal.processors.cache.transactions.TxStateChangeEventTest; import org.apache.ignite.internal.processors.cache.transactions.TxTimeoutOnInitializationTest; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; @@ -99,62 +75,32 @@ public static List> suite(Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, GridCachePartitionEvictionDuringReadThroughSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteOptimisticTxSuspendResumeTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgnitePessimisticTxSuspendResumeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheExchangeMergeTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheExchangeMergeMdcTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, OnePhaseCommitAndNodeLeftTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, PendingExchangeTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ExchangeMergeStaleServerNodesTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ClientFastReplyCoordinatorFailureTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxRollbackOnTimeoutTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxRollbackOnTimeoutNoDeadlockDetectionTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxRollbackOnTimeoutNearCacheTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheThreadLocalTxTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxRollbackAsyncTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxRollbackAsyncNearCacheTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxRollbackOnTopologyChangeTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxRollbackOnTimeoutOnePhaseCommitTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxTimeoutOnInitializationTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxOptimisticPrepareOnUnstableTopologyTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxLabelTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxRollbackOnIncorrectParamsTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxSavepointItTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxStateChangeEventTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, TxMultiCacheAsyncOpsTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, TxOnCachesStartTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxOnCachesStopTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCacheMultiClientsStartTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteOutOfMemoryPropagationTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheIgniteOutOfMemoryExceptionTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ReplicatedAtomicCacheGetsDistributionTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ReplicatedTransactionalOptimisticCacheGetsDistributionTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ReplicatedTransactionalPessimisticCacheGetsDistributionTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, PartitionedAtomicCacheGetsDistributionTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, PartitionedTransactionalOptimisticCacheGetsDistributionTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, PartitionedTransactionalPessimisticCacheGetsDistributionTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxOptimisticOnPartitionExchangeTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, TxOptimisticReadThroughTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteExchangeLatchManagerCoordinatorFailTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteExchangeLatchManagerDiscoHistoryTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ExchangeLatchManagerTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, PartitionsExchangeCoordinatorFailoverTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CacheTryLockMultithreadedTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheParallelStartTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheNoAffinityExchangeTest.class, ignoredTests); @@ -164,14 +110,10 @@ public static List> suite(Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingOrderingTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheClientMultiNodeUpdateTopologyLockTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxRollbackOnMapOnInvalidTopologyTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, PartitionsExchangeAwareTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, SysCacheInconsistencyInternalKeyTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxRollbackDuringPreparingTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, StartImplicitlyTxOnStopCacheTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TransactionContextCleanupTest.class, ignoredTests); diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite8.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite8.java index 7e238e85f0ba5..2c0d0a796d8ec 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite8.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite8.java @@ -20,20 +20,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.ignite.cache.ClientCreateCacheGroupOnJoinNodeMapsTest; -import org.apache.ignite.internal.processors.cache.CacheStoreTxPutAllMultiNodeTest; -import org.apache.ignite.internal.processors.cache.GridCacheOrderedPreloadingSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCachePutKeyAttachedBinaryObjectTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRabalancingDelayedPartitionMapExchangeSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalanceOrderTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingAsyncSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingCancelTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingSyncCheckDataTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingSyncSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingUnmarshallingFailedSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.rebalancing.MultiDcRebalancingTest; -import org.apache.ignite.internal.processors.cache.persistence.CleanupRestoredCachesSlowTest; -import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; import org.junit.runner.RunWith; @@ -62,30 +48,9 @@ public static List> suite(Collection ignoredTests) { // Topology validator. suite.addAll(IgniteTopologyValidatorTestSuite.suite(ignoredTests)); - // Eviction. - suite.addAll(IgniteCacheEvictionSelfTestSuite.suite(ignoredTests)); - // Iterators. suite.addAll(IgniteCacheIteratorsSelfTestSuite.suite(ignoredTests)); - // Rebalancing. - GridTestUtils.addTestIfNeeded(suite, GridCacheOrderedPreloadingSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheRebalanceOrderTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingSyncSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingSyncCheckDataTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingUnmarshallingFailedSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingAsyncSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheRabalancingDelayedPartitionMapExchangeSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, GridCacheRebalancingCancelTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, MultiDcRebalancingTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CacheStoreTxPutAllMultiNodeTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, CleanupRestoredCachesSlowTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, ClientCreateCacheGroupOnJoinNodeMapsTest.class, ignoredTests); - - GridTestUtils.addTestIfNeeded(suite, IgniteCachePutKeyAttachedBinaryObjectTest.class, ignoredTests); - return suite; } } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java index 0ff129fee5825..af9336bf82031 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java @@ -20,31 +20,18 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.ignite.internal.processors.cache.CachePutIfAbsentTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheGetCustomCollectionsSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheLoadRebalanceEvictionSelfTest; import org.apache.ignite.internal.processors.cache.distributed.CacheAtomicPrimarySyncBackPressureTest; import org.apache.ignite.internal.processors.cache.distributed.CacheOperationsInterruptTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteCachePrimarySyncTest; -import org.apache.ignite.internal.processors.cache.distributed.IgniteTxCachePrimarySyncTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteTxCacheWriteSynchronizationModesMultithreadedTest; import org.apache.ignite.internal.processors.cache.distributed.IgniteTxConcurrentRemoveObjectsTest; -import org.apache.ignite.internal.processors.cache.transactions.PartitionUpdateCounterTest; import org.apache.ignite.internal.processors.cache.transactions.TxCrossCachePartitionConsistencyTest; import org.apache.ignite.internal.processors.cache.transactions.TxDataConsistencyOnCommitFailureTest; -import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateConsistencyHistoryRebalanceTest; import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateConsistencyNoopInvokeTest; -import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateConsistencyTest; -import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateConsistencyVolatileRebalanceTest; -import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryOneBackupHistoryRebalanceTest; -import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryOneBackupTest; import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryTwoBackupsFailAllHistoryRebalanceTest; import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryTwoBackupsFailAllTest; -import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryTwoBackupsHistoryRebalanceTest; import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateOnePrimaryTwoBackupsTest; -import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStatePutTest; import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateTwoPrimaryTwoBackupsTest; -import org.apache.ignite.internal.processors.cache.transactions.TxPartitionCounterStateWithFilterTest; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; import org.junit.runner.RunWith; @@ -68,12 +55,8 @@ public static List> suite() { public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheGetCustomCollectionsSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteCacheLoadRebalanceEvictionSelfTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCachePrimarySyncTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteTxCachePrimarySyncTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteTxCacheWriteSynchronizationModesMultithreadedTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, CachePutIfAbsentTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, CacheAtomicPrimarySyncBackPressureTest.class, ignoredTests); @@ -84,19 +67,10 @@ public static List> suite(Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, CacheOperationsInterruptTest.class, ignoredTests); // Update counters and historical rebalance. - GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryOneBackupHistoryRebalanceTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryOneBackupTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryTwoBackupsFailAllHistoryRebalanceTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryTwoBackupsFailAllTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryTwoBackupsHistoryRebalanceTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateOnePrimaryTwoBackupsTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStatePutTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateTwoPrimaryTwoBackupsTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateWithFilterTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, PartitionUpdateCounterTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateConsistencyTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateConsistencyHistoryRebalanceTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateConsistencyVolatileRebalanceTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxCrossCachePartitionConsistencyTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, TxPartitionCounterStateConsistencyNoopInvokeTest.class, ignoredTests); diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite.java index 83a0f0eceb069..1c5c0b9e2e8cc 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite.java @@ -21,11 +21,6 @@ import java.util.Collection; import java.util.List; import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteClusterSnapshotSelfTest; -import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotManagerSelfTest; -import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotRemoteRequestTest; -import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotRestoreFromRemoteMdcTest; -import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotRestoreFromRemoteTest; -import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotWithMetastorageTest; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; import org.junit.runner.RunWith; @@ -45,10 +40,5 @@ public static List> suite() { /** */ public static void addSnapshotTests(List> suite, Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, IgniteClusterSnapshotSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotManagerSelfTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotRemoteRequestTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotRestoreFromRemoteMdcTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotRestoreFromRemoteTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotWithMetastorageTest.class, ignoredTests); } } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite2.java index 71165886a9dc7..6432a80a9f160 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite2.java @@ -20,8 +20,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteClusterSnapshotCheckTest; -import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteClusterSnapshotHandlerTest; import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteClusterSnapshotRestoreSelfTest; import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotMXBeanTest; import org.apache.ignite.testframework.GridTestUtils; @@ -43,8 +41,6 @@ public static List> suite() { /** */ public static void addSnapshotTests1(List> suite, Collection ignoredTests) { - GridTestUtils.addTestIfNeeded(suite, IgniteClusterSnapshotCheckTest.class, ignoredTests); - GridTestUtils.addTestIfNeeded(suite, IgniteClusterSnapshotHandlerTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotMXBeanTest.class, ignoredTests); } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite4.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite4.java index 633db0b11c8ad..86131e32f20f0 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite4.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite4.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.processors.cache.persistence.snapshot.dump.IgniteCacheDumpFilterTest; import org.apache.ignite.internal.processors.cache.persistence.snapshot.dump.IgniteCacheDumpSelf2Test; import org.apache.ignite.internal.processors.cache.persistence.snapshot.dump.IgniteCacheDumpSelfTest; +import org.apache.ignite.internal.processors.cache.persistence.snapshot.dump.IgniteCacheDumpSeveralDiskTest; import org.apache.ignite.internal.processors.cache.persistence.snapshot.dump.IgniteConcurrentCacheDumpTest; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; @@ -50,5 +51,6 @@ public static void addSnapshotTests(List> suite, Collection igno GridTestUtils.addTestIfNeeded(suite, IgniteConcurrentCacheDumpTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteCacheDumpFilterTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, BufferedFileIOTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteCacheDumpSeveralDiskTest.class, ignoredTests); } } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite7.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite7.java new file mode 100644 index 0000000000000..e8cb24cb9dbeb --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite7.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotManagerSelfTest; +import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotRemoteRequestTest; +import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotRestoreFromRemoteMdcTest; +import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotRestoreFromRemoteTest; +import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotWithMetastorageTest; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.DynamicSuite; +import org.junit.runner.RunWith; + +/** + * Split off from {@link IgniteSnapshotTestSuite} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(DynamicSuite.class) +public class IgniteSnapshotTestSuite7 { + /** + * @return Test suite. + */ + public static List> suite() { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + */ + public static List> suite(Collection ignoredTests) { + List> suite = new ArrayList<>(); + + GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotManagerSelfTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotRemoteRequestTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotRestoreFromRemoteMdcTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotRestoreFromRemoteTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteSnapshotWithMetastorageTest.class, ignoredTests); + + return suite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite8.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite8.java new file mode 100644 index 0000000000000..5673ed2b71af3 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSnapshotTestSuite8.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteClusterSnapshotCheckTest; +import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteClusterSnapshotHandlerTest; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.DynamicSuite; +import org.junit.runner.RunWith; + +/** + * Split off from {@link IgniteSnapshotTestSuite2} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(DynamicSuite.class) +public class IgniteSnapshotTestSuite8 { + /** + * @return Test suite. + */ + public static List> suite() { + return suite(null); + } + + /** + * @param ignoredTests Tests to ignore. + * @return Test suite. + */ + public static List> suite(Collection ignoredTests) { + List> suite = new ArrayList<>(); + + GridTestUtils.addTestIfNeeded(suite, IgniteClusterSnapshotCheckTest.class, ignoredTests); + GridTestUtils.addTestIfNeeded(suite, IgniteClusterSnapshotHandlerTest.class, ignoredTests); + + return suite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java index 5b85617c0fce5..517d528e3a0e5 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java @@ -18,75 +18,39 @@ package org.apache.ignite.testsuites; import org.apache.ignite.internal.IgniteDiscoveryMassiveNodeFailTest; -import org.apache.ignite.spi.ExponentialBackoffTimeoutStrategyTest; import org.apache.ignite.spi.GridTcpSpiForwardingSelfTest; import org.apache.ignite.spi.discovery.AuthenticationRestartTest; -import org.apache.ignite.spi.discovery.DiscoverySpiDataExchangeTest; -import org.apache.ignite.spi.discovery.FilterDataForClientNodeDiscoveryTest; -import org.apache.ignite.spi.discovery.IgniteClientReconnectEventHandlingTest; -import org.apache.ignite.spi.discovery.IgniteDiscoveryCacheReuseSelfTest; -import org.apache.ignite.spi.discovery.LongClientConnectToClusterTest; import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterClientRoutingTest; import org.apache.ignite.spi.discovery.datacenter.MultiDataCenterDeploymentTest; import org.apache.ignite.spi.discovery.tcp.DiscoveryClientSocketTest; -import org.apache.ignite.spi.discovery.tcp.DiscoveryDeserializationExceptionTest; import org.apache.ignite.spi.discovery.tcp.DiscoverySerializationExceptionTest; -import org.apache.ignite.spi.discovery.tcp.DiscoveryUnmarshalVulnerabilityTest; -import org.apache.ignite.spi.discovery.tcp.IgniteClientConnectSslTest; import org.apache.ignite.spi.discovery.tcp.IgniteClientConnectTest; import org.apache.ignite.spi.discovery.tcp.IgniteClientReconnectMassiveShutdownSslTest; -import org.apache.ignite.spi.discovery.tcp.IgniteClientReconnectMassiveShutdownTest; -import org.apache.ignite.spi.discovery.tcp.IgniteMetricsOverflowTest; -import org.apache.ignite.spi.discovery.tcp.MultiDataCenterRingTest; -import org.apache.ignite.spi.discovery.tcp.MultiDataCenterSplitTest; import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoveryMarshallerCheckSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiCoordinatorChangeTest; import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiFailureTimeoutSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiMulticastTest; -import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoveryUnresolvedHostTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryClientSuspensionSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryConcurrentStartTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryCoordinatorFailureTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryDeadNodeAddressResolvingTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryFailedJoinTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderCleanerTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMdcSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMultiThreadedTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeAttributesUpdateOnReconnectTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeConfigConsistentIdSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeConsistentIdSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeJoinAndFailureTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryMdcReversedTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryMdcTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryReconnectUnstableTopologyTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryRestartTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySegmentationPolicyTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySnapshotHistoryTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiConfigSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiFailureTimeoutSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiMBeanTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiReconnectDelayTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiSslSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiStartStopSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiWildcardSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySslParametersTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySslSecuredUnsecuredTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySslSelfTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySslTrustedSelfTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySslTrustedUntrustedTest; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryWithAddressFilterTest; import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryWithWrongServerTest; -import org.apache.ignite.spi.discovery.tcp.TestMetricUpdateFailure; import org.apache.ignite.spi.discovery.tcp.ipfinder.jdbc.TcpDiscoveryJdbcIpFinderSelfTest; -import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinderSelfTest; -import org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinderSelfTest; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinderDnsResolveTest; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinderSelfTest; import org.apache.ignite.testframework.GridTestUtils; @@ -103,41 +67,22 @@ @Suite.SuiteClasses({ TcpDiscoveryVmIpFinderDnsResolveTest.class, TcpDiscoveryVmIpFinderSelfTest.class, - TcpDiscoverySharedFsIpFinderSelfTest.class, TcpDiscoveryJdbcIpFinderSelfTest.class, - TcpDiscoveryMulticastIpFinderSelfTest.class, TcpDiscoveryIpFinderCleanerTest.class, - TcpDiscoverySelfTest.class, TcpDiscoverySpiSelfTest.class, - TcpDiscoverySpiSslSelfTest.class, TcpDiscoverySpiWildcardSelfTest.class, - TcpDiscoverySpiFailureTimeoutSelfTest.class, - TcpDiscoverySpiMBeanTest.class, TcpDiscoverySpiStartStopSelfTest.class, TcpDiscoverySpiConfigSelfTest.class, - TcpDiscoverySnapshotHistoryTest.class, TcpDiscoveryNodeJoinAndFailureTest.class, GridTcpSpiForwardingSelfTest.class, - ExponentialBackoffTimeoutStrategyTest.class, - - TcpClientDiscoverySpiSelfTest.class, - LongClientConnectToClusterTest.class, TcpClientDiscoveryMarshallerCheckSelfTest.class, - TcpClientDiscoverySpiCoordinatorChangeTest.class, TcpClientDiscoverySpiMulticastTest.class, TcpClientDiscoverySpiFailureTimeoutSelfTest.class, - TcpClientDiscoveryUnresolvedHostTest.class, - - TcpDiscoveryNodeConsistentIdSelfTest.class, - TcpDiscoveryNodeConfigConsistentIdSelfTest.class, - TcpDiscoveryRestartTest.class, TcpDiscoveryMultiThreadedTest.class, - TcpDiscoveryMetricsWarnLogTest.class, - TcpDiscoveryConcurrentStartTest.class, TcpDiscoverySegmentationPolicyTest.class, @@ -146,65 +91,37 @@ TcpDiscoveryWithWrongServerTest.class, - TcpDiscoveryWithAddressFilterTest.class, - TcpDiscoverySpiReconnectDelayTest.class, - TcpDiscoveryNetworkIssuesTest.class, - IgniteDiscoveryMassiveNodeFailTest.class, TcpDiscoveryCoordinatorFailureTest.class, - TestMetricUpdateFailure.class, - // Client connect. IgniteClientConnectTest.class, - IgniteClientConnectSslTest.class, - IgniteClientReconnectMassiveShutdownTest.class, IgniteClientReconnectMassiveShutdownSslTest.class, TcpDiscoveryClientSuspensionSelfTest.class, - IgniteClientReconnectEventHandlingTest.class, TcpDiscoveryFailedJoinTest.class, // SSL. - TcpDiscoverySslSelfTest.class, TcpDiscoverySslTrustedSelfTest.class, TcpDiscoverySslSecuredUnsecuredTest.class, - TcpDiscoverySslTrustedUntrustedTest.class, TcpDiscoverySslParametersTest.class, // Disco cache reuse. - IgniteDiscoveryCacheReuseSelfTest.class, - - DiscoveryUnmarshalVulnerabilityTest.class, - - FilterDataForClientNodeDiscoveryTest.class, TcpDiscoveryPendingMessageDeliveryTest.class, TcpDiscoveryReconnectUnstableTopologyTest.class, - IgniteMetricsOverflowTest.class, - DiscoveryClientSocketTest.class, - DiscoverySpiDataExchangeTest.class, - - TcpDiscoveryIpFinderFailureTest.class, - - TcpDiscoveryDeadNodeAddressResolvingTest.class, - DiscoverySerializationExceptionTest.class, - DiscoveryDeserializationExceptionTest.class, // MDC. TcpDiscoveryMdcSelfTest.class, TcpDiscoveryPendingMessageDeliveryMdcTest.class, - TcpDiscoveryPendingMessageDeliveryMdcReversedTest.class, MultiDataCenterDeploymentTest.class, - MultiDataCenterRingTest.class, - MultiDataCenterSplitTest.class, MultiDataCenterClientRoutingTest.class }) public class IgniteSpiDiscoverySelfTestSuite { diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite2.java new file mode 100644 index 0000000000000..c35d838d0550d --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite2.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import org.apache.ignite.spi.ExponentialBackoffTimeoutStrategyTest; +import org.apache.ignite.spi.discovery.DiscoverySpiDataExchangeTest; +import org.apache.ignite.spi.discovery.FilterDataForClientNodeDiscoveryTest; +import org.apache.ignite.spi.discovery.IgniteClientReconnectEventHandlingTest; +import org.apache.ignite.spi.discovery.IgniteDiscoveryCacheReuseSelfTest; +import org.apache.ignite.spi.discovery.LongClientConnectToClusterTest; +import org.apache.ignite.spi.discovery.tcp.DiscoveryDeserializationExceptionTest; +import org.apache.ignite.spi.discovery.tcp.DiscoveryUnmarshalVulnerabilityTest; +import org.apache.ignite.spi.discovery.tcp.IgniteClientConnectSslTest; +import org.apache.ignite.spi.discovery.tcp.IgniteClientReconnectMassiveShutdownTest; +import org.apache.ignite.spi.discovery.tcp.IgniteMetricsOverflowTest; +import org.apache.ignite.spi.discovery.tcp.MultiDataCenterRingTest; +import org.apache.ignite.spi.discovery.tcp.MultiDataCenterSplitTest; +import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiCoordinatorChangeTest; +import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpiSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoveryUnresolvedHostTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryConcurrentStartTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryDeadNodeAddressResolvingTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryIpFinderFailureTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryMetricsWarnLogTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNetworkIssuesTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeConfigConsistentIdSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryNodeConsistentIdSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryPendingMessageDeliveryMdcReversedTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryRestartTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySnapshotHistoryTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiFailureTimeoutSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiMBeanTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpiSslSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySslSelfTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySslTrustedUntrustedTest; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoveryWithAddressFilterTest; +import org.apache.ignite.spi.discovery.tcp.TestMetricUpdateFailure; +import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinderSelfTest; +import org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinderSelfTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Split off from {@link IgniteSpiDiscoverySelfTestSuite} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + TcpDiscoverySharedFsIpFinderSelfTest.class, + TcpDiscoveryMulticastIpFinderSelfTest.class, + TcpDiscoverySelfTest.class, + TcpDiscoverySpiSslSelfTest.class, + TcpDiscoverySpiFailureTimeoutSelfTest.class, + TcpDiscoverySpiMBeanTest.class, + TcpDiscoverySnapshotHistoryTest.class, + ExponentialBackoffTimeoutStrategyTest.class, + TcpClientDiscoverySpiSelfTest.class, + LongClientConnectToClusterTest.class, + TcpClientDiscoverySpiCoordinatorChangeTest.class, + TcpClientDiscoveryUnresolvedHostTest.class, + TcpDiscoveryNodeConsistentIdSelfTest.class, + TcpDiscoveryNodeConfigConsistentIdSelfTest.class, + TcpDiscoveryRestartTest.class, + TcpDiscoveryMetricsWarnLogTest.class, + TcpDiscoveryConcurrentStartTest.class, + TcpDiscoveryWithAddressFilterTest.class, + TcpDiscoveryNetworkIssuesTest.class, + TestMetricUpdateFailure.class, + IgniteClientConnectSslTest.class, + IgniteClientReconnectMassiveShutdownTest.class, + IgniteClientReconnectEventHandlingTest.class, + TcpDiscoverySslSelfTest.class, + TcpDiscoverySslTrustedUntrustedTest.class, + IgniteDiscoveryCacheReuseSelfTest.class, + DiscoveryUnmarshalVulnerabilityTest.class, + FilterDataForClientNodeDiscoveryTest.class, + IgniteMetricsOverflowTest.class, + DiscoverySpiDataExchangeTest.class, + TcpDiscoveryIpFinderFailureTest.class, + TcpDiscoveryDeadNodeAddressResolvingTest.class, + DiscoveryDeserializationExceptionTest.class, + TcpDiscoveryPendingMessageDeliveryMdcReversedTest.class, + MultiDataCenterRingTest.class, + MultiDataCenterSplitTest.class, +}) +public class IgniteSpiDiscoverySelfTestSuite2 { +} diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridIntListSelfTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridIntListSelfTest.java index 095eb32918898..a5164387e32b7 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridIntListSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridIntListSelfTest.java @@ -97,6 +97,18 @@ public void testSort() { assertEquals(asList(0, 1, 3, 4, 5), list.sort()); } + /** */ + @Test + public void testCopyOfRange() { + assertEquals(asList(), asList(1).copyOfRange(0, 0)); + assertEquals(asList(1), asList(1).copyOfRange(0, 1)); + assertEquals(asList(), asList(1, 2).copyOfRange(1, 1)); + assertEquals(asList(1), asList(1, 2).copyOfRange(0, 1)); + assertEquals(asList(2), asList(1, 2).copyOfRange(1, 2)); + assertEquals(asList(2, 3), asList(1, 2, 3).copyOfRange(1, 3)); + assertEquals(asList(1, 2), asList(1, 2, 3).copyOfRange(0, 2)); + } + /** */ private GridIntList asList(int... vals) { return new GridIntList(vals); diff --git a/modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java b/modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java index 329f334337488..28444ed73f487 100644 --- a/modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java +++ b/modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java @@ -74,7 +74,7 @@ public class TestCollectionsMessageSerializer implements MessageSerializer { /** */ private final static MessageArrayType strArrCollDesc = new MessageArrayType(new MessageItemType(MessageCollectionItemType.STRING), String.class); /** */ - private final static MessageArrayType verArrCollDesc = new MessageArrayType(new MessageItemType(MessageCollectionItemType.MSG), GridCacheVersion.class); + private final static MessageArrayType verArrCollDesc = new MessageArrayType(new MessageItemType(MessageCollectionItemType.GRID_CACHE_VERSION), GridCacheVersion.class); /** */ @Override public boolean writeTo(TestMessage msg, MessageWriter writer) { @@ -80,7 +80,7 @@ public class TestMessageSerializer implements MessageSerializer { writer.incrementState(); case 5: - if (!writer.writeMessage(msg.ver)) + if (!writer.writeGridCacheVersion(msg.ver)) return false; writer.incrementState(); @@ -187,7 +187,7 @@ public class TestMessageSerializer implements MessageSerializer { reader.incrementState(); case 5: - msg.ver = reader.readMessage(); + msg.ver = reader.readGridCacheVersion(); if (!reader.isLastRead()) return false; diff --git a/modules/core/src/test/webapp/WEB-INF/web.xml b/modules/core/src/test/webapp/WEB-INF/web.xml index e3523c76af007..a1451584cc434 100644 --- a/modules/core/src/test/webapp/WEB-INF/web.xml +++ b/modules/core/src/test/webapp/WEB-INF/web.xml @@ -17,11 +17,11 @@ limitations under the License. --> - + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee + https://jakarta.ee/xml/ns/jakartaee/web-app_6_1.xsd" + version="6.1"> diff --git a/modules/ducktests/README.md b/modules/ducktests/README.md index e539db2a3dcf2..3d56ca33f292d 100644 --- a/modules/ducktests/README.md +++ b/modules/ducktests/README.md @@ -1,311 +1,312 @@ -# Overview -The `ignitetest` framework provides basic functionality and services -to write integration tests for Apache Ignite. This framework bases on -the `ducktape` test framework, for information about it check the links: -- https://github.com/confluentinc/ducktape - source code of the `ducktape`. -- https://ducktape.readthedocs.io/en/latest/index.html - documentation to the `ducktape`. - -Structure of the `tests` directory is: -- `./ignitetest/services` contains basic services functionality. -- `./ignitetest/utils` contains utils for testing. -- `./ignitetest/tests` contains tests. -- `./checks` contains unit tests of utils, tests' decorators etc. - -Some tests (like the CDC replication ones) require modules maintained in the -separate [ignite-extensions](https://github.com/apache/ignite-extensions) repository. - -To run these tests the `ignite-extensions` working directory should be checked out -to the same filesystem level next to the `ignite` one. So it should be the below structure -of directories: -- `./ignite` working directory checked out from the ignite repository (mentioned as `${IGNITE_HOME}` below) -- `./ignite-extensions` working directory checked out from the ignite-extensions repository - -The needed extension module should be built before tests run. - -For example for the CDC replication tests the `cdc-ext` module should be built as: -``` -cd ${IGNITE_HOME}\..\ignite-extensions -mvn clean package -pl :ignite-cdc-ext -Pskip-docs -DskipTests -``` +# Apache Ignite Integration Test Framework - Ducktests + +The `ignitetest` framework provides basic functionality and services to write integration tests for Apache Ignite. This framework is built on top of the **ducktape** test framework. +* For core concepts, see the [ducktape source code](https://github.com/confluentinc/ducktape). +* For framework details, see the [ducktape documentation](https://ducktape.readthedocs.io/en/latest/index.html). + +### Repository Structure +All paths below are relative to `${IGNITE_HOME}/modules/ducktests/tests`: +* `./ignitetest/services`: Contains basic services and cluster orchestration logic. +* `./ignitetest/utils`: Contains testing helper utilities. +* `./ignitetest/tests`: Contains the actual integration test scenarios. +* `./checks`: Contains internal framework unit tests and style decorators. + +--- + +## Quick Start (Local Docker Run) + +Docker is used to emulate a distributed multi-node cluster environment where each individual container acts as a running cluster node. + +### 1. Prerequisites +* **Docker** installed and running on your host system. +* **Python >= 3.8** installed on your host system (required only for local environment scripts and development). + +### 2. Prepare the Environment & Code +Execute these preparation steps from the root directory of your project: + +> **WARNING:** Building and compiling the Apache Ignite project is strictly mandatory. You must run `mvn clean install` to generate the local Maven artifacts. Skipping this step will cause the Ignite service startup to fail with a `ClassNotFoundException`. + +```bash +# 1. Change your current directory to the Ignite root +cd \${IGNITE_HOME} -# Local run -Docker is used to emulate distributed environment. Single container represents -a running node. +# 2. Build and install Apache Ignite artifacts locally +mvn clean install -DskipTests -## Requirements -To just start tests locally the only requirement is preinstalled `docker`. -For development process requirements are `python` >= 3.7. +# 3. Build the Apache Ignite ducktests modules +./scripts/build-module.sh ducktests -## Run tests -- Change a current directory to`${IGNITE_HOME}` -- Build Apache IGNITE invoking `${IGNITE_HOME}/scripts/build-module.sh ducktests` -- (Optionally) Build the needed extension modules in the `${IGNITE_HOME}\..\ignite-extensions` directory -- Change a current directory to `${IGNITE_HOME}/modules/ducktests/tests` -- Run tests in docker containers using a following command: +# 4. Navigate into the ducktests directory +cd modules/ducktests/tests ``` -./docker/run_tests.sh + +### 3. Preparing the Local Environment +Run the following commands from your host system's shell inside `${IGNITE_HOME}/modules/ducktests/tests`: +```bash +# Create and activate an isolated development virtual environment +python3 -m venv ~/.virtualenvs/ignite-ducktests-dev +source ~/.virtualenvs/ignite-ducktests-dev/bin/activate + +# Install core framework testing requirements and editable dependencies +pip install -r docker/requirements-dev.txt +pip install -e . ``` -- For detailed help and instructions, use a following command: + +> If your environment is configured to look only at internal or restricted artifact registries, `pip install` may fail to find specific package versions. +> +> To resolve this, append the public PyPI mirror to your installation command: + +```bash +pip install -r docker/requirements-dev.txt --extra-index-url https://pypi.org/simple ``` -./docker/run_tests.sh --help + +### 4. Run a Smoke Test +Run the test runner script by pointing it directly to a specific smoke test target. The script will automatically build the required container images, bring up the necessary nodes, and run the test scenario: + +```bash +./docker/run_tests.sh -t ./ignitetest/tests/smoke_test.py::SmokeServicesTest.test_ignite_start_stop -n 3 --global-json '{"cluster_size": 2}' ``` -- Test reports, including service logs, are located in the `${IGNITE_HOME}/results` directory. -## Runned tests management -- Tear down all the currently active ducker-ignite nodes using a following command: +### 5. What a Successful Run Looks Like +When the test runs successfully, your terminal output will display discovery logs followed by a clean execution matrix report: + +```text +[INFO]: Discovered 1 tests to run +[INFO]: starting test run with session id 2026-06-25--004... +[INFO]: running 1 tests... +[INFO]: RunnerClient: ... SmokeServicesTest.test_ignite_start_stop: Running... +[INFO]: RunnerClient: ... SmokeServicesTest.test_ignite_start_stop: PASS +================================================================================ +SESSION REPORT (ALL TESTS) +ducktape version: 0.13.0 +run time: 6.554 seconds +tests run: 1 +passed: 1 +failed: 0 +================================================================================ +test_id: ...SmokeServicesTest.test_ignite_start_stop +status: PASS ``` + +### 6. Managing and Cleaning Containers +Always clean up and tear down active background nodes after your test runs finish to free up local resources: +```bash +# Display detailed help options and arguments +./docker/run_tests.sh --help + +# Stop and remove all currently active ducker-ignite cluster nodes ./docker/clean_up.sh ``` -# Real environment run -[Ducktape](https://ducktape.readthedocs.io/en/latest/index.html) allow runs on -Custom cluster, Vagrant, K8s, Mesos, Docker, cloud providers, etc. - -## Requirements -- Set up the cluster. - See `./docker/Dockerfile` for servers setup hints. - -## Run tests -- Change a current directory to`${IGNITE_HOME}` -- Build Apache IGNITE invoking `${IGNITE_HOME}/scripts/build-module.sh ducktests` -- (Optionally) Build the needed extension modules in the `${IGNITE_HOME}\..\ignite-extensions` directory -- Run tests using [Ducktape](https://ducktape.readthedocs.io/en/latest/run_tests.html). \ - For example: - ``` - ducktape --results-root=./results --cluster-file=./cluster.json --repeat 1 --max-parallel 16 ./modules/ducktests/tests/ignitetest - ``` -# Custom Ignites (forks) testing -## Run all tests -### Setup -Any version of Apache Ignite, or it's fork, can be tested. -Binary releases supported as well as compiled sources. - -- Binary releases should be located at `/opt` directory, eg. `/opt/ignite-2.11.0`. -- Source releases also should be located at `/opt` directory, but should be compiled before the first use.\ - Use the following command to compile sources properly: - ``` - ./scripts/build-module.sh ducktests - ``` -You may replace `/opt` with custom directory by setting `install_root` globals param. \ -For example, `--globals-json, eg: {"install_root": "/dir42"}` +--- -### Execution -You may set versions (products) using `@ignite_versions` decorator at code -``` -@ignite_versions(str(DEV_BRANCH), str(LATEST)) -``` -or passing versions set via globals during the execution -``` ---global-json, eg: {"ignite_versions":["2.8.1", "dev"]} -``` -You may also specify product prefix by `project` param at globals, for example: -``` ---global-json, eg: {"project": "fork" ,"ignite_versions": ["ignite-2.8.1", "2.8.1", "dev"]} -``` -will execute tests on `ignite-2.8.1, fork-2.8.1, fork-dev` +## Local Development & Code Checks -## Run tests from the external source/repository -TBD +To modify framework logic or contribute features locally without depending on Docker container environments, isolate your development runtime dependencies. -# Special runs -## Run with FlightRecorder (JFR) -To run ignite with flight recorder you should enable `jfr_enabled` through globals, for example: -``` ---global-json, eg: {"jfr_enabled":true} -``` -## Run with safepoints logging -Safepoint logging is disabled by default, to enable it, you need to pass `true` for `safepoint_log_enabled` for example: -``` ---global-json, eg: {"safepoint_log_enabled":true} -``` -## Run with enabled security -### Run with SSL enabled -To enable ssl it is only required to pass `enabled` for `ssl` in globals: -``` ---global-json, eg: {"ssl":{"enabled":true}} +### 1. Activate the Local Environment +Run the following commands from your host system's shell inside `${IGNITE_HOME}/modules/ducktests/tests`: +```bash +# Activate an isolated development virtual environment +source ~/.virtualenvs/ignite-ducktests-dev/bin/activate ``` -In this case, all ssl params will be set to default values, and will be written to ignite config. -These values correspond to the keystores that are generated (and you shouldn't worry about it). -Default keystores for these services are generated automatically on creating environment. -If you want, you could override these values through globals, for example: -``` - {"ssl": { - "enabled": true, - "params": { - "server": { - "key_store_jks": "server.jks", - "key_store_password": "123456", - "trust_store_jks": "truststore.jks", - "trust_store_password": "123456" - }, - "client": { - "key_store_jks": "client.jks", - "key_store_password": "123456", - "trust_store_jks": "truststore.jks", - "trust_store_password": "123456" - }, - "admin": { - "key_store_jks": "admin.jks", - "key_store_password": "123456", - "trust_store_jks": "truststore.jks", - "trust_store_password": "123456" - } - } - } - } +### 2. Running Linters and Unit Tests +```bash +# Execute local framework utility unit tests +pytest + +# Enforce uniform codebase style rules +flake8 ``` -Where: -Server, client and admin are three possible interactions with a cluster in a ducktape, each of them has its own alias, -which corresponds to keystore: -* Ignite(clientMode = False) - server -* Ignite(clientMode = True) - client -* ControlUtility - admin +### 3. Testing Across Multiple Python Versions (Optional) +To locally simulate validation matrices across distinct target runtimes (e.g., Python 3.8, 3.9) using `tox`: +1. Install [pyenv](https://github.com/pyenv/pyenv#installation) onto your machine. +2. Download target runtimes and initialize your runtime shell profile context: + ```bash + pyenv install 3.8 + pyenv install 3.9 + pyenv shell 3.8 3.9 + ``` +3. Install `tox` and run the validation suite: + ```bash + pip install tox + tox + tox -r -e codestyle,py3 + ``` + +--- -And options `key_store_jks` and `trust_store_jks` are paths to keys. -If you start it with `/` it will be used as an absolute path. -Otherwise, it will be a relative path that starts from `/mnt/service/shared/`. +## Testing with Ignite Extensions -And if you need to specify values only for one configuration, you can skip other configurations, for example: +Some integration tests (such as CDC replication scenarios) require additional modules maintained in the separate [ignite-extensions](https://github.com/apache/ignite-extensions) repository. +### Setup Directory Structure +To run these tests, the `ignite-extensions` working directory **must** be checked out at the exact same filesystem level as your main `ignite` repository: +```text + your-development-folder/ +├── ignite/ <- Checked out from the main ignite repository (${IGNITE_HOME}) +└── ignite-extensions/ <- Checked out from the ignite-extensions repository ``` - {"ssl": { - "enabled": true, - "params": { - "server": { - "key_store_jks": "server.jks", - "key_store_password": "123456", - "trust_store_jks": "truststore.jks", - "trust_store_password": "123456" - } - } - } - } + +### Building the Extensions +The target extension module must be compiled on your host before running the test suite. For example, to prepare the `cdc-ext` module: +```bash +cd ${IGNITE_HOME}/../ignite-extensions +mvn clean package -pl :ignite-cdc-ext -Pskip-docs -DskipTests ``` +*Note: The local docker startup script automatically handles binding this directory inside the containers if the folder structure matches.* -For more information about ssl in ignite you can check this link: [SSL in ignite](https://ignite.apache.org/docs/latest/security/ssl-tls) +--- -### Run with build-in authentication enabled -Via this option you could overwrite default login and password options in tests with authentication. -``` - {"authentication":{ - "enabled": true, - "username": "username", - "password": "password" - } - } -``` +## Global Parameters & Special Runs -## Run with metrics export enabled +You can modify test environments at execution time using global flags injected through the `--global-json` parameter. -To let Ignite nodes export metrics in different formats during test run use the `metrics` globals parameter -as described in following sections. +#### Test Configuration -You would need to install and configure metrics collecting software (like prometheus or zabbix) by yourselves. +| Global Parameter Key | Definition | Example Configuration | +|---------------------|------------|----------------------| +| **cluster_size** | Controls the cluster size for tests. Overrides the default num_nodes value passed in the @cluster annotation. Default value is determined by the test framework. | ```{"cluster_size": 13}``` | +| **ignite_versions** | List of Ignite versions for testing. Tests run for each version in the list. Values are folder names in /opt/ (e.g., "ignite-dev" for master branch, "ignite-2.17.0" for release). Default is determined by test annotations. | ```{"ignite_versions": ["ignite-dev", "ignite-2.17.0"]}``` | +| **failure_detection_timeout** | Timeout in milliseconds for failure detection in discovery. Used to detect node failures in the cluster. Default value is 10000 ms (10 seconds). | ```{"failure_detection_timeout": 20000}``` | -Below is the sample `prometheus.yml` config file which may be used to collect metrics from tests running in docker: +#### Security & Authentication -```yaml -global: - scrape_interval: 1s - evaluation_interval: 5s +| Global Parameter Key | Definition | Example Configuration | +|---------------------|------------|----------------------| +| **ssl** | SSL configuration with nested parameters. Enabled flag controls SSL globally, params contains keystore configurations for different aliases (server, client, admin). *Paths beginning with a `/` resolve as absolute paths. Otherwise, files are read relative to `/mnt/service/shared/`.* | ```{"ssl": {"enabled": true, "params": {"client": {"key_store_jks": "client.jks", "key_store_password": "pwd", "trust_store_jks": "truststore.jks", "trust_store_password": "pwd"}}}}``` | +| **authentication** | Authentication configuration with nested parameters. Enabled flag controls authentication globally, username and password specify credentials. Default username is "ignite" and password is "ignite". | ```{"authentication": {"enabled": true, "username": "admin", "password": "secret"}}``` | -scrape_configs: - - job_name: 'ducktests' - static_configs: - - targets: - - 172.20.0.2:8082 - - 172.20.0.3:8082 - - 172.20.0.4:8082 - - 172.20.0.5:8082 - - 172.20.0.6:8082 - - 172.20.0.7:8082 - - 172.20.0.8:8082 - - 172.20.0.9:8082 - - 172.20.0.10:8082 - - 172.20.0.11:8082 - - 172.20.0.12:8082 - - 172.20.0.13:8082 - - 172.20.0.14:8082 +#### Performance & Monitoring + +| Global Parameter Key | Definition | Example Configuration | +|---------------------|------------|----------------------| +| **jfr_enabled** | Boolean flag to enable Java Flight Recorder for performance profiling. Default is False. | ```{"jfr_enabled": true}``` | +| **safepoint_log_enabled** | Boolean flag to enable safepoint logging for debugging JVM behavior. Default is False. | ```{"safepoint_log_enabled": true}``` | +| **jmx_remote** | JMX remote monitoring configuration with nested parameters. Enabled flag controls remote JMX access, port specifies the listening port (default is 1098). | ```{"jmx_remote": {"enabled": true, "port": 1099}}``` | +| **metrics** | Metrics configuration with nested parameters. JMX metrics can be enabled, and OpenCensus metrics can be configured with period and port settings. Default period is 1000ms and default port is 8082. | ```{"metrics": {"jmx": {"enabled": true}, "opencensus": {"enabled": true, "period": 2000, "port": 8083}}}``` | + +*Note on OpenCensus Telemetry:* To separate metrics from different tests, the `iin` label is injected into the configuration of each Ignite node. It can be used in downstream software like Grafana for precise filtration. The label contains a detailed dot-concatenated string representing the full namespace of the current test runner context (e.g., `discovery_test.DiscoveryTest.test_nodes_fail_not_sequential_zk.nodes_to_kill.2.load_type.ClusterLoad.ATOMIC.ignite_version.ignite-2.11.0`). + +#### Framework Configuration + +| Global Parameter Key | Definition | Example Configuration | +|---------------------|------------|----------------------| +| **NodeSpec** | Specifies the class to use for node specifications in Ignite services. Controls how Ignite nodes are configured and started. | ```{"NodeSpec": "myapp.services.MyNodeSpec"}``` | +| **AppSpec** | Specifies the class to use for application specifications in Ignite applications. Controls how Ignite applications are configured and started. | ```{"AppSpec": "myapp.services.MyAppSpec"}``` | +| **IgniteTestContext** | Class name for the test context implementation. Allows customization of test context behavior. | ```{"IgniteTestContext": "myapp.context.CustomTestContext"}``` | +| **project** | Project/fork name for version handling (e.g., "ignite", "fork"). Used to distinguish between different Ignite variants. Default is "ignite". | ```{"project": "fork"}``` | + +#### Paths & Directories + +| Global Parameter Key | Definition | Example Configuration | +|---------------------|------------|----------------------| +| **persistent_root** | Root directory for persistent storage in tests. Used for storing test data and logs. Default is typically the test working directory. | ```{"persistent_root": "/opt/ignite/test-data"}``` | +| **install_root** | Root directory for Ignite installation. Points to the base directory where Ignite is installed for testing. Default is typically "/opt/ignite". | ```{"install_root": "/opt/ignite-testing"}``` | + +### Custom Ignites & Forks Testing +You can test arbitrary binary releases or custom compiled forks by overriding the execution path: +* **Binary releases:** Must be extracted to the `/opt` directory (e.g., `/opt/ignite-2.11.0`). +* **Source forks:** Must be located at `/opt` and compiled using `./scripts/build-module.sh ducktests`. + +To use a custom directory path entirely, pass the `install_root` global configuration variable: +```bash +--global-json '{"install_root": "/custom_directory_path"}' ``` -In case of docker you might want ask it to assign the same IP addresses to containers each time it is invoked. -This way you will be able to create a static config file for your metrics scraper. To do so use -the `--subnet` parameter for the `./docker/run_tests.sh` script as +You can target specific cross-product version compatibility combinations inside test suites using the `@ignite_versions` decorator, or override them dynamically during running execution: + +```bash +# Runs tests only against versions '2.8.1' and 'dev' +--global-json '{"ignite_versions":["2.8.1", "dev"]}' +# Specifies a custom product prefix ('fork') to execute tests across 'ignite-2.8.1', 'fork-2.8.1', and 'fork-dev' +--global-json '{"project": "fork", "ignite_versions": ["ignite-2.8.1", "2.8.1", "dev"]}' ``` -./docker/run_tests.sh --subnet 170.20.0.0/16 + + +### Diagnostics & Performance Utilities +```bash +# Enable Java Flight Recorder (JFR) tracing +--global-json '{"jfr_enabled": true}' + +# Enable JVM Safepoints performance logging +--global-json '{"safepoint_log_enabled": true}' ``` -### Run with the Prometheus metrics exporter +### Security Settings +```bash +# Enable built-in authentication overrides +--global-json '{"authentication": {"enabled": true, "username": "custom_user", "password": "custom_password"}}' -To export metrics in the Prometheus format via the HTTP use the following `--globals-json` parameters: +# Enable default SSL/TLS configurations +--global-json '{"ssl": {"enabled": true}}' +``` +To supply precise keystores for explicit communication roles, use detailed layout arrays: ```json { - "metrics": { - "opencensus": { - "enabled":true, - "port": 8082 + "ssl": { + "enabled": true, + "params": { + "server": { "key_store_jks": "server.jks", "key_store_password": "pwd", "trust_store_jks": "truststore.jks", "trust_store_password": "pwd" } } } } ``` +*Paths beginning with a `/` resolve as absolute paths. Otherwise, files are read relative to `/mnt/service/shared/`.* -To separate metrics from different tests the `iin` label is used. It may be used in software like grafana for filtration. +For more information about ssl in ignite you can check this link: [SSL in ignite](https://ignite.apache.org/docs/latest/security/ssl-tls) -Label contains the *test id* string: dot concatenated test package name, test class name, test method name and set of -name/value pairs for parameters, like: +### Prometheus & JMX Metrics Exporters +To configure external scraping agents (like Prometheus or Zabbix) to systematically track container telemetry, apply tracking labels. -`discovery_test.DiscoveryTest.test_nodes_fail_not_sequential_zk.nodes_to_kill.2.load_type.ClusterLoad.ATOMIC.ignite_version.ignite-2.11.0` +In case of docker you might want ask it to assign the same IP addresses to containers each time it is invoked. This way you will be able to create a static config file for your metrics scraper. To do so use the `--subnet` parameter for the `./docker/run_tests.sh` script as: -**Implementation note.** The `ignite-opencensus` metrics module uses the `iin` label to expose the `IgniteInstanceName` -cluster configuration parameter. So the `ducktests` engine exploits this fact and puts the *test id* to -configuration of each ignite node started in scope of particular test. +```bash +./docker/run_tests.sh --subnet 170.20.0.0/16 +``` -### Run with the JMX metrics exporter -To have Ignite nodes export metrics via the JMX use below global parameters. Note that you also might want to enable the -JMХ remote access (running on 1098 port by default) to let external tools like zabbix collect metrics. +Pass the following telemetry properties to open standard scrape ports: ```json { - "jmx_remote": { - "enabled": true, - "port": 1098 - }, + "jmx_remote": { "enabled": true, "port": 1098 }, "metrics": { - "jmx": { - "enabled":true - } + "jmx": { "enabled": true }, + "opencensus": { "enabled": true, "port": 8082 } } } ``` - -# Development -## Preparing development environment -- Create a virtual environment and activate it using following commands: -``` -python3 -m venv ~/.virtualenvs/ignite-ducktests-dev -source ~/.virtualenvs/ignite-ducktests-dev/bin/activate -``` -- Change a current directory to `${IGNITE_HOME}/modules/ducktests/tests`. We refer to it as `${DUCKTESTS_DIR}`. -- Install requirements and `ignitetests` as editable using following commands: -``` -pip install -r docker/requirements-dev.txt -pip install -e . +To separate metrics from different tests, the `iin` label is used. It can be utilized in downstream software like Grafana for precise filtration. + +The label contains a detailed **test id** string composed of the dot-concatenated test package name, test class name, test method name, and name/value pairs for all parameters: + +`discovery_test.DiscoveryTest.test_nodes_fail_not_sequential_zk.nodes_to_kill.2.load_type.ClusterLoad.ATOMIC.ignite_version.ignite-2.11.0` + +**Implementation note:** The `ignite-opencensus` metrics module uses the `iin` label to expose the `IgniteInstanceName` cluster configuration parameter. The `ducktests` engine exploits this behavior by injecting the exact *test id* directly into the configuration of each Ignite node started within that test scope. + +```yaml +# Sample host prometheus.yml scrape job configuration +scrape_configs: + - job_name: 'ducktests' + static_configs: + - targets: ['172.20.0.2:8082', '172.20.0.3:8082', '172.20.0.4:8082'] ``` + --- -- For running unit tests invoke `pytest` in `${DUCKTESTS_DIR}`. -- For checking codestyle invoke `flake8` in `${DUCKTESTS_DIR}`. +## Distributed Remote Environments -#### Run checks over multiple python's versions using tox (optional) -All commits and PR's are checked against multiple python's version, namely 3.6, 3.7 and 3.8. -If you want to check your PR as it will be checked on Travis CI, you should do following steps: +The underlying `ducktape` execution orchestrator allows running these exact suites on production clusters, managed infrastructure, Kubernetes (K8s), Vagrant, Mesos, or Cloud environments. -- Install `pyenv`, see installation instruction [here](https://github.com/pyenv/pyenv#installation). -- Install different versions of python (recommended versions are `3.7.9` and `3.8.5`) -- Activate them with a command `pyenv shell 3.7.9 3.8.5` -- Install `tox` by invoking a command `pip install tox` -- Change a current directory to `${DUCKTESTS_DIR}` and invoke `tox` +### Requirements +* Ensure target remote cluster node configurations align with base OS images. Refer to `./docker/Dockerfile` for underlying software, storage routing setup, and platform software prerequisites. + +### Execution +Trigger remote integration test execution loops via explicit command wrappers: +```bash +ducktape --results-root=./results --cluster-file=./cluster.json --repeat 1 --max-parallel 16 ./modules/ducktests/tests/ignitetest +``` diff --git a/modules/ducktests/tests/docker/Dockerfile b/modules/ducktests/tests/docker/Dockerfile index a88d0a969e947..59ed67463d5de 100644 --- a/modules/ducktests/tests/docker/Dockerfile +++ b/modules/ducktests/tests/docker/Dockerfile @@ -13,90 +13,164 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG jdk_version=eclipse-temurin:17 -FROM $jdk_version - -MAINTAINER Apache Ignite dev@ignite.apache.org -VOLUME ["/opt/ignite-dev"] - -# Set the timezone. +# ===================================================================== +# GLOBAL ARGS (Must be declared at the very top, before any FROM) +# ===================================================================== +ARG python_version="3.13" +ARG jdk_version="eclipse-temurin:17" + +# --------------------------------------------------------------------- +# Stage 1: JDK source (Temurin JDKs are self-contained and relocatable, +# so copying the JDK across images is safe -- unlike copying CPython, +# whose _ssl extension is linked against the source image's OpenSSL) +# --------------------------------------------------------------------- +FROM $jdk_version AS jdk_source + +# --------------------------------------------------------------------- +# Stage 2: Main Image Build +# --------------------------------------------------------------------- +FROM python:${python_version}-slim + +# Re-declare global args here to make them accessible inside this specific stage +ARG python_version +ARG jdk_version + +# --------------------------------------------------------------------- +# 1. Environment & Global System Configurations +# --------------------------------------------------------------------- ENV TZ=Europe/Moscow -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +ENV DEBIAN_FRONTEND=noninteractive -# Do not ask for confirmations when running apt-get, etc. -ENV DEBIAN_FRONTEND noninteractive +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -# Set the ducker.creator label so that we know that this is a ducker image. This will make it -# visible to 'ducker purge'. The ducker.creator label also lets us know what UNIX user built this -# image. +# Set up ducker labels ARG ducker_creator=default LABEL ducker.creator=$ducker_creator -# Update Linux and install necessary utilities. -RUN cat /etc/apt/sources.list | sed 's/http:\/\/deb.debian.org/https:\/\/deb.debian.org/g' > /etc/apt/sources.list.2 && mv /etc/apt/sources.list.2 /etc/apt/sources.list -RUN apt update && apt install -y sudo netcat-traditional iptables rsync unzip wget curl jq coreutils openssh-server net-tools vim python3-pip python3-dev python3-venv libffi-dev libssl-dev cmake pkg-config libfuse-dev iperf traceroute mc git && apt-get -y clean - +# Fix package mirror protocol from http to https +# (Debian trixie uses the deb822 sources file; fall back to sources.list if present) +RUN if [ -f /etc/apt/sources.list.d/debian.sources ]; then \ + sed -i 's|http://deb.debian.org|https://deb.debian.org|g' /etc/apt/sources.list.d/debian.sources; \ + elif [ -f /etc/apt/sources.list ]; then \ + sed -i 's|http://deb.debian.org|https://deb.debian.org|g' /etc/apt/sources.list; \ + fi + +# --------------------------------------------------------------------- +# 2. System Utilities Installation +# --------------------------------------------------------------------- +RUN apt-get update && apt-get install -y \ + sudo \ + netcat-traditional \ + iptables \ + rsync \ + unzip \ + wget \ + curl \ + jq \ + coreutils \ + openssh-server \ + net-tools \ + vim \ + libffi-dev \ + libssl-dev \ + cmake \ + pkg-config \ + libfuse-dev \ + iperf \ + traceroute \ + mc \ + git \ + build-essential \ + && apt-get -y clean \ + && rm -rf /var/lib/apt/lists/* + +# --------------------------------------------------------------------- +# 3. JDK Installation (copied from the Temurin image) +# --------------------------------------------------------------------- +ENV JAVA_HOME=/opt/java/openjdk +COPY --from=jdk_source $JAVA_HOME $JAVA_HOME +ENV PATH="$JAVA_HOME/bin:$PATH" + +# Confirm both runtimes are healthy +RUN java -version + +# --------------------------------------------------------------------- +# 4. Python Virtual Environment Setup & Requirements +# --------------------------------------------------------------------- +# Standardize path routing via the virtual environment block RUN python3 -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" + +# Print the active python version and verify ssl is importable +RUN python3 --version && python3 -c "import ssl; print(ssl.OPENSSL_VERSION)" + COPY ./requirements.txt /root/requirements.txt -RUN pip3 install -r /root/requirements.txt -# Set up ssh +# Install requirements +RUN pip3 install \ + --default-timeout=100 \ + --no-cache-dir \ + -r /root/requirements.txt + +# --------------------------------------------------------------------- +# 5. SSH & Security Settings +# --------------------------------------------------------------------- COPY ./ssh-config /root/.ssh/config -# NOTE: The paramiko library supports the PEM-format private key, but does not support the RFC4716 format. RUN ssh-keygen -m PEM -q -t rsa -N '' -f /root/.ssh/id_rsa && cp -f /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys RUN echo 'PermitUserEnvironment yes' >> /etc/ssh/sshd_config +# --------------------------------------------------------------------- +# 6. Apache Component Stack Dependencies (Ignite, Zookeeper, Kafka, JMX) +# --------------------------------------------------------------------- ARG APACHE_MIRROR="https://apache-mirror.rbc.ru/pub/apache/" ARG APACHE_ARCHIVE="https://archive.apache.org/dist/" -# Install binary test dependencies. +# Install Ignite RUN for v in "2.7.6" "2.17.0"; \ do cd /opt; \ curl -O $APACHE_ARCHIVE/ignite/$v/apache-ignite-$v-bin.zip;\ - unzip apache-ignite-$v-bin.zip && mv /opt/apache-ignite-$v-bin /opt/ignite-$v;\ - done - -RUN rm /opt/apache-ignite-*-bin.zip + unzip apache-ignite-$v-bin.zip && mv /opt/apache-ignite-$v-bin /opt/ignite-$v; \ + done \ + && rm /opt/apache-ignite-*-bin.zip -#Install zookeeper. +# Install Zookeeper ARG ZOOKEEPER_VERSION="3.5.8" ARG ZOOKEEPER_NAME="zookeeper-$ZOOKEEPER_VERSION" ARG ZOOKEEPER_RELEASE_NAME="apache-$ZOOKEEPER_NAME-bin" ARG ZOOKEEPER_RELEASE_ARTIFACT="$ZOOKEEPER_RELEASE_NAME.tar.gz" -RUN echo $APACHE_ARCHIVE/zookeeper/$ZOOKEEPER_NAME/$ZOOKEEPER_RELEASE_ARTIFACT RUN cd /opt && curl -O $APACHE_ARCHIVE/zookeeper/$ZOOKEEPER_NAME/$ZOOKEEPER_RELEASE_ARTIFACT \ - && tar xvf $ZOOKEEPER_RELEASE_ARTIFACT && rm $ZOOKEEPER_RELEASE_ARTIFACT -RUN mv /opt/$ZOOKEEPER_RELEASE_NAME /opt/$ZOOKEEPER_NAME + && tar xvf $ZOOKEEPER_RELEASE_ARTIFACT && rm $ZOOKEEPER_RELEASE_ARTIFACT \ + && mv /opt/$ZOOKEEPER_RELEASE_NAME /opt/$ZOOKEEPER_NAME -#Install kafka +# Install Kafka ARG KAFKA_VERSION="3.9.1" ARG KAFKA_NAME="kafka" ARG KAFKA_RELEASE_NAME="${KAFKA_NAME}_2.13-$KAFKA_VERSION" ARG KAFKA_RELEASE_ARTIFACT="$KAFKA_RELEASE_NAME.tgz" -RUN echo $APACHE_ARCHIVE/kafka/$KAFKA_VERSION/$KAFKA_RELEASE_ARTIFACT RUN cd /opt && curl -O $APACHE_ARCHIVE/kafka/$KAFKA_VERSION/$KAFKA_RELEASE_ARTIFACT \ - && tar xvf $KAFKA_RELEASE_ARTIFACT && rm $KAFKA_RELEASE_ARTIFACT -RUN mv /opt/$KAFKA_RELEASE_NAME /opt/$KAFKA_NAME-$KAFKA_VERSION - -# The version of Kibosh to use for testing. -# If you update this, also update vagrant/base.sh -ARG KIBOSH_VERSION="8841dd392e6fbf02986e2fb1f1ebf04df344b65a" - -# Install Kibosh -RUN apt-get install fuse -RUN cd /opt && git clone -q https://github.com/confluentinc/kibosh.git && cd "/opt/kibosh" && git reset --hard $KIBOSH_VERSION && mkdir "/opt/kibosh/build" && cd "/opt/kibosh/build" && ../configure && make -j 2 + && tar xvf $KAFKA_RELEASE_ARTIFACT && rm $KAFKA_RELEASE_ARTIFACT \ + && mv /opt/$KAFKA_RELEASE_NAME /opt/$KAFKA_NAME-$KAFKA_VERSION -#Install jmxterm +# Install Jmxterm ARG JMXTERM_NAME="jmxterm" ARG JMXTERM_VERSION="1.0.1" ARG JMXTERM_ARTIFACT="$JMXTERM_NAME-$JMXTERM_VERSION-uber.jar" RUN cd /opt && curl -OL https://github.com/jiaqi/jmxterm/releases/download/v$JMXTERM_VERSION/$JMXTERM_ARTIFACT \ - && mv $JMXTERM_ARTIFACT $JMXTERM_NAME.jar + && mv $JMXTERM_ARTIFACT $JMXTERM_NAME.jar +# --------------------------------------------------------------------- +# 7. User Isolation Permissions (Ducker Execution Account Setup) +# --------------------------------------------------------------------- # Set up the ducker user. -RUN userdel -r ubuntu \ - && useradd -ms /bin/bash ducker \ +ARG USER_UID=1000 +ARG USER_GID=1000 + +# Remove conflicting default user if it exists +RUN getent passwd ubuntu &>/dev/null && userdel -r ubuntu || true + +# Provision ducker system environment and security configurations +RUN groupadd -g $USER_GID ducker \ + && useradd -u $USER_UID -g $USER_GID -ms /bin/bash ducker \ && mkdir -p /home/ducker/ \ && rsync -aiq /root/.ssh/ /home/ducker/.ssh \ && chown -R ducker /home/ducker/ /mnt/ /var/log/ /opt \ @@ -106,9 +180,9 @@ RUN userdel -r ubuntu \ && echo "JAVA_HOME=$JAVA_HOME" >> /home/ducker/.ssh/environment \ && echo 'PATH=$PATH:'"$JAVA_HOME/bin" >> /home/ducker/.profile \ && echo 'ducker ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers + USER ducker CMD sudo service ssh start && tail -f /dev/null -# Container port exposure EXPOSE 11211 47100 47500 49112 10800 8080 2888 3888 2181 1098 8082 8083 diff --git a/modules/ducktests/tests/docker/ducker-ignite b/modules/ducktests/tests/docker/ducker-ignite index da6cc205c98ba..6285f91fb3f8f 100755 --- a/modules/ducktests/tests/docker/ducker-ignite +++ b/modules/ducktests/tests/docker/ducker-ignite @@ -44,6 +44,9 @@ default_num_nodes=4 # The default OpenJDK base image. default_jdk="openjdk:17" +# The default Python version. +default_python="3.13" + # The default ducker-ignite image name. default_image_name="ducker-ignite" @@ -60,12 +63,15 @@ Usage: ${script_path} [command] [options] help|-h|--help Display this help message -build [-j|--jdk JDK] [-c|--context] [image-name] +build [-j|--jdk JDK] [-p|--python PYTHON_VERSION] [-c|--context] [image-name] Build a docker image that represents ducker node. Image is tagged with specified ${image_name}. If --jdk is specified then we will use this argument as base image for ducker docker images. Otherwise ${default_jdk} is used. + If --python is specified, its value will be used to extract the Python runtime for the Docker images. + Otherwise, ${default_python} will be used. + If --context is specified then build docker image from this path. Context directory must contain Dockerfile. up [-n|--num-nodes NUM_NODES] [-f|--force] [docker-image] @@ -255,8 +261,10 @@ ducker_build_image() { must_pushd "${ducker_dir}" # Tip: if you are scratching your head for some dependency problems that are referring to an old code version # (for example java.lang.NoClassDefFoundError), add --no-cache flag to the build shall give you a clean start. - must_do -v -o docker build --memory="${docker_build_memory_limit}" \ - --build-arg "ducker_creator=${user_name}" --build-arg "jdk_version=${jdk_version}" -t "${image_name}" \ + must_do -v -o docker build --network=host --memory="${docker_build_memory_limit}" \ + --build-arg USER_UID=$(id -u) --build-arg USER_GID=$(id -g) \ + --build-arg "ducker_creator=${user_name}" --build-arg "jdk_version=${jdk_version}" \ + --build-arg "python_version=${python_version}" -t "${image_name}" \ -f "${docker_context}/Dockerfile" -- "${docker_context}" docker_status=$? must_popd @@ -279,12 +287,14 @@ ducker_build() { while [[ $# -ge 1 ]]; do case "${1}" in -j|--jdk) set_once jdk_version "${2}" "the OpenJDK base image"; shift 2;; + -p|--python) set_once python_version "${2}" "the Python version"; shift 2;; -c|--context) docker_context="${2}"; shift 2;; *) set_once image_name "${1}" "docker image name"; shift;; esac done [[ -n "${jdk_version}" ]] || jdk_version="${default_jdk}" + [[ -n "${python_version}" ]] || python_version="${default_python}" [[ -n "${image_name}" ]] || image_name="${default_image_name}-${jdk_version/:/-}" [[ -n "${docker_context}" ]] || docker_context="${ducker_dir}" diff --git a/modules/ducktests/tests/tox.ini b/modules/ducktests/tests/tox.ini index 56d89ca00819b..e0fa4a74df8aa 100644 --- a/modules/ducktests/tests/tox.ini +++ b/modules/ducktests/tests/tox.ini @@ -13,46 +13,38 @@ # See the License for the specific language governing permissions and # limitations under the License. [tox] -envlist = codestyle, py38, py39 +envlist = codestyle, py{38,39,310,311,312,313} skipsdist = True [testenv] -install_command = pip install --extra-index-url https://pypi.org/simple {opts} {packages} -envdir = {toxworkdir}/.virtualenvs/ignite-ducktests-{envname} -deps = - -r ./docker/requirements-dev.txt usedevelop = True -commands = - pytest {env:PYTESTARGS:} {posargs} +envdir = {toxworkdir}/.virtualenvs/ignite-ducktests-{envname} +deps = -r{toxinidir}/docker/requirements-dev.txt +install_command = pip install --extra-index-url https://pypi.org/simple {opts} {packages} +commands = pytest {env:PYTESTARGS:} {posargs} [testenv:codestyle] basepython = python3 -commands = - flake8 - -[testenv:py38] -envdir = {toxworkdir}/.virtualenvs/ignite-ducktests-py38 - -[testenv:py39] -envdir = {toxworkdir}/.virtualenvs/ignite-ducktests-py39 +deps = flake8 +commands = flake8 [BASIC] -min-public-methods=0 -good-names=i, j, k, x, y, ex, pk, tx +min-public-methods = 0 +good-names = i, j, k, x, y, ex, pk, tx [SIMILARITIES] -ignore-imports=yes +ignore-imports = yes [FORMAT] -max-line-length=120 +max-line-length = 120 [DESIGN] -max-parents=10 +max-parents = 10 [flake8] -max-line-length=120 +max-line-length = 120 [pytest] -python_files=check_*.py -python_classes=Check -python_functions=check_* +python_files = check_*.py +python_classes = Check +python_functions = check_* diff --git a/modules/extdata/uri/pom.xml b/modules/extdata/uri/pom.xml index 28d0078a27e44..d79919f25a5d6 100644 --- a/modules/extdata/uri/pom.xml +++ b/modules/extdata/uri/pom.xml @@ -251,11 +251,15 @@ - - - - - + + + + + @@ -410,11 +414,15 @@ - - - - - + + + + + diff --git a/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GarHelloWorldTask.java b/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GarHelloWorldTask.java index df71641a54255..1bcb94160f011 100644 --- a/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GarHelloWorldTask.java +++ b/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GarHelloWorldTask.java @@ -29,8 +29,8 @@ import org.apache.ignite.compute.ComputeTaskName; import org.apache.ignite.compute.ComputeTaskSplitAdapter; import org.jetbrains.annotations.Nullable; -import org.springframework.beans.factory.support.AbstractBeanFactory; -import org.springframework.beans.factory.xml.XmlBeanFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; /** @@ -43,7 +43,8 @@ public class GarHelloWorldTask extends ComputeTaskSplitAdapter { /** {@inheritDoc} */ @Override public Collection split(int gridSize, String arg) throws IgniteException { // Create Spring context. - AbstractBeanFactory fac = new XmlBeanFactory( + DefaultListableBeanFactory fac = new DefaultListableBeanFactory(); + new XmlBeanDefinitionReader(fac).loadBeanDefinitions( new ClassPathResource("org/apache/ignite/spi/deployment/uri/tasks/gar-spring-bean.xml", getClass().getClassLoader())); fac.setBeanClassLoader(getClass().getClassLoader()); diff --git a/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestTask1.java b/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestTask1.java index d95c411e74c23..1348d7f8066ba 100644 --- a/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestTask1.java +++ b/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestTask1.java @@ -23,7 +23,8 @@ import org.apache.ignite.compute.ComputeJob; import org.apache.ignite.compute.ComputeJobResult; import org.apache.ignite.compute.ComputeTaskSplitAdapter; -import org.springframework.beans.factory.xml.XmlBeanFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; /** @@ -32,7 +33,9 @@ public class GridUriDeploymentTestTask1 extends ComputeTaskSplitAdapter { /** */ public GridUriDeploymentTestTask1() { - XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring1.xml", getClass().getClassLoader())); + DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); + new XmlBeanDefinitionReader(factory).loadBeanDefinitions( + new ClassPathResource("spring1.xml", getClass().getClassLoader())); factory.setBeanClassLoader(getClass().getClassLoader()); diff --git a/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestTask2.java b/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestTask2.java index 1325efd17aa6e..cf661982b4a0e 100644 --- a/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestTask2.java +++ b/modules/extdata/uri/src/main/java/org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestTask2.java @@ -23,7 +23,8 @@ import org.apache.ignite.compute.ComputeJob; import org.apache.ignite.compute.ComputeJobResult; import org.apache.ignite.compute.ComputeTaskSplitAdapter; -import org.springframework.beans.factory.xml.XmlBeanFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; /** @@ -35,7 +36,8 @@ public class GridUriDeploymentTestTask2 extends ComputeTaskSplitAdapter if (opCtx == null) // Mimics behavior of GridCacheAdapter#keepBinary and GridCacheProxyImpl#keepBinary - newOpCtx = new CacheOperationContext(false, false, true, null, false, null, false, null, null, false); + newOpCtx = CacheOperationContext.builder().keepBinary(true).build(); else if (!opCtx.isKeepBinary()) - newOpCtx = opCtx.keepBinary(); + newOpCtx = opCtx.withKeepBinary(); if (newOpCtx != null) cctx.operationContextPerCall(newOpCtx); diff --git a/modules/indexing/src/test/java/org/apache/ignite/cache/query/IndexQueryInlineSizesTest.java b/modules/indexing/src/test/java/org/apache/ignite/cache/query/IndexQueryInlineSizesTest.java index 31f4d01b27a0d..87fd7697a6047 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/cache/query/IndexQueryInlineSizesTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/cache/query/IndexQueryInlineSizesTest.java @@ -185,7 +185,7 @@ private void check(BiFunction qry = qryBld.apply(low, high); diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/BinaryMetadataConcurrentUpdateWithIndexesTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/BinaryMetadataConcurrentUpdateWithIndexesTest.java index 1a4403a307acd..8e9bbd48ca383 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/BinaryMetadataConcurrentUpdateWithIndexesTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/BinaryMetadataConcurrentUpdateWithIndexesTest.java @@ -44,10 +44,11 @@ import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.binary.BinaryMetadata; +import org.apache.ignite.internal.binary.BinaryUtils; +import org.apache.ignite.internal.binary.BinaryUtils.TestBinaryContext; +import org.apache.ignite.internal.binary.BinaryUtils.TestBinaryContext.TestBinaryContextListener; import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl; import org.apache.ignite.internal.processors.cache.binary.MetadataUpdateProposedMessage; -import org.apache.ignite.internal.util.IgniteUtils.TestBinaryContext; -import org.apache.ignite.internal.util.IgniteUtils.TestBinaryContext.TestBinaryContextListener; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.spi.discovery.tcp.BlockTcpDiscoverySpi; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; @@ -343,14 +344,14 @@ protected BinaryObject build(Ignite ignite, String prefix, int... fields) { @Override protected void beforeTest() throws Exception { super.beforeTest(); - U.useTestBinaryCtx = true; + BinaryUtils.useTestBinaryCtx = true; } /** {@inheritDoc} */ @Override protected void afterTest() throws Exception { super.afterTest(); - U.useTestBinaryCtx = false; + BinaryUtils.useTestBinaryCtx = false; stopAllGrids(); } diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/IndexCorruptionRebuildTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/IndexCorruptionRebuildTest.java index fb5cfccbaf30d..9184ef84c1b92 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/IndexCorruptionRebuildTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/IndexCorruptionRebuildTest.java @@ -394,8 +394,8 @@ public static class CaptureRebuildGridQueryIndexing extends IndexesRebuildTask { private volatile boolean rebuiltIndexes; /** {@inheritDoc} */ - @Override @Nullable - public IgniteInternalFuture rebuild( + @Nullable + @Override public IgniteInternalFuture rebuild( GridCacheContext cctx, boolean force, IndexRebuildCancelToken cancelTok diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java index e2b2317c44dcf..15a512dbaab88 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java @@ -63,9 +63,9 @@ import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectAllTypes; import org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectEnum; import org.apache.ignite.internal.metric.AbstractExporterSpiTest; -import org.apache.ignite.internal.metric.SystemViewSelfTest.TestPredicate; -import org.apache.ignite.internal.metric.SystemViewSelfTest.TestRunnable; -import org.apache.ignite.internal.metric.SystemViewSelfTest.TestTransformer; +import org.apache.ignite.internal.metric.SystemViewExecutorsTest.TestRunnable; +import org.apache.ignite.internal.metric.SystemViewQueriesTest.TestPredicate; +import org.apache.ignite.internal.metric.SystemViewQueriesTest.TestTransformer; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState; import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; @@ -86,8 +86,8 @@ import org.junit.Test; import static java.util.Arrays.asList; -import static org.apache.ignite.internal.metric.SystemViewSelfTest.TEST_PREDICATE; -import static org.apache.ignite.internal.metric.SystemViewSelfTest.TEST_TRANSFORMER; +import static org.apache.ignite.internal.metric.SystemViewQueriesTest.TEST_PREDICATE; +import static org.apache.ignite.internal.metric.SystemViewQueriesTest.TEST_TRANSFORMER; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.cacheGroupId; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.cacheId; import static org.apache.ignite.internal.processors.cache.index.AbstractSchemaSelfTest.queryProcessor; diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/database/WalDisabledDuringIndexRecreateTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/database/WalDisabledDuringIndexRecreateTest.java index bea07181186ba..4276b518f9282 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/database/WalDisabledDuringIndexRecreateTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/database/WalDisabledDuringIndexRecreateTest.java @@ -52,6 +52,7 @@ import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteBiTuple; +import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.ListeningTestLogger; import org.apache.ignite.testframework.LogListener; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; @@ -188,7 +189,8 @@ public void testRestartInCaseOfFailure() throws Exception { awaitRebuild(); - assertTrue("Rebuild must not succeed", false); + assertTrue("Rebuild must not succeed", + GridTestUtils.waitForCondition(() -> grid(0).context().failure().nodeStopping(), 1_000L)); } catch (Exception ignore) { // No-op diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java index 52385804374e7..837ba9c26a9ee 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java @@ -17,138 +17,72 @@ package org.apache.ignite.testsuites; -import org.apache.ignite.internal.processors.cache.AffinityAliasKeyTest; import org.apache.ignite.internal.processors.cache.AffinityKeyNameAndValueFieldNameConflictTest; -import org.apache.ignite.internal.processors.cache.CacheOffheapBatchIndexingMultiTypeTest; import org.apache.ignite.internal.processors.cache.CacheQueryBuildValueTest; import org.apache.ignite.internal.processors.cache.DdlTransactionIndexingSelfTest; import org.apache.ignite.internal.processors.cache.GridCacheCrossCacheQuerySelfTest; -import org.apache.ignite.internal.processors.cache.GridCacheQueryIndexDisabledSelfTest; -import org.apache.ignite.internal.processors.cache.GridCacheQueryInternalKeysSelfTest; -import org.apache.ignite.internal.processors.cache.GridCacheQueryPartitionsReleaseTest; import org.apache.ignite.internal.processors.cache.GridCacheQuerySerializationSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectFieldsQuerySelfTest; import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectLocalQueryArgumentsTest; import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectQueryArgumentsTest; import org.apache.ignite.internal.processors.cache.IgniteBinaryWrappedObjectFieldsQuerySelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheCollocatedQuerySelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheDeleteSqlQuerySelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheDuplicateEntityConfigurationSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheInsertSqlQuerySelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheJoinPartitionedAndReplicatedCollocationTest; import org.apache.ignite.internal.processors.cache.IgniteCacheJoinPartitionedAndReplicatedTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheJoinQueryWithAffinityKeyTest; import org.apache.ignite.internal.processors.cache.IgniteCacheLargeResultSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheMergeSqlQueryFailingTest; import org.apache.ignite.internal.processors.cache.IgniteCacheMergeSqlQuerySelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheMultipleIndexedTypesTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheOffheapEvictQueryTest; import org.apache.ignite.internal.processors.cache.IgniteCacheOffheapIndexScanTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheParallelismQuerySortOrderTest; -import org.apache.ignite.internal.processors.cache.IgniteCachePrimitiveFieldsQuerySelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheQueryH2IndexingLeakTest; import org.apache.ignite.internal.processors.cache.IgniteCacheQueryIndexSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheQueryLoadSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheSqlDmlErrorSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheSqlInsertValidationSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheSqlQueryErrorSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheUnionDuplicatesTest; import org.apache.ignite.internal.processors.cache.IgniteCacheUpdateSqlQuerySelfTest; -import org.apache.ignite.internal.processors.cache.IgniteClientReconnectCacheQueriesFailoverTest; import org.apache.ignite.internal.processors.cache.IgniteCrossCachesJoinsQueryTest; import org.apache.ignite.internal.processors.cache.IgniteDynamicEnableIndexingRestoreTest; -import org.apache.ignite.internal.processors.cache.IgniteDynamicSqlRestoreTest; import org.apache.ignite.internal.processors.cache.IgniteErrorOnRebalanceTest; -import org.apache.ignite.internal.processors.cache.IncorrectQueryEntityTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheAtomicNearEnabledQuerySelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheAtomicQuerySelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedQueryEvtsDisabledSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedQueryP2PDisabledSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedQuerySelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedSnapshotEnabledQuerySelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNoRebalanceSelfTest; import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedQueryEvtsDisabledSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedQueryP2PDisabledSelfTest; import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedQuerySelfTest; import org.apache.ignite.internal.processors.cache.index.ArrayIndexTest; -import org.apache.ignite.internal.processors.cache.index.BPlusTreeMetricsTest; -import org.apache.ignite.internal.processors.cache.index.BasicIndexMultinodeTest; import org.apache.ignite.internal.processors.cache.index.BasicIndexTest; -import org.apache.ignite.internal.processors.cache.index.ComplexPrimaryKeyUnwrapSelfTest; import org.apache.ignite.internal.processors.cache.index.ComplexSecondaryKeyUnwrapSelfTest; -import org.apache.ignite.internal.processors.cache.index.DuplicateKeyValueClassesSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicIndexClientBasicSelfTest; import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerBasicSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerCoordinatorBasicSelfTest; import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerNodeFIlterBasicSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerNodeFilterCoordinatorBasicSelfTest; -import org.apache.ignite.internal.processors.cache.index.ErroneousQueryEntityConfigurationTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicColumnsClientBasicSelfTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicColumnsServerBasicSelfTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicColumnsServerCoordinatorBasicSelfTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicPartitionedNearSelfTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicPartitionedSelfTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicReplicatedSelfTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexTransactionalPartitionedNearSelfTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexTransactionalPartitionedSelfTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexTransactionalReplicatedSelfTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientAtomicPartitionedNoBackupsTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientAtomicPartitionedTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientAtomicReplicatedTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientTransactionalPartitionedNoBackupsTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientTransactionalPartitionedTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientTransactionalReplicatedTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerAtomicPartitionedNoBackupsTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerAtomicPartitionedTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerAtomicReplicatedTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerTransactionalPartitionedNoBackupsTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerTransactionalPartitionedTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerTransactionalReplicatedTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicTableSelfTest; -import org.apache.ignite.internal.processors.cache.index.IndexMetricsTest; -import org.apache.ignite.internal.processors.cache.index.QueryEntityValidationSelfTest; -import org.apache.ignite.internal.processors.cache.index.SchemaExchangeSelfTest; -import org.apache.ignite.internal.processors.cache.index.StopNodeOnRebuildIndexFailureTest; import org.apache.ignite.internal.processors.cache.query.CacheDataPageScanQueryTest; -import org.apache.ignite.internal.processors.cache.query.CacheScanQueryFailoverTest; -import org.apache.ignite.internal.processors.cache.query.GridCacheQueryTransformerSelfTest; import org.apache.ignite.internal.processors.cache.query.GridCircularQueueTest; import org.apache.ignite.internal.processors.cache.query.IndexingSpiQueryTxSelfTest; -import org.apache.ignite.internal.processors.cache.transaction.DmlInsideTransactionTest; -import org.apache.ignite.internal.processors.client.ClientConnectorConfigurationValidationSelfTest; import org.apache.ignite.internal.processors.database.baseline.IgniteStableBaselineBinObjFieldsQuerySelfTest; import org.apache.ignite.internal.processors.query.IgniteCachelessQueriesSelfTest; import org.apache.ignite.internal.processors.query.IgniteQueryTableLockAndConnectionPoolSelfTest; import org.apache.ignite.internal.processors.query.IgniteSqlSchemaIndexingTest; import org.apache.ignite.internal.processors.query.IgniteSqlSegmentedIndexMultiNodeSelfTest; -import org.apache.ignite.internal.processors.query.IgniteSqlSegmentedIndexSelfTest; -import org.apache.ignite.internal.processors.query.IgniteSqlSkipReducerOnUpdateDmlFlagSelfTest; -import org.apache.ignite.internal.processors.query.IgniteSqlSkipReducerOnUpdateDmlSelfTest; -import org.apache.ignite.internal.processors.query.IgniteSqlSplitterSelfTest; import org.apache.ignite.internal.processors.query.MultipleStatementsSqlQuerySelfTest; -import org.apache.ignite.internal.processors.query.RunningQueriesTest; import org.apache.ignite.internal.processors.query.SqlIllegalSchemaSelfTest; import org.apache.ignite.internal.processors.query.SqlNestedQuerySelfTest; import org.apache.ignite.internal.processors.query.SqlPushDownFunctionTest; -import org.apache.ignite.internal.processors.query.SqlResultSetMetaSelfTest; -import org.apache.ignite.internal.processors.query.SqlSchemaSelfTest; import org.apache.ignite.internal.processors.query.h2.GridSubqueryJoinOptimizerSelfTest; import org.apache.ignite.internal.processors.query.h2.H2ResultSetIteratorNullifyOnEndSelfTest; -import org.apache.ignite.internal.processors.query.h2.IgniteSqlBigIntegerKeyTest; import org.apache.ignite.internal.processors.query.h2.IgniteSqlQueryMinMaxTest; import org.apache.ignite.internal.processors.query.h2.IgniteSqlQueryStartFinishListenerTest; import org.apache.ignite.internal.processors.query.h2.QueryDataPageScanTest; import org.apache.ignite.internal.processors.query.h2.sql.ExplainSelfTest; import org.apache.ignite.internal.processors.query.h2.sql.GridQueryParsingTest; -import org.apache.ignite.internal.processors.query.h2.sql.SqlUnsupportedSelfTest; import org.apache.ignite.internal.processors.sql.SqlConnectorConfigurationValidationSelfTest; import org.apache.ignite.internal.sql.SqlParserBulkLoadSelfTest; -import org.apache.ignite.internal.sql.SqlParserCreateIndexSelfTest; import org.apache.ignite.internal.sql.SqlParserDropIndexSelfTest; -import org.apache.ignite.internal.sql.SqlParserKillQuerySelfTest; import org.apache.ignite.internal.sql.SqlParserMultiStatementSelfTest; -import org.apache.ignite.internal.sql.SqlParserSetStreamingSelfTest; -import org.apache.ignite.internal.sql.SqlParserViewSelfTest; import org.apache.ignite.sqltests.CheckWarnJoinPartitionedTables; import org.apache.ignite.sqltests.PartitionedSqlTest; import org.apache.ignite.sqltests.ReplicatedSqlCustomPartitionsTest; @@ -161,121 +95,69 @@ */ @RunWith(Suite.class) @Suite.SuiteClasses({ - AffinityAliasKeyTest.class, AffinityKeyNameAndValueFieldNameConflictTest.class, - DmlInsideTransactionTest.class, - ComplexPrimaryKeyUnwrapSelfTest.class, ComplexSecondaryKeyUnwrapSelfTest.class, SqlNestedQuerySelfTest.class, ExplainSelfTest.class, - RunningQueriesTest.class, PartitionedSqlTest.class, ReplicatedSqlTest.class, ReplicatedSqlCustomPartitionsTest.class, CheckWarnJoinPartitionedTables.class, - DeletionDuringRebalanceTest.class, - SqlParserCreateIndexSelfTest.class, SqlParserDropIndexSelfTest.class, SqlParserBulkLoadSelfTest.class, - SqlParserSetStreamingSelfTest.class, - SqlParserKillQuerySelfTest.class, SqlParserMultiStatementSelfTest.class, - SqlParserViewSelfTest.class, SqlConnectorConfigurationValidationSelfTest.class, - ClientConnectorConfigurationValidationSelfTest.class, - SqlSchemaSelfTest.class, SqlIllegalSchemaSelfTest.class, MultipleStatementsSqlQuerySelfTest.class, - SqlResultSetMetaSelfTest.class, - BasicIndexTest.class, - ErroneousQueryEntityConfigurationTest.class, ArrayIndexTest.class, - BasicIndexMultinodeTest.class, - IndexMetricsTest.class, - BPlusTreeMetricsTest.class, // Misc tests. - QueryEntityValidationSelfTest.class, - DuplicateKeyValueClassesSelfTest.class, - GridCacheQueryPartitionsReleaseTest.class, - StopNodeOnRebuildIndexFailureTest.class, // Dynamic index create/drop tests. - SchemaExchangeSelfTest.class, - DynamicIndexServerCoordinatorBasicSelfTest.class, DynamicIndexServerBasicSelfTest.class, - DynamicIndexServerNodeFilterCoordinatorBasicSelfTest.class, DynamicIndexServerNodeFIlterBasicSelfTest.class, - DynamicIndexClientBasicSelfTest.class, // Parsing GridQueryParsingTest.class, - IgniteCacheSqlQueryErrorSelfTest.class, - IgniteCacheSqlDmlErrorSelfTest.class, - SqlUnsupportedSelfTest.class, // Config. - IgniteCacheDuplicateEntityConfigurationSelfTest.class, - IncorrectQueryEntityTest.class, - IgniteDynamicSqlRestoreTest.class, IgniteDynamicEnableIndexingRestoreTest.class, // Queries tests. IgniteQueryTableLockAndConnectionPoolSelfTest.class, - IgniteSqlSplitterSelfTest.class, SqlPushDownFunctionTest.class, - IgniteSqlSegmentedIndexSelfTest.class, IgniteCachelessQueriesSelfTest.class, IgniteSqlSegmentedIndexMultiNodeSelfTest.class, IgniteSqlSchemaIndexingTest.class, - GridCacheQueryIndexDisabledSelfTest.class, IgniteCacheQueryLoadSelfTest.class, IgniteCacheReplicatedQuerySelfTest.class, - IgniteCacheReplicatedQueryP2PDisabledSelfTest.class, IgniteCacheReplicatedQueryEvtsDisabledSelfTest.class, - IgniteCachePartitionedQuerySelfTest.class, - IgniteCachePartitionedSnapshotEnabledQuerySelfTest.class, IgniteCacheAtomicQuerySelfTest.class, - IgniteCacheAtomicNearEnabledQuerySelfTest.class, - IgniteCachePartitionedQueryP2PDisabledSelfTest.class, IgniteCachePartitionedQueryEvtsDisabledSelfTest.class, - IgniteCacheParallelismQuerySortOrderTest.class, IgniteCacheUnionDuplicatesTest.class, - IgniteCacheJoinPartitionedAndReplicatedCollocationTest.class, - IgniteClientReconnectCacheQueriesFailoverTest.class, IgniteErrorOnRebalanceTest.class, CacheQueryBuildValueTest.class, - CacheOffheapBatchIndexingMultiTypeTest.class, IgniteCacheQueryIndexSelfTest.class, IgniteCacheCollocatedQuerySelfTest.class, IgniteCacheLargeResultSelfTest.class, - GridCacheQueryInternalKeysSelfTest.class, H2ResultSetIteratorNullifyOnEndSelfTest.class, - IgniteSqlBigIntegerKeyTest.class, - IgniteCacheOffheapEvictQueryTest.class, IgniteCacheOffheapIndexScanTest.class, GridCacheCrossCacheQuerySelfTest.class, GridCacheQuerySerializationSelfTest.class, - IgniteBinaryObjectFieldsQuerySelfTest.class, IgniteStableBaselineBinObjFieldsQuerySelfTest.class, IgniteBinaryWrappedObjectFieldsQuerySelfTest.class, IgniteCacheQueryH2IndexingLeakTest.class, - IgniteCacheQueryNoRebalanceSelfTest.class, - GridCacheQueryTransformerSelfTest.class, - CacheScanQueryFailoverTest.class, - IgniteCachePrimitiveFieldsQuerySelfTest.class, - IgniteCacheJoinQueryWithAffinityKeyTest.class, IgniteCacheJoinPartitionedAndReplicatedTest.class, IgniteCrossCachesJoinsQueryTest.class, @@ -290,10 +172,6 @@ IgniteCacheMergeSqlQueryFailingTest.class, IgniteCacheInsertSqlQuerySelfTest.class, IgniteCacheUpdateSqlQuerySelfTest.class, - IgniteCacheDeleteSqlQuerySelfTest.class, - IgniteSqlSkipReducerOnUpdateDmlSelfTest.class, - IgniteSqlSkipReducerOnUpdateDmlFlagSelfTest.class, - IgniteCacheSqlInsertValidationSelfTest.class, IgniteBinaryObjectQueryArgumentsTest.class, IgniteBinaryObjectLocalQueryArgumentsTest.class, @@ -309,28 +187,16 @@ // DDL. H2DynamicIndexTransactionalReplicatedSelfTest.class, H2DynamicIndexTransactionalPartitionedSelfTest.class, - H2DynamicIndexTransactionalPartitionedNearSelfTest.class, H2DynamicIndexAtomicReplicatedSelfTest.class, - H2DynamicIndexAtomicPartitionedSelfTest.class, H2DynamicIndexAtomicPartitionedNearSelfTest.class, - H2DynamicTableSelfTest.class, H2DynamicColumnsClientBasicSelfTest.class, - H2DynamicColumnsServerBasicSelfTest.class, H2DynamicColumnsServerCoordinatorBasicSelfTest.class, // DML+DDL. - H2DynamicIndexingComplexClientAtomicPartitionedTest.class, - H2DynamicIndexingComplexClientAtomicPartitionedNoBackupsTest.class, H2DynamicIndexingComplexClientAtomicReplicatedTest.class, H2DynamicIndexingComplexClientTransactionalPartitionedTest.class, - H2DynamicIndexingComplexClientTransactionalPartitionedNoBackupsTest.class, H2DynamicIndexingComplexClientTransactionalReplicatedTest.class, - H2DynamicIndexingComplexServerAtomicPartitionedTest.class, - H2DynamicIndexingComplexServerAtomicPartitionedNoBackupsTest.class, - H2DynamicIndexingComplexServerAtomicReplicatedTest.class, - H2DynamicIndexingComplexServerTransactionalPartitionedTest.class, H2DynamicIndexingComplexServerTransactionalPartitionedNoBackupsTest.class, - H2DynamicIndexingComplexServerTransactionalReplicatedTest.class, DdlTransactionIndexingSelfTest.class, diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java index 59d932043e533..0c42ba7040832 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java @@ -17,50 +17,29 @@ package org.apache.ignite.testsuites; -import org.apache.ignite.internal.processors.cache.CacheScanPartitionQueryFallbackSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheCrossCacheJoinRandomTest; import org.apache.ignite.internal.processors.cache.IgniteCacheObjectKeyIndexingSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCachePartitionedQueryMultiThreadedSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheQueryEvictsMultiThreadedSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheQueryMultiThreadedSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheSqlQueryMultiThreadedSelfTest; -import org.apache.ignite.internal.processors.cache.QueryJoinWithDifferentNodeFiltersTest; import org.apache.ignite.internal.processors.cache.SqlCacheStartStopTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheClientQueryReplicatedNodeRestartSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheDistributedQueryDefaultTimeoutSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheDistributedQueryStopOnCancelOrTimeoutSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeFailTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartDistributedJoinSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartSelfTest2; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartTxSelfTest; import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryStopOnCancelOrTimeoutDistributedJoinSelfTest; -import org.apache.ignite.internal.processors.cache.distributed.near.IgniteSqlQueryWithBaselineTest; import org.apache.ignite.internal.processors.cache.index.DynamicColumnsConcurrentAtomicPartitionedSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicColumnsConcurrentAtomicReplicatedSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicColumnsConcurrentTransactionalPartitionedSelfTest; import org.apache.ignite.internal.processors.cache.index.DynamicColumnsConcurrentTransactionalReplicatedSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicEnableIndexingBasicSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicEnableIndexingConcurrentSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicIndexCreateAfterClusterRestartTest; import org.apache.ignite.internal.processors.cache.index.DynamicIndexPartitionedAtomicConcurrentSelfTest; import org.apache.ignite.internal.processors.cache.index.DynamicIndexPartitionedTransactionalConcurrentSelfTest; -import org.apache.ignite.internal.processors.cache.index.DynamicIndexReplicatedAtomicConcurrentSelfTest; import org.apache.ignite.internal.processors.cache.index.DynamicIndexReplicatedTransactionalConcurrentSelfTest; import org.apache.ignite.internal.processors.cache.query.ScanQueryOffheapExpiryPolicySelfTest; import org.apache.ignite.internal.processors.database.baseline.IgniteChangingBaselineCacheQueryNodeRestartSelfTest; import org.apache.ignite.internal.processors.database.baseline.IgniteStableBaselineCacheQueryNodeRestartsSelfTest; -import org.apache.ignite.internal.processors.query.CreateIndexOnInvalidDataTypeTest; -import org.apache.ignite.internal.processors.query.DisabledSqlFunctionsTest; -import org.apache.ignite.internal.processors.query.IgniteCacheGroupsCompareQueryTest; import org.apache.ignite.internal.processors.query.IgniteCacheGroupsSqlDistributedJoinSelfTest; import org.apache.ignite.internal.processors.query.IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest; -import org.apache.ignite.internal.processors.query.IgniteCacheGroupsSqlSegmentedIndexSelfTest; -import org.apache.ignite.internal.processors.query.LazyOnDmlTest; import org.apache.ignite.internal.processors.query.ReducerRowsBufferTest; import org.apache.ignite.internal.processors.query.SqlIndexConsistencyAfterInterruptAtomicCacheOperationTest; -import org.apache.ignite.internal.processors.query.SqlIndexConsistencyAfterInterruptTxCacheOperationTest; -import org.apache.ignite.internal.processors.query.SqlTwoCachesInGroupWithSameEntryTest; import org.apache.ignite.internal.processors.query.WrongQueryEntityFieldTypeTest; import org.apache.ignite.internal.processors.query.timeout.DefaultQueryTimeoutTestSuite; import org.junit.runner.RunWith; @@ -73,70 +52,44 @@ @Suite.SuiteClasses({ ReducerRowsBufferTest.class, - LazyOnDmlTest.class, - DefaultQueryTimeoutTestSuite.class, - CreateIndexOnInvalidDataTypeTest.class, WrongQueryEntityFieldTypeTest.class, - DisabledSqlFunctionsTest.class, - SqlCacheStartStopTest.class, SqlIndexConsistencyAfterInterruptAtomicCacheOperationTest.class, - SqlIndexConsistencyAfterInterruptTxCacheOperationTest.class, - SqlTwoCachesInGroupWithSameEntryTest.class, // Dynamic index create/drop tests. DynamicIndexPartitionedAtomicConcurrentSelfTest.class, DynamicIndexPartitionedTransactionalConcurrentSelfTest.class, - DynamicIndexReplicatedAtomicConcurrentSelfTest.class, DynamicIndexReplicatedTransactionalConcurrentSelfTest.class, - DynamicIndexCreateAfterClusterRestartTest.class, DynamicColumnsConcurrentAtomicPartitionedSelfTest.class, - DynamicColumnsConcurrentTransactionalPartitionedSelfTest.class, - DynamicColumnsConcurrentAtomicReplicatedSelfTest.class, DynamicColumnsConcurrentTransactionalReplicatedSelfTest.class, - DynamicEnableIndexingBasicSelfTest.class, - DynamicEnableIndexingConcurrentSelfTest.class, - // Distributed joins. IgniteCacheQueryNodeRestartDistributedJoinSelfTest.class, IgniteCacheQueryStopOnCancelOrTimeoutDistributedJoinSelfTest.class, // Other tests. - IgniteCacheQueryMultiThreadedSelfTest.class, - - IgniteCacheQueryEvictsMultiThreadedSelfTest.class, ScanQueryOffheapExpiryPolicySelfTest.class, IgniteCacheCrossCacheJoinRandomTest.class, - IgniteCacheClientQueryReplicatedNodeRestartSelfTest.class, - IgniteCacheQueryNodeFailTest.class, - IgniteCacheQueryNodeRestartSelfTest.class, - IgniteSqlQueryWithBaselineTest.class, IgniteChangingBaselineCacheQueryNodeRestartSelfTest.class, IgniteStableBaselineCacheQueryNodeRestartsSelfTest.class, IgniteCacheQueryNodeRestartSelfTest2.class, IgniteCacheQueryNodeRestartTxSelfTest.class, IgniteCacheSqlQueryMultiThreadedSelfTest.class, IgniteCachePartitionedQueryMultiThreadedSelfTest.class, - CacheScanPartitionQueryFallbackSelfTest.class, IgniteCacheDistributedQueryDefaultTimeoutSelfTest.class, IgniteCacheDistributedQueryStopOnCancelOrTimeoutSelfTest.class, IgniteCacheObjectKeyIndexingSelfTest.class, - IgniteCacheGroupsCompareQueryTest.class, - IgniteCacheGroupsSqlSegmentedIndexSelfTest.class, IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest.class, IgniteCacheGroupsSqlDistributedJoinSelfTest.class, - QueryJoinWithDifferentNodeFiltersTest.class, - }) public class IgniteBinaryCacheQueryTestSuite2 { } diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite3.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite3.java index 36154c333db41..d1d2e840db5b8 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite3.java +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite3.java @@ -22,7 +22,6 @@ import org.apache.ignite.internal.cdc.CdcIndexRebuildTest; import org.apache.ignite.internal.cdc.SqlCdcTest; import org.apache.ignite.internal.dump.DumpCacheConfigTest; -import org.apache.ignite.internal.metric.SystemViewSelfTest; import org.apache.ignite.internal.processors.cache.BigEntryQueryTest; import org.apache.ignite.internal.processors.cache.BinaryMetadataConcurrentUpdateWithIndexesTest; import org.apache.ignite.internal.processors.cache.BinarySerializationQuerySelfTest; @@ -350,7 +349,6 @@ RowCountTableStatisticsSurvivesNodeRestartTest.class, SqlViewExporterSpiTest.class, - SystemViewSelfTest.class, SqlMergeTest.class, SqlMergeOnClientNodeTest.class, diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite5.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite5.java new file mode 100644 index 0000000000000..e2da4dcc28356 --- /dev/null +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite5.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import org.apache.ignite.internal.processors.cache.CacheScanPartitionQueryFallbackSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheQueryEvictsMultiThreadedSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheQueryMultiThreadedSelfTest; +import org.apache.ignite.internal.processors.cache.QueryJoinWithDifferentNodeFiltersTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheClientQueryReplicatedNodeRestartSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeFailTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteSqlQueryWithBaselineTest; +import org.apache.ignite.internal.processors.cache.index.DynamicColumnsConcurrentAtomicReplicatedSelfTest; +import org.apache.ignite.internal.processors.cache.index.DynamicColumnsConcurrentTransactionalPartitionedSelfTest; +import org.apache.ignite.internal.processors.cache.index.DynamicEnableIndexingBasicSelfTest; +import org.apache.ignite.internal.processors.cache.index.DynamicEnableIndexingConcurrentSelfTest; +import org.apache.ignite.internal.processors.cache.index.DynamicIndexCreateAfterClusterRestartTest; +import org.apache.ignite.internal.processors.cache.index.DynamicIndexReplicatedAtomicConcurrentSelfTest; +import org.apache.ignite.internal.processors.query.CreateIndexOnInvalidDataTypeTest; +import org.apache.ignite.internal.processors.query.DisabledSqlFunctionsTest; +import org.apache.ignite.internal.processors.query.IgniteCacheGroupsCompareQueryTest; +import org.apache.ignite.internal.processors.query.IgniteCacheGroupsSqlSegmentedIndexSelfTest; +import org.apache.ignite.internal.processors.query.LazyOnDmlTest; +import org.apache.ignite.internal.processors.query.SqlIndexConsistencyAfterInterruptTxCacheOperationTest; +import org.apache.ignite.internal.processors.query.SqlTwoCachesInGroupWithSameEntryTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Test suite for cache queries. Split off from {@link IgniteBinaryCacheQueryTestSuite2} to reduce + * the single-suite runtime in CI; contains an independent subset of the same test classes. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + LazyOnDmlTest.class, + CreateIndexOnInvalidDataTypeTest.class, + DisabledSqlFunctionsTest.class, + SqlIndexConsistencyAfterInterruptTxCacheOperationTest.class, + SqlTwoCachesInGroupWithSameEntryTest.class, + DynamicIndexReplicatedAtomicConcurrentSelfTest.class, + DynamicIndexCreateAfterClusterRestartTest.class, + DynamicColumnsConcurrentTransactionalPartitionedSelfTest.class, + DynamicColumnsConcurrentAtomicReplicatedSelfTest.class, + DynamicEnableIndexingBasicSelfTest.class, + DynamicEnableIndexingConcurrentSelfTest.class, + IgniteCacheQueryMultiThreadedSelfTest.class, + IgniteCacheQueryEvictsMultiThreadedSelfTest.class, + IgniteCacheClientQueryReplicatedNodeRestartSelfTest.class, + IgniteCacheQueryNodeFailTest.class, + IgniteCacheQueryNodeRestartSelfTest.class, + IgniteSqlQueryWithBaselineTest.class, + CacheScanPartitionQueryFallbackSelfTest.class, + IgniteCacheGroupsCompareQueryTest.class, + IgniteCacheGroupsSqlSegmentedIndexSelfTest.class, + QueryJoinWithDifferentNodeFiltersTest.class, +}) +public class IgniteBinaryCacheQueryTestSuite5 { +} diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite6.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite6.java new file mode 100644 index 0000000000000..3618b32d6c372 --- /dev/null +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite6.java @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.testsuites; + +import org.apache.ignite.internal.processors.cache.AffinityAliasKeyTest; +import org.apache.ignite.internal.processors.cache.CacheOffheapBatchIndexingMultiTypeTest; +import org.apache.ignite.internal.processors.cache.GridCacheQueryIndexDisabledSelfTest; +import org.apache.ignite.internal.processors.cache.GridCacheQueryInternalKeysSelfTest; +import org.apache.ignite.internal.processors.cache.GridCacheQueryPartitionsReleaseTest; +import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectFieldsQuerySelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheDeleteSqlQuerySelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheDuplicateEntityConfigurationSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheJoinPartitionedAndReplicatedCollocationTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheJoinQueryWithAffinityKeyTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheOffheapEvictQueryTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheParallelismQuerySortOrderTest; +import org.apache.ignite.internal.processors.cache.IgniteCachePrimitiveFieldsQuerySelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheSqlDmlErrorSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheSqlInsertValidationSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheSqlQueryErrorSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteClientReconnectCacheQueriesFailoverTest; +import org.apache.ignite.internal.processors.cache.IgniteDynamicSqlRestoreTest; +import org.apache.ignite.internal.processors.cache.IncorrectQueryEntityTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheAtomicNearEnabledQuerySelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedQueryP2PDisabledSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedQuerySelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedSnapshotEnabledQuerySelfTest; +import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNoRebalanceSelfTest; +import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedQueryP2PDisabledSelfTest; +import org.apache.ignite.internal.processors.cache.index.BPlusTreeMetricsTest; +import org.apache.ignite.internal.processors.cache.index.BasicIndexMultinodeTest; +import org.apache.ignite.internal.processors.cache.index.ComplexPrimaryKeyUnwrapSelfTest; +import org.apache.ignite.internal.processors.cache.index.DuplicateKeyValueClassesSelfTest; +import org.apache.ignite.internal.processors.cache.index.DynamicIndexClientBasicSelfTest; +import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerCoordinatorBasicSelfTest; +import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerNodeFilterCoordinatorBasicSelfTest; +import org.apache.ignite.internal.processors.cache.index.ErroneousQueryEntityConfigurationTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicColumnsServerBasicSelfTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicPartitionedSelfTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexTransactionalPartitionedNearSelfTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientAtomicPartitionedNoBackupsTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientAtomicPartitionedTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientTransactionalPartitionedNoBackupsTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerAtomicPartitionedNoBackupsTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerAtomicPartitionedTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerAtomicReplicatedTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerTransactionalPartitionedTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerTransactionalReplicatedTest; +import org.apache.ignite.internal.processors.cache.index.H2DynamicTableSelfTest; +import org.apache.ignite.internal.processors.cache.index.IndexMetricsTest; +import org.apache.ignite.internal.processors.cache.index.QueryEntityValidationSelfTest; +import org.apache.ignite.internal.processors.cache.index.SchemaExchangeSelfTest; +import org.apache.ignite.internal.processors.cache.index.StopNodeOnRebuildIndexFailureTest; +import org.apache.ignite.internal.processors.cache.query.CacheScanQueryFailoverTest; +import org.apache.ignite.internal.processors.cache.query.GridCacheQueryTransformerSelfTest; +import org.apache.ignite.internal.processors.cache.transaction.DmlInsideTransactionTest; +import org.apache.ignite.internal.processors.client.ClientConnectorConfigurationValidationSelfTest; +import org.apache.ignite.internal.processors.query.IgniteSqlSegmentedIndexSelfTest; +import org.apache.ignite.internal.processors.query.IgniteSqlSkipReducerOnUpdateDmlFlagSelfTest; +import org.apache.ignite.internal.processors.query.IgniteSqlSkipReducerOnUpdateDmlSelfTest; +import org.apache.ignite.internal.processors.query.IgniteSqlSplitterSelfTest; +import org.apache.ignite.internal.processors.query.RunningQueriesTest; +import org.apache.ignite.internal.processors.query.SqlResultSetMetaSelfTest; +import org.apache.ignite.internal.processors.query.SqlSchemaSelfTest; +import org.apache.ignite.internal.processors.query.h2.IgniteSqlBigIntegerKeyTest; +import org.apache.ignite.internal.processors.query.h2.sql.SqlUnsupportedSelfTest; +import org.apache.ignite.internal.sql.SqlParserCreateIndexSelfTest; +import org.apache.ignite.internal.sql.SqlParserKillQuerySelfTest; +import org.apache.ignite.internal.sql.SqlParserSetStreamingSelfTest; +import org.apache.ignite.internal.sql.SqlParserViewSelfTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * Split off from {@link IgniteBinaryCacheQueryTestSuite} to reduce the single-suite runtime in CI; + * contains an independent subset of the same test classes. + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + AffinityAliasKeyTest.class, + DmlInsideTransactionTest.class, + ComplexPrimaryKeyUnwrapSelfTest.class, + RunningQueriesTest.class, + DeletionDuringRebalanceTest.class, + SqlParserCreateIndexSelfTest.class, + SqlParserSetStreamingSelfTest.class, + SqlParserKillQuerySelfTest.class, + SqlParserViewSelfTest.class, + ClientConnectorConfigurationValidationSelfTest.class, + SqlSchemaSelfTest.class, + SqlResultSetMetaSelfTest.class, + ErroneousQueryEntityConfigurationTest.class, + BasicIndexMultinodeTest.class, + IndexMetricsTest.class, + BPlusTreeMetricsTest.class, + QueryEntityValidationSelfTest.class, + DuplicateKeyValueClassesSelfTest.class, + GridCacheQueryPartitionsReleaseTest.class, + StopNodeOnRebuildIndexFailureTest.class, + SchemaExchangeSelfTest.class, + DynamicIndexServerCoordinatorBasicSelfTest.class, + DynamicIndexServerNodeFilterCoordinatorBasicSelfTest.class, + DynamicIndexClientBasicSelfTest.class, + IgniteCacheSqlQueryErrorSelfTest.class, + IgniteCacheSqlDmlErrorSelfTest.class, + SqlUnsupportedSelfTest.class, + IgniteCacheDuplicateEntityConfigurationSelfTest.class, + IncorrectQueryEntityTest.class, + IgniteDynamicSqlRestoreTest.class, + IgniteSqlSplitterSelfTest.class, + IgniteSqlSegmentedIndexSelfTest.class, + GridCacheQueryIndexDisabledSelfTest.class, + IgniteCacheReplicatedQueryP2PDisabledSelfTest.class, + IgniteCachePartitionedQuerySelfTest.class, + IgniteCachePartitionedSnapshotEnabledQuerySelfTest.class, + IgniteCacheAtomicNearEnabledQuerySelfTest.class, + IgniteCachePartitionedQueryP2PDisabledSelfTest.class, + IgniteCacheParallelismQuerySortOrderTest.class, + IgniteCacheJoinPartitionedAndReplicatedCollocationTest.class, + IgniteClientReconnectCacheQueriesFailoverTest.class, + CacheOffheapBatchIndexingMultiTypeTest.class, + GridCacheQueryInternalKeysSelfTest.class, + IgniteSqlBigIntegerKeyTest.class, + IgniteCacheOffheapEvictQueryTest.class, + IgniteBinaryObjectFieldsQuerySelfTest.class, + IgniteCacheQueryNoRebalanceSelfTest.class, + GridCacheQueryTransformerSelfTest.class, + CacheScanQueryFailoverTest.class, + IgniteCachePrimitiveFieldsQuerySelfTest.class, + IgniteCacheJoinQueryWithAffinityKeyTest.class, + IgniteCacheDeleteSqlQuerySelfTest.class, + IgniteSqlSkipReducerOnUpdateDmlSelfTest.class, + IgniteSqlSkipReducerOnUpdateDmlFlagSelfTest.class, + IgniteCacheSqlInsertValidationSelfTest.class, + H2DynamicIndexTransactionalPartitionedNearSelfTest.class, + H2DynamicIndexAtomicPartitionedSelfTest.class, + H2DynamicTableSelfTest.class, + H2DynamicColumnsServerBasicSelfTest.class, + H2DynamicIndexingComplexClientAtomicPartitionedTest.class, + H2DynamicIndexingComplexClientAtomicPartitionedNoBackupsTest.class, + H2DynamicIndexingComplexClientTransactionalPartitionedNoBackupsTest.class, + H2DynamicIndexingComplexServerAtomicPartitionedTest.class, + H2DynamicIndexingComplexServerAtomicPartitionedNoBackupsTest.class, + H2DynamicIndexingComplexServerAtomicReplicatedTest.class, + H2DynamicIndexingComplexServerTransactionalPartitionedTest.class, + H2DynamicIndexingComplexServerTransactionalReplicatedTest.class, +}) +public class IgniteBinaryCacheQueryTestSuite6 { +} diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite6.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite6.java index 81047163d7542..60d7e9954ddb4 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite6.java +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite6.java @@ -49,6 +49,7 @@ import org.apache.ignite.internal.processors.query.IgniteSqlSinglePartitionMultiParallelismTest; import org.apache.ignite.internal.processors.query.MemLeakOnSqlWithClientReconnectTest; import org.apache.ignite.internal.processors.query.QueryEntityAliasesTest; +import org.apache.ignite.internal.processors.query.schema.message.QueryEntityMessageSerializationTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -90,6 +91,7 @@ DropTableAfterCteSqlQueryTest.class, LocalContinuousQueryWithNodeFailureTest.class, ContinuousQueryUserCodeExceptionTest.class, + QueryEntityMessageSerializationTest.class, }) public class IgniteCacheQuerySelfTestSuite6 { } diff --git a/modules/jta/pom.xml b/modules/jta/pom.xml index 5a031057f2aeb..21909a7f7948a 100644 --- a/modules/jta/pom.xml +++ b/modules/jta/pom.xml @@ -41,9 +41,9 @@ - javax.transaction - jta - 1.1 + jakarta.transaction + jakarta.transaction-api + 2.0.1 @@ -53,16 +53,16 @@ - org.ow2.jotm - jotm-core - ${jotm.version} + org.jboss.narayana.jta + narayana-jta + ${narayana.version} test - javax.resource - connector-api - 1.5 + org.jboss.logging + jboss-logging + ${jboss.logging.version} test @@ -100,15 +100,6 @@ test - - - - org.jboss.spec.javax.rmi - jboss-rmi-api_1.0_spec - ${jboss.rmi.version} - test - - diff --git a/modules/jta/src/main/java/org/apache/ignite/cache/jta/CacheTmLookup.java b/modules/jta/src/main/java/org/apache/ignite/cache/jta/CacheTmLookup.java index 7f973848a8417..8a0659e2a9cf0 100644 --- a/modules/jta/src/main/java/org/apache/ignite/cache/jta/CacheTmLookup.java +++ b/modules/jta/src/main/java/org/apache/ignite/cache/jta/CacheTmLookup.java @@ -17,7 +17,7 @@ package org.apache.ignite.cache.jta; -import javax.transaction.TransactionManager; +import jakarta.transaction.TransactionManager; import org.apache.ignite.IgniteException; import org.apache.ignite.configuration.TransactionConfiguration; import org.jetbrains.annotations.Nullable; diff --git a/modules/jta/src/main/java/org/apache/ignite/cache/jta/jndi/CacheJndiTmFactory.java b/modules/jta/src/main/java/org/apache/ignite/cache/jta/jndi/CacheJndiTmFactory.java index 10f3f86c77960..b6c778c7ba641 100644 --- a/modules/jta/src/main/java/org/apache/ignite/cache/jta/jndi/CacheJndiTmFactory.java +++ b/modules/jta/src/main/java/org/apache/ignite/cache/jta/jndi/CacheJndiTmFactory.java @@ -20,10 +20,10 @@ import java.util.Arrays; import java.util.Hashtable; import java.util.Map; +import jakarta.transaction.TransactionManager; import javax.cache.configuration.Factory; import javax.naming.InitialContext; import javax.naming.NamingException; -import javax.transaction.TransactionManager; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.util.typedef.internal.U; diff --git a/modules/jta/src/main/java/org/apache/ignite/cache/jta/jndi/CacheJndiTmLookup.java b/modules/jta/src/main/java/org/apache/ignite/cache/jta/jndi/CacheJndiTmLookup.java index dfd8b5e3cca65..db01b36d48440 100644 --- a/modules/jta/src/main/java/org/apache/ignite/cache/jta/jndi/CacheJndiTmLookup.java +++ b/modules/jta/src/main/java/org/apache/ignite/cache/jta/jndi/CacheJndiTmLookup.java @@ -18,9 +18,9 @@ package org.apache.ignite.cache.jta.jndi; import java.util.List; +import jakarta.transaction.TransactionManager; import javax.naming.InitialContext; import javax.naming.NamingException; -import javax.transaction.TransactionManager; import org.apache.ignite.IgniteException; import org.apache.ignite.cache.jta.CacheTmLookup; import org.jetbrains.annotations.Nullable; diff --git a/modules/jta/src/main/java/org/apache/ignite/cache/jta/reflect/CacheReflectionTmLookup.java b/modules/jta/src/main/java/org/apache/ignite/cache/jta/reflect/CacheReflectionTmLookup.java index 25b06de220152..96cf03de0d61a 100644 --- a/modules/jta/src/main/java/org/apache/ignite/cache/jta/reflect/CacheReflectionTmLookup.java +++ b/modules/jta/src/main/java/org/apache/ignite/cache/jta/reflect/CacheReflectionTmLookup.java @@ -18,7 +18,7 @@ package org.apache.ignite.cache.jta.reflect; import java.lang.reflect.InvocationTargetException; -import javax.transaction.TransactionManager; +import jakarta.transaction.TransactionManager; import org.apache.ignite.IgniteException; import org.apache.ignite.cache.jta.CacheTmLookup; import org.apache.ignite.internal.util.typedef.internal.A; diff --git a/modules/jta/src/main/java/org/apache/ignite/cache/jta/websphere/WebSphereLibertyTmFactory.java b/modules/jta/src/main/java/org/apache/ignite/cache/jta/websphere/WebSphereLibertyTmFactory.java index aa579ade02f99..581078a97e2a5 100644 --- a/modules/jta/src/main/java/org/apache/ignite/cache/jta/websphere/WebSphereLibertyTmFactory.java +++ b/modules/jta/src/main/java/org/apache/ignite/cache/jta/websphere/WebSphereLibertyTmFactory.java @@ -18,8 +18,8 @@ package org.apache.ignite.cache.jta.websphere; import java.lang.reflect.InvocationTargetException; +import jakarta.transaction.TransactionManager; import javax.cache.configuration.Factory; -import javax.transaction.TransactionManager; import org.apache.ignite.IgniteException; /** diff --git a/modules/jta/src/main/java/org/apache/ignite/cache/jta/websphere/WebSphereTmFactory.java b/modules/jta/src/main/java/org/apache/ignite/cache/jta/websphere/WebSphereTmFactory.java index 85886df7eed0c..7276e12932fc6 100644 --- a/modules/jta/src/main/java/org/apache/ignite/cache/jta/websphere/WebSphereTmFactory.java +++ b/modules/jta/src/main/java/org/apache/ignite/cache/jta/websphere/WebSphereTmFactory.java @@ -21,16 +21,16 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import jakarta.transaction.HeuristicMixedException; +import jakarta.transaction.HeuristicRollbackException; +import jakarta.transaction.InvalidTransactionException; +import jakarta.transaction.NotSupportedException; +import jakarta.transaction.RollbackException; +import jakarta.transaction.Synchronization; +import jakarta.transaction.SystemException; +import jakarta.transaction.Transaction; +import jakarta.transaction.TransactionManager; import javax.cache.configuration.Factory; -import javax.transaction.HeuristicMixedException; -import javax.transaction.HeuristicRollbackException; -import javax.transaction.InvalidTransactionException; -import javax.transaction.NotSupportedException; -import javax.transaction.RollbackException; -import javax.transaction.Synchronization; -import javax.transaction.SystemException; -import javax.transaction.Transaction; -import javax.transaction.TransactionManager; import javax.transaction.xa.XAResource; import org.apache.ignite.IgniteException; diff --git a/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaManager.java b/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaManager.java index b98a7f8b006b4..854773ad259cf 100644 --- a/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaManager.java +++ b/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaManager.java @@ -18,11 +18,11 @@ package org.apache.ignite.internal.processors.cache.jta; import java.util.concurrent.atomic.AtomicReference; +import jakarta.transaction.RollbackException; +import jakarta.transaction.SystemException; +import jakarta.transaction.Transaction; +import jakarta.transaction.TransactionManager; import javax.cache.configuration.Factory; -import javax.transaction.RollbackException; -import javax.transaction.SystemException; -import javax.transaction.Transaction; -import javax.transaction.TransactionManager; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.jta.CacheTmLookup; import org.apache.ignite.configuration.CacheConfiguration; diff --git a/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java b/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java index 5b1b37a15db5f..81edfc40833d4 100644 --- a/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java +++ b/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java @@ -18,9 +18,9 @@ package org.apache.ignite.internal.processors.cache.jta; import java.util.concurrent.atomic.AtomicReference; +import jakarta.transaction.Status; +import jakarta.transaction.Synchronization; import javax.cache.CacheException; -import javax.transaction.Status; -import javax.transaction.Synchronization; import javax.transaction.xa.XAException; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/CacheJndiTmFactorySelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/CacheJndiTmFactorySelfTest.java index f3781d4af58e3..8f3ba7014403e 100644 --- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/CacheJndiTmFactorySelfTest.java +++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/CacheJndiTmFactorySelfTest.java @@ -18,16 +18,16 @@ package org.apache.ignite.internal.processors.cache; import java.util.concurrent.Callable; +import jakarta.transaction.HeuristicMixedException; +import jakarta.transaction.HeuristicRollbackException; +import jakarta.transaction.InvalidTransactionException; +import jakarta.transaction.NotSupportedException; +import jakarta.transaction.RollbackException; +import jakarta.transaction.SystemException; +import jakarta.transaction.Transaction; +import jakarta.transaction.TransactionManager; import javax.naming.Context; import javax.naming.InitialContext; -import javax.transaction.HeuristicMixedException; -import javax.transaction.HeuristicRollbackException; -import javax.transaction.InvalidTransactionException; -import javax.transaction.NotSupportedException; -import javax.transaction.RollbackException; -import javax.transaction.SystemException; -import javax.transaction.Transaction; -import javax.transaction.TransactionManager; import org.apache.ignite.IgniteException; import org.apache.ignite.cache.jta.jndi.CacheJndiTmFactory; import org.apache.ignite.testframework.GridTestUtils; diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheJtaConfigurationValidationSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheJtaConfigurationValidationSelfTest.java index db41a0cd4e7e8..c79578918361c 100644 --- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheJtaConfigurationValidationSelfTest.java +++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheJtaConfigurationValidationSelfTest.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.processors.cache; import java.util.concurrent.Callable; -import javax.transaction.TransactionManager; +import jakarta.transaction.TransactionManager; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.jta.CacheTmLookup; import org.apache.ignite.configuration.CacheConfiguration; diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheJtaFactoryConfigValidationSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheJtaFactoryConfigValidationSelfTest.java index ffb08e7da9145..e7617f531bc0c 100644 --- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheJtaFactoryConfigValidationSelfTest.java +++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheJtaFactoryConfigValidationSelfTest.java @@ -18,8 +18,8 @@ package org.apache.ignite.internal.processors.cache; import java.util.concurrent.Callable; +import jakarta.transaction.TransactionManager; import javax.cache.configuration.Factory; -import javax.transaction.TransactionManager; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridJtaLifecycleAwareSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridJtaLifecycleAwareSelfTest.java index 695e9953298d6..9a4658e98d5a6 100644 --- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridJtaLifecycleAwareSelfTest.java +++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridJtaLifecycleAwareSelfTest.java @@ -17,8 +17,8 @@ package org.apache.ignite.internal.processors.cache; +import jakarta.transaction.TransactionManager; import javax.cache.configuration.Factory; -import javax.transaction.TransactionManager; import org.apache.ignite.Ignite; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.jta.CacheTmLookup; @@ -142,8 +142,8 @@ public static class TestTxFactory extends GridAbstractLifecycleAwareSelfTest.Tes /** {@inheritDoc} */ @Test - @Override public void testLifecycleAware() throws Exception { - // No-op, see anothre tests. + @Override public void testLifecycleAware() { + // No-op, see other tests. } /** */ diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridJtaTransactionManagerSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridJtaTransactionManagerSelfTest.java index e85d196880f75..cab956e9f0fa4 100644 --- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridJtaTransactionManagerSelfTest.java +++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridJtaTransactionManagerSelfTest.java @@ -19,9 +19,10 @@ import java.util.Arrays; import java.util.Collection; +import jakarta.transaction.Transaction; +import jakarta.transaction.TransactionManager; import javax.cache.configuration.Factory; -import javax.transaction.Transaction; -import javax.transaction.TransactionManager; +import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple; import org.apache.ignite.IgniteCache; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.TransactionConfiguration; @@ -31,9 +32,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.objectweb.jotm.Current; -import org.objectweb.jotm.Jotm; -import org.objectweb.jotm.rmi.RmiLocalConfiguration; import static org.apache.ignite.cache.CacheMode.PARTITIONED; import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC; @@ -45,8 +43,8 @@ */ @RunWith(Parameterized.class) public class GridJtaTransactionManagerSelfTest extends GridCommonAbstractTest { - /** Java Open Transaction Manager facade. */ - private static Jotm jotm; + /** Transaction manager. */ + private static TransactionManager txMgr; /** * @return Test parameters. @@ -77,18 +75,11 @@ public static Collection parameters() { @Override protected void beforeTestsStarted() throws Exception { super.beforeTestsStarted(); - jotm = new Jotm(true, false, new RmiLocalConfiguration()); - - Current.setAppServer(false); + txMgr = new TransactionManagerImple(); startGrid(); } - /** {@inheritDoc} */ - @Override protected void afterTestsStopped() throws Exception { - jotm.stop(); - } - /** * Test for switching tx context by JTA Manager. * @@ -102,7 +93,7 @@ public void testJtaTxContextSwitch() throws Exception { cfg.setDefaultTxConcurrency(txConcurrency); cfg.setDefaultTxIsolation(isolation); - TransactionManager jtaTm = jotm.getTransactionManager(); + TransactionManager jtaTm = txMgr; IgniteCache cache = jcache(); @@ -120,8 +111,21 @@ public void testJtaTxContextSwitch() throws Exception { assertEquals(Integer.toString(1), cache.get(1)); + org.apache.ignite.transactions.Transaction igniteTx = grid().transactions().tx(); + jtaTm.suspend(); + // Narayana's TransactionManagerImple.suspend() only detaches the JTA transaction from the + // current thread context without calling XAResource.end(xid, TMSUSPEND) on enlisted + // XA resources. This behavior is fully compliant with the JTA specification: the spec + // defines TransactionManager.suspend() as "suspend the current transaction and return + // it" without requiring end() callbacks on XA resources. + // The previous JTA provider (JOTM) called end(TMSUSPEND) as an implementation detail + // (not because the spec required it), which is why this test worked out of the box + // with JOTM. To compensate for Narayana's spec-compliant behavior, we must explicitly + // suspend the Ignite transaction to detach it from the thread. + igniteTx.suspend(); + assertNull(grid().transactions().tx()); assertNull(cache.get(1)); @@ -148,6 +152,16 @@ public void testJtaTxContextSwitch() throws Exception { jtaTm.resume(tx1); + // Narayana's TransactionManagerImple.resume() only reattaches the JTA transaction to the + // current thread context without calling XAResource.start(xid, TMRESUME) on previously + // enlisted XA resources. This is also fully compliant with the JTA specification: + // TransactionManager.resume() is defined as "resume a previously suspended transaction" + // without requiring start() callbacks on XA resources. + // Similarly to suspend(), JOTM called start(TMRESUME) as an implementation detail, + // not because the spec required it. To compensate for Narayana's behavior, we must + // explicitly resume the Ignite transaction to reattach it to the thread. + igniteTx.resume(); + assertNotNull(grid().transactions().tx()); assertEquals(ACTIVE, grid().transactions().tx().state()); @@ -177,7 +191,7 @@ public void testJtaTxContextSwitchWithExistingTx() throws Exception { cfg.setDefaultTxConcurrency(txConcurrency); cfg.setDefaultTxIsolation(isolation); - TransactionManager jtaTm = jotm.getTransactionManager(); + TransactionManager jtaTm = txMgr; IgniteCache cache = jcache(); @@ -231,7 +245,7 @@ static class TestTxManagerFactory implements Factory { /** {@inheritDoc} */ @Override public TransactionManager create() { - return jotm.getTransactionManager(); + return txMgr; } } } diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/AbstractCacheJtaSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/AbstractCacheJtaSelfTest.java index 8fb9f1e7b6c62..0a2e9a4b421ff 100644 --- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/AbstractCacheJtaSelfTest.java +++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/AbstractCacheJtaSelfTest.java @@ -19,8 +19,11 @@ import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; -import javax.transaction.Status; -import javax.transaction.UserTransaction; +import jakarta.transaction.Status; +import jakarta.transaction.TransactionManager; +import jakarta.transaction.UserTransaction; +import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple; +import com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.configuration.CacheConfiguration; @@ -30,8 +33,6 @@ import org.apache.ignite.testframework.GridTestSafeThreadFactory; import org.apache.ignite.transactions.Transaction; import org.junit.Test; -import org.objectweb.jotm.Jotm; -import org.objectweb.jotm.rmi.RmiLocalConfiguration; import static org.apache.ignite.cache.CacheMode.PARTITIONED; import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; @@ -45,23 +46,20 @@ public abstract class AbstractCacheJtaSelfTest extends GridCacheAbstractSelfTest /** */ private static final int GRID_CNT = 1; - /** Java Open Transaction Manager facade. */ - protected static Jotm jotm; + /** Transaction manager. */ + protected static TransactionManager txMgr; + + /** User transaction. */ + protected static UserTransaction userTx; /** {@inheritDoc} */ @Override protected void beforeTestsStarted() throws Exception { - jotm = new Jotm(true, false, new RmiLocalConfiguration()); + txMgr = new TransactionManagerImple(); + userTx = new UserTransactionImple(); super.beforeTestsStarted(); } - /** {@inheritDoc} */ - @Override protected void afterTestsStopped() throws Exception { - super.afterTestsStopped(); - - jotm.stop(); - } - /** {@inheritDoc} */ @Override protected int gridCount() { return GRID_CNT; @@ -101,7 +99,7 @@ public abstract class AbstractCacheJtaSelfTest extends GridCacheAbstractSelfTest */ @Test public void testJta() throws Exception { - UserTransaction jtaTx = jotm.getUserTransaction(); + UserTransaction jtaTx = userTx; IgniteCache cache = jcache(); @@ -145,7 +143,7 @@ public void testJta() throws Exception { */ @Test public void testJtaTwoCaches() throws Exception { - UserTransaction jtaTx = jotm.getUserTransaction(); + UserTransaction jtaTx = userTx; IgniteEx ignite = grid(0); @@ -205,7 +203,7 @@ public void testAsyncOpAwait() throws Exception { @Override public Object call() throws Exception { assertNull(grid(0).transactions().tx()); - UserTransaction jtaTx = jotm.getUserTransaction(); + UserTransaction jtaTx = userTx; jtaTx.begin(); diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactorySelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactorySelfTest.java index ec9f8e8761def..df090fc0fd097 100644 --- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactorySelfTest.java +++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactorySelfTest.java @@ -17,8 +17,8 @@ package org.apache.ignite.internal.processors.cache.jta; +import jakarta.transaction.TransactionManager; import javax.cache.configuration.Factory; -import javax.transaction.TransactionManager; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.TransactionConfiguration; @@ -42,7 +42,7 @@ static class TestTxManagerFactory implements Factory { /** {@inheritDoc} */ @Override public TransactionManager create() { - return jotm.getTransactionManager(); + return txMgr; } } } diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaLookupClassNameSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaLookupClassNameSelfTest.java index 573a543318988..09bc63a0d3b3b 100644 --- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaLookupClassNameSelfTest.java +++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaLookupClassNameSelfTest.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.processors.cache.jta; import java.util.concurrent.Callable; -import javax.transaction.TransactionManager; +import jakarta.transaction.TransactionManager; import org.apache.ignite.IgniteException; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.jta.CacheTmLookup; @@ -66,7 +66,7 @@ public void testIncompatibleTmLookup() { public static class TestTmLookup implements CacheTmLookup { /** {@inheritDoc} */ @Override public TransactionManager getTm() { - return jotm.getTransactionManager(); + return txMgr; } } diff --git a/modules/nio/pom.xml b/modules/nio/pom.xml new file mode 100644 index 0000000000000..c6247439fee3d --- /dev/null +++ b/modules/nio/pom.xml @@ -0,0 +1,75 @@ + + + + + + + 4.0.0 + + + org.apache.ignite + ignite-parent-internal + ${revision} + ../../parent-internal/pom.xml + + + ignite-nio + + http://ignite.apache.org + + + + ${project.groupId} + ignite-commons + provided + + + + ${project.groupId} + ignite-binary-api + provided + + + + ${project.groupId} + ignite-grid-unsafe + provided + + + + org.jetbrains + annotations + ${jetbrains.annotations.version} + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven.deploy.plugin.version} + + false + + + + + diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java b/modules/nio/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java rename to modules/nio/src/main/java/org/apache/ignite/internal/managers/communication/UnknownMessageException.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientMessage.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/odbc/ClientMessage.java similarity index 97% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientMessage.java rename to modules/nio/src/main/java/org/apache/ignite/internal/processors/odbc/ClientMessage.java index ec592ad63f1c7..525dc2bf46b82 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientMessage.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/processors/odbc/ClientMessage.java @@ -23,7 +23,7 @@ import java.io.ObjectOutput; import java.nio.ByteBuffer; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; -import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.plugin.extensions.communication.Message; /** */ @@ -122,7 +122,7 @@ public boolean writeTo(ByteBuffer buf) { cnt = -4; if (stream != null) { - U.closeQuiet(stream); + CommonUtils.closeQuiet(stream); stream = null; } @@ -212,7 +212,7 @@ public boolean readFrom(ByteBuffer buf) throws IOException { public byte[] payload() { if (stream != null) { data = stream.arrayCopy(); - U.closeQuiet(stream); + CommonUtils.closeQuiet(stream); stream = null; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java rename to modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java rename to modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java diff --git a/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpanManager.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpanManager.java new file mode 100644 index 0000000000000..0d948b5d41fb1 --- /dev/null +++ b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpanManager.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.tracing; + +import org.apache.ignite.plugin.extensions.communication.Message; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Noop implementation of {@link SpanManager}. + */ +public class NoopSpanManager implements SpanManager { + /** Noop serialized span. */ + public static final byte[] NOOP_SERIALIZED_SPAN = new byte[0]; + + /** {@inheritDoc} */ + @Override public Span create(@NotNull SpanType spanType, @Nullable Span parentSpan) { + return NoopSpan.INSTANCE; + } + + /** {@inheritDoc} */ + @Override public Span create(@NotNull SpanType spanType, @Nullable byte[] serializedParentSpan) { + return NoopSpan.INSTANCE; + } + + /** {@inheritDoc} */ + @Override public @NotNull Span create( + @NotNull SpanType spanType, + @Nullable Span parentSpan, + @Nullable String lb) { + return NoopSpan.INSTANCE; + } + + /** {@inheritDoc} */ + @Override public byte[] serialize(@NotNull Span span) { + return NOOP_SERIALIZED_SPAN; + } + + /** {@inheritDoc} */ + @Override public String traceName(Message msg) { + return null; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java rename to modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java similarity index 89% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java rename to modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java index 010506dca3963..be43ec4cabb7c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.tracing; +import org.apache.ignite.plugin.extensions.communication.Message; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -70,4 +71,10 @@ default Span create(@NotNull SpanType spanType) { * @param span Span. */ byte[] serialize(@NotNull Span span); + + /** + * @param msg Message to resolve a trace name for. + * @return Trace name of the message, or {@code null} if tracing is disabled. + */ + @Nullable String traceName(Message msg); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java rename to modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java rename to modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java b/modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java rename to modules/nio/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridAbstractCommunicationClient.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridAbstractCommunicationClient.java similarity index 91% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridAbstractCommunicationClient.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridAbstractCommunicationClient.java index 79de224b7772a..267d43156f0c9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridAbstractCommunicationClient.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridAbstractCommunicationClient.java @@ -18,15 +18,15 @@ package org.apache.ignite.internal.util.nio; import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; /** * Implements basic lifecycle for communication clients. */ public abstract class GridAbstractCommunicationClient implements GridCommunicationClient { /** Time when this client was last used. */ - private volatile long lastUsed = U.currentTimeMillis(); + private volatile long lastUsed = CommonUtils.currentTimeMillis(); /** Reservations. */ private final AtomicBoolean closed = new AtomicBoolean(); @@ -73,14 +73,14 @@ protected GridAbstractCommunicationClient(int connIdx) { /** {@inheritDoc} */ @Override public long getIdleTime() { - return U.currentTimeMillis() - lastUsed; + return CommonUtils.currentTimeMillis() - lastUsed; } /** * Updates used time. */ protected void markUsed() { - lastUsed = U.currentTimeMillis(); + lastUsed = CommonUtils.currentTimeMillis(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridBufferedParser.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridBufferedParser.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridBufferedParser.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridBufferedParser.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridCommunicationClient.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridCommunicationClient.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridCommunicationClient.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridCommunicationClient.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridConnectionBytesVerifyFilter.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridConnectionBytesVerifyFilter.java similarity index 86% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridConnectionBytesVerifyFilter.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridConnectionBytesVerifyFilter.java index 3829aaa6aa0e5..fe1c834c1d3b6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridConnectionBytesVerifyFilter.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridConnectionBytesVerifyFilter.java @@ -22,15 +22,15 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.internal.LT; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteInClosure; /** * Verifies that first bytes received in accepted (incoming) - * NIO session are equal to {@link U#IGNITE_HEADER}. + * NIO session are equal to {@link CommonUtils#IGNITE_HEADER}. *

      - * First {@code U.IGNITE_HEADER.length} bytes are consumed by this filter + * First {@code CommonUtils.IGNITE_HEADER.length} bytes are consumed by this filter * and all other bytes are forwarded through chain without any modification. */ public class GridConnectionBytesVerifyFilter extends GridNioFilterAdapter { @@ -99,27 +99,27 @@ public GridConnectionBytesVerifyFilter(IgniteLogger log) { Integer magic = ses.meta(MAGIC_META_KEY); - if (magic == null || magic < U.IGNITE_HEADER.length) { + if (magic == null || magic < CommonUtils.IGNITE_HEADER.length) { byte[] magicBuf = ses.meta(MAGIC_BUF_KEY); if (magicBuf == null) - magicBuf = new byte[U.IGNITE_HEADER.length]; + magicBuf = new byte[CommonUtils.IGNITE_HEADER.length]; int magicRead = magic == null ? 0 : magic; int cnt = buf.remaining(); - buf.get(magicBuf, magicRead, Math.min(U.IGNITE_HEADER.length - magicRead, cnt)); + buf.get(magicBuf, magicRead, Math.min(CommonUtils.IGNITE_HEADER.length - magicRead, cnt)); - if (cnt + magicRead < U.IGNITE_HEADER.length) { + if (cnt + magicRead < CommonUtils.IGNITE_HEADER.length) { // Magic bytes are not fully read. ses.addMeta(MAGIC_META_KEY, cnt + magicRead); ses.addMeta(MAGIC_BUF_KEY, magicBuf); } - else if (U.bytesEqual(magicBuf, 0, U.IGNITE_HEADER, 0, U.IGNITE_HEADER.length)) { + else if (CommonUtils.bytesEqual(magicBuf, 0, CommonUtils.IGNITE_HEADER, 0, CommonUtils.IGNITE_HEADER.length)) { // Magic bytes read and equal to IGNITE_HEADER. ses.removeMeta(MAGIC_BUF_KEY); - ses.addMeta(MAGIC_META_KEY, U.IGNITE_HEADER.length); + ses.addMeta(MAGIC_META_KEY, CommonUtils.IGNITE_HEADER.length); proceedMessageReceived(ses, buf); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridDelimitedParser.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridDelimitedParser.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridDelimitedParser.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridDelimitedParser.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridDirectParser.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridDirectParser.java similarity index 89% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridDirectParser.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridDirectParser.java index faf416dfdbee7..a78a97ea37fcd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridDirectParser.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridDirectParser.java @@ -22,14 +22,14 @@ import java.nio.ByteBuffer; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; -import org.apache.ignite.internal.direct.DirectMessageReader; -import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.plugin.extensions.communication.MessageFactory; +import org.apache.ignite.plugin.extensions.communication.MessageReader; import org.apache.ignite.plugin.extensions.communication.MessageSerializer; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.makeMessageType; +import static org.apache.ignite.internal.util.CommonUtils.makeMessageType; /** * Parser for direct messages. @@ -67,10 +67,10 @@ public GridDirectParser(IgniteLogger log, MessageFactory msgFactory, GridNioMess /** {@inheritDoc} */ @Nullable @Override public Object decode(GridNioSession ses, ByteBuffer buf) throws IOException, IgniteCheckedException { - DirectMessageReader reader = ses.meta(READER_META_KEY); + MessageReader reader = ses.meta(READER_META_KEY); if (reader == null) - ses.addMeta(READER_META_KEY, reader = (DirectMessageReader)readerFactory.reader(ses, msgFactory)); + ses.addMeta(READER_META_KEY, reader = readerFactory.reader(ses, msgFactory)); Message msg = ses.removeMeta(MSG_META_KEY); @@ -105,7 +105,7 @@ public GridDirectParser(IgniteLogger log, MessageFactory msgFactory, GridNioMess } } catch (Throwable e) { - U.error(log, "Failed to read message [msg=" + msg + + CommonUtils.error(log, "Failed to read message [msg=" + msg + ", buf=" + buf + ", reader=" + reader + ", ses=" + ses + "]", diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioAsyncNotifyFilter.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioAsyncNotifyFilter.java similarity index 96% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioAsyncNotifyFilter.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioAsyncNotifyFilter.java index 3fb1ec5dd4a8c..4a5889f17dfb3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioAsyncNotifyFilter.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioAsyncNotifyFilter.java @@ -22,7 +22,7 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.worker.GridWorker; import org.apache.ignite.internal.util.worker.GridWorkerPool; import org.apache.ignite.lang.IgniteInClosure; @@ -144,7 +144,7 @@ protected void handleException(GridNioSession ses, IgniteCheckedException ex) { proceedExceptionCaught(ses, ex); } catch (IgniteCheckedException e) { - U.warn(log, "Failed to forward exception to the underlying filter (will ignore) [ses=" + ses + ", " + + CommonUtils.warn(log, "Failed to forward exception to the underlying filter (will ignore) [ses=" + ses + ", " + "originalEx=" + ex + ", ex=" + e + ']'); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioBackPressureControl.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioBackPressureControl.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioBackPressureControl.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioBackPressureControl.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioCodecFilter.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioCodecFilter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioCodecFilter.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioCodecFilter.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioDelimitedBuffer.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioDelimitedBuffer.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioDelimitedBuffer.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioDelimitedBuffer.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioException.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioException.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioException.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioException.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilter.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilter.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilter.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterAdapter.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterAdapter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterAdapter.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterAdapter.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterChain.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterChain.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterChain.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioFilterChain.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioKeyAttachment.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioKeyAttachment.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioKeyAttachment.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioKeyAttachment.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageReaderFactory.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageReaderFactory.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageReaderFactory.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageReaderFactory.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageTracker.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageTracker.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageTracker.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageTracker.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageWriterFactory.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageWriterFactory.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageWriterFactory.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioMessageWriterFactory.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioParser.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioParser.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioParser.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioParser.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioRecoveryDescriptor.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioRecoveryDescriptor.java similarity index 96% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioRecoveryDescriptor.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioRecoveryDescriptor.java index 1cedb7d800ee4..4223821a42eb9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioRecoveryDescriptor.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioRecoveryDescriptor.java @@ -20,9 +20,9 @@ import java.io.IOException; import java.util.ArrayDeque; import java.util.Deque; +import org.apache.ignite.IgniteCommonsSystemProperties; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; -import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; @@ -30,18 +30,16 @@ import org.apache.ignite.lang.IgniteInClosure; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT; +import static org.apache.ignite.IgniteCommonsSystemProperties.DFLT_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT; +import static org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT; /** * Recovery information for single node. */ public class GridNioRecoveryDescriptor { - /** @see IgniteSystemProperties#IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT */ - public static final int DFLT_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT = 5_000; - /** Timeout for outgoing recovery descriptor reservation. */ private static final long DESC_RESERVATION_TIMEOUT = Math.max(1_000, - IgniteSystemProperties.getLong(IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT, + IgniteCommonsSystemProperties.getLong(IGNITE_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT, DFLT_NIO_RECOVERY_DESCRIPTOR_RESERVATION_TIMEOUT)); /** Number of acknowledged messages. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java similarity index 93% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java index 797290677db52..fa23121fd1675 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java @@ -47,25 +47,23 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.LongConsumer; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteCommonsSystemProperties; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; -import org.apache.ignite.IgniteSystemProperties; -import org.apache.ignite.configuration.ConnectorConfiguration; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.IgniteInterruptedCheckedException; -import org.apache.ignite.internal.managers.communication.GridIoMessage; -import org.apache.ignite.internal.processors.metric.MetricRegistryImpl; -import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric; import org.apache.ignite.internal.processors.odbc.ClientMessage; import org.apache.ignite.internal.processors.tracing.MTC; import org.apache.ignite.internal.processors.tracing.MTC.TraceSurroundings; import org.apache.ignite.internal.processors.tracing.NoopSpan; -import org.apache.ignite.internal.processors.tracing.NoopTracing; +import org.apache.ignite.internal.processors.tracing.NoopSpanManager; import org.apache.ignite.internal.processors.tracing.Span; +import org.apache.ignite.internal.processors.tracing.SpanManager; import org.apache.ignite.internal.processors.tracing.SpanTags; import org.apache.ignite.internal.processors.tracing.SpanType; -import org.apache.ignite.internal.processors.tracing.Tracing; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridConcurrentHashSet; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.future.GridCompoundFuture; @@ -77,7 +75,6 @@ import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.LT; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.internal.util.worker.GridWorker; import org.apache.ignite.internal.util.worker.GridWorkerListener; import org.apache.ignite.lang.IgniteBiInClosure; @@ -97,7 +94,6 @@ import static org.apache.ignite.failure.FailureType.SYSTEM_WORKER_TERMINATION; import static org.apache.ignite.internal.processors.tracing.SpanTags.SOCKET_WRITE_BYTES; import static org.apache.ignite.internal.processors.tracing.SpanType.COMMUNICATION_SOCKET_WRITE; -import static org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable.traceName; import static org.apache.ignite.internal.util.nio.GridNioSessionMetaKey.MSG_WRITER; import static org.apache.ignite.internal.util.nio.GridNioSessionMetaKey.NIO_OPERATION; @@ -119,6 +115,9 @@ public class GridNioServer { /** Default session write timeout. */ public static final int DFLT_SES_WRITE_TIMEOUT = 5000; + /** Default value for {@code idleTimeout} (in milliseconds). */ + public static final int DFLT_IDLE_TIMEOUT = 7000; + /** Default send queue limit. */ public static final int DFLT_SEND_QUEUE_LIMIT = 0; @@ -145,10 +144,7 @@ public class GridNioServer { /** */ private static final boolean DISABLE_KEYSET_OPTIMIZATION = - IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_NO_SELECTOR_OPTS); - - /** @see IgniteSystemProperties#IGNITE_IO_BALANCE_PERIOD */ - public static final int DFLT_IO_BALANCE_PERIOD = 5000; + IgniteCommonsSystemProperties.getBoolean(IgniteCommonsSystemProperties.IGNITE_NO_SELECTOR_OPTS); /** */ public static final String OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME = "outboundMessagesQueueSize"; @@ -231,7 +227,7 @@ public class GridNioServer { private volatile long writeTimeout = DFLT_SES_WRITE_TIMEOUT; /** Idle timeout. */ - private volatile long idleTimeout = ConnectorConfiguration.DFLT_IDLE_TIMEOUT; + private volatile long idleTimeout = DFLT_IDLE_TIMEOUT; /** For test purposes only. */ private boolean skipWrite; @@ -251,17 +247,17 @@ public class GridNioServer { /** Whether direct mode is used. */ private final boolean directMode; - /** */ - @Nullable private final MetricRegistryImpl mreg; - /** Received bytes count metric. */ - @Nullable private final LongAdderMetric rcvdBytesCntMetric; + @Nullable private final LongConsumer rcvdBytesCntMetric; /** Sent bytes count metric. */ - @Nullable private final LongAdderMetric sentBytesCntMetric; + @Nullable private final LongConsumer sentBytesCntMetric; /** Outbound messages queue size. */ - @Nullable private final LongAdderMetric outboundMessagesQueueSizeMetric; + @Nullable private final LongConsumer outboundMessagesQueueSizeMetric; + + /** Per-session maximum outbound messages queue size metric. */ + @Nullable private final LongConsumer maxMessagesQueueSizeMetric; /** Sessions. */ private final GridConcurrentHashSet sessions = new GridConcurrentHashSet<>(); @@ -295,8 +291,8 @@ public class GridNioServer { */ private final boolean readWriteSelectorsAssign; - /** Tracing processor. */ - private Tracing tracing; + /** Span manager. */ + private SpanManager tracing; /** Message factory. */ private final MessageFactory msgFactory; @@ -325,7 +321,10 @@ public class GridNioServer { * @param msgQueueLsnr Message queue size listener. * @param readWriteSelectorsAssign If {@code true} then in/out connections are assigned to even/odd workers. * @param workerLsnr Worker lifecycle listener. - * @param mreg Metrics registry. + * @param rcvdBytesCntMetric Received bytes count metric, or {@code null} if metrics disabled. + * @param sentBytesCntMetric Sent bytes count metric, or {@code null} if metrics disabled. + * @param outboundMessagesQueueSizeMetric Per-session outbound messages queue size metric, or {@code null} if metrics disabled. + * @param maxMessagesQueueSizeMetric Per-session maximum outbound messages queue size metric, or {@code null} if metrics disabled. * @param filters Filters for this server. * @throws IgniteCheckedException If failed. */ @@ -351,8 +350,11 @@ private GridNioServer( IgniteBiInClosure msgQueueLsnr, boolean readWriteSelectorsAssign, @Nullable GridWorkerListener workerLsnr, - @Nullable MetricRegistryImpl mreg, - Tracing tracing, + @Nullable LongConsumer rcvdBytesCntMetric, + @Nullable LongConsumer sentBytesCntMetric, + @Nullable LongConsumer outboundMessagesQueueSizeMetric, + @Nullable LongConsumer maxMessagesQueueSizeMetric, + SpanManager tracing, MessageFactory msgFactory, GridNioFilter... filters ) throws IgniteCheckedException { @@ -380,7 +382,11 @@ private GridNioServer( this.selectorSpins = selectorSpins; this.readWriteSelectorsAssign = readWriteSelectorsAssign; this.lsnr = lsnr; - this.tracing = tracing == null ? new NoopTracing() : tracing; + this.rcvdBytesCntMetric = rcvdBytesCntMetric; + this.sentBytesCntMetric = sentBytesCntMetric; + this.outboundMessagesQueueSizeMetric = outboundMessagesQueueSizeMetric; + this.maxMessagesQueueSizeMetric = maxMessagesQueueSizeMetric; + this.tracing = tracing == null ? new NoopSpanManager() : tracing; this.msgFactory = msgFactory; filterChain = new GridNioFilterChain<>(log, lsnr, new HeadFilter(), filters); @@ -433,7 +439,7 @@ private GridNioServer( clientWorkers.add(worker); - clientThreads[i] = U.newThread(worker); + clientThreads[i] = CommonUtils.newThread(worker); clientThreads[i].setDaemon(daemon); } @@ -443,13 +449,13 @@ private GridNioServer( this.skipRecoveryPred = skipRecoveryPred != null ? skipRecoveryPred : F.alwaysFalse(); - long balancePeriod = IgniteSystemProperties.getLong( - IgniteSystemProperties.IGNITE_IO_BALANCE_PERIOD, DFLT_IO_BALANCE_PERIOD); + long balancePeriod = IgniteCommonsSystemProperties.getLong( + IgniteCommonsSystemProperties.IGNITE_IO_BALANCE_PERIOD, IgniteCommonsSystemProperties.DFLT_IO_BALANCE_PERIOD); IgniteRunnable balancer0 = null; if (balancePeriod > 0) { - boolean rndBalance = IgniteSystemProperties.getBoolean(IGNITE_IO_BALANCE_RANDOM_BALANCE, false); + boolean rndBalance = IgniteCommonsSystemProperties.getBoolean(IGNITE_IO_BALANCE_RANDOM_BALANCE, false); if (rndBalance) balancer0 = new RandomBalancer(); @@ -461,27 +467,13 @@ private GridNioServer( } this.balancer = balancer0; + } - this.mreg = mreg; - - rcvdBytesCntMetric = mreg == null ? - null : mreg.longAdderMetric(RECEIVED_BYTES_METRIC_NAME, RECEIVED_BYTES_METRIC_DESC); - - sentBytesCntMetric = mreg == null ? - null : mreg.longAdderMetric(SENT_BYTES_METRIC_NAME, SENT_BYTES_METRIC_DESC); - - outboundMessagesQueueSizeMetric = mreg == null ? null : mreg.longAdderMetric( - OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME, - OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC - ); - - if (mreg != null) { - mreg.register(SESSIONS_CNT_METRIC_NAME, sessions::size, "Active TCP sessions count."); - - boolean sslEnabled = Arrays.stream(filters).anyMatch(filter -> filter instanceof GridNioSslFilter); - - mreg.register(SSL_ENABLED_METRIC_NAME, () -> sslEnabled, "Whether SSL is enabled"); - } + /** + * @return Number of active TCP sessions. + */ + public int activeTcpSessionsCount() { + return sessions.size(); } /** @@ -521,7 +513,7 @@ public void start() { filterChain.start(); if (acceptWorker != null) - U.newThread(acceptWorker).start(); + CommonUtils.newThread(acceptWorker).start(); for (IgniteThread thread : clientThreads) thread.start(); @@ -535,11 +527,11 @@ public void stop() { closed = true; // Make sure to entirely stop acceptor if any. - U.cancel(acceptWorker); - U.join(acceptWorker, log); + CommonUtils.cancel(acceptWorker); + CommonUtils.join(acceptWorker, log); - U.cancel(clientWorkers); - U.join(clientWorkers, log); + CommonUtils.cancel(clientWorkers); + CommonUtils.join(clientWorkers, log); filterChain.stop(); @@ -781,7 +773,8 @@ public void resend(GridNioSession ses) { ses0.offerStateChange((GridNioServer.SessionChangeRequest)fut0); } catch (IgniteCheckedException e) { - U.error(log, "Failed to notify NIO Server while resending messages [rmtNode=" + recoveryDesc.node().id() + ']', e); + CommonUtils.error(log, + "Failed to notify NIO Server while resending messages [rmtNode=" + recoveryDesc.node().id() + ']', e); } } } @@ -868,7 +861,7 @@ public IgniteInternalFuture dumpStats(final String msg, IgnitePredicate< if (!F.isEmpty(msg)) { synchronized (sb) { if (sb.length() > 0) - sb.append(U.nl()); + sb.append(CommonUtils.nl()); sb.append(msg); } @@ -918,7 +911,7 @@ public IgniteInternalFuture dumpNodeStats(final String msg, IgnitePredic if (!F.isEmpty(msg)) { synchronized (sb) { if (sb.length() > 0) - sb.append(U.nl()); + sb.append(CommonUtils.nl()); sb.append(msg); } @@ -1043,7 +1036,7 @@ public void writeTimeout(long writeTimeout) { /** * Gets configurable idle timeout for this session. If not set, default value is - * {@link ConnectorConfiguration#DFLT_IDLE_TIMEOUT}. + * {@link #DFLT_IDLE_TIMEOUT}. * * @return Idle timeout in milliseconds. */ @@ -1097,8 +1090,8 @@ private Selector createSelector(@Nullable SocketAddress addr) throws IgniteCheck return selector; } catch (Throwable e) { - U.close(srvrCh, log); - U.close(selector, log); + CommonUtils.close(srvrCh, log); + CommonUtils.close(selector, log); if (e instanceof Error) throw (Error)e; @@ -1215,10 +1208,10 @@ protected ByteBufferNioClientWorker( @Override protected void processRead(SelectionKey key) throws IOException { if (skipRead) { try { - U.sleep(50); + CommonUtils.sleep(50); } catch (IgniteInterruptedCheckedException ignored) { - U.warn(log, "Sleep has been interrupted."); + CommonUtils.warn(log, "Sleep has been interrupted."); } return; @@ -1249,7 +1242,7 @@ else if (cnt == 0) log.trace("Bytes received [sockCh=" + sockCh + ", cnt=" + cnt + ']'); if (rcvdBytesCntMetric != null) - rcvdBytesCntMetric.add(cnt); + rcvdBytesCntMetric.accept(cnt); ses.bytesReceived(cnt); @@ -1316,7 +1309,7 @@ else if (cnt == 0) span.addTag(SOCKET_WRITE_BYTES, () -> Integer.toString(cnt)); if (sentBytesCntMetric != null) - sentBytesCntMetric.add(cnt); + sentBytesCntMetric.accept(cnt); ses.bytesSent(cnt); } @@ -1324,7 +1317,7 @@ else if (cnt == 0) else { // For test purposes only (skipWrite is set to true in tests only). try { - U.sleep(50); + CommonUtils.sleep(50); } catch (IgniteInterruptedCheckedException e) { throw new IOException("Thread has been interrupted.", e); @@ -1384,10 +1377,10 @@ protected DirectNioClientWorker( @Override protected void processRead(SelectionKey key) throws IOException { if (skipRead) { try { - U.sleep(50); + CommonUtils.sleep(50); } catch (IgniteInterruptedCheckedException ignored) { - U.warn(log, "Sleep has been interrupted."); + CommonUtils.warn(log, "Sleep has been interrupted."); } return; @@ -1418,7 +1411,7 @@ protected DirectNioClientWorker( return; if (rcvdBytesCntMetric != null) - rcvdBytesCntMetric.add(cnt); + rcvdBytesCntMetric.accept(cnt); ses.bytesReceived(cnt); onRead(cnt); @@ -1491,7 +1484,7 @@ private void processWriteSsl(SelectionKey key) throws IOException { int cnt = sockCh.write(sslNetBuf); if (sentBytesCntMetric != null) - sentBytesCntMetric.add(cnt); + sentBytesCntMetric.accept(cnt); ses.bytesSent(cnt); @@ -1578,14 +1571,14 @@ private void processWriteSsl(SelectionKey key) throws IOException { log.trace("Bytes sent [sockCh=" + sockCh + ", cnt=" + cnt + ']'); if (sentBytesCntMetric != null) - sentBytesCntMetric.add(cnt); + sentBytesCntMetric.accept(cnt); ses.bytesSent(cnt); } else { // For test purposes only (skipWrite is set to true in tests only). try { - U.sleep(50); + CommonUtils.sleep(50); } catch (IgniteInterruptedCheckedException e) { throw new IOException("Thread has been interrupted.", e); @@ -1636,7 +1629,7 @@ private boolean writeToBuffer( Span span = tracing.create(SpanType.COMMUNICATION_SOCKET_WRITE, req.span()); try (TraceSurroundings ignore = span.equals(NoopSpan.INSTANCE) ? null : MTC.support(span)) { - span.addTag(SpanTags.MESSAGE, () -> traceName(msg)); + span.addTag(SpanTags.MESSAGE, () -> tracing.traceName(msg)); assert msg != null; @@ -1687,7 +1680,7 @@ private boolean writeSslSystem(GridSelectorNioSessionImpl ses, WritableByteChann int cnt = sockCh.write(buf); if (sentBytesCntMetric != null) - sentBytesCntMetric.add(cnt); + sentBytesCntMetric.accept(cnt); ses.bytesSent(cnt); @@ -1778,7 +1771,7 @@ private void processWrite0(SelectionKey key) throws IOException { log.trace("Bytes sent [sockCh=" + sockCh + ", cnt=" + cnt + ']'); if (sentBytesCntMetric != null) - sentBytesCntMetric.add(cnt); + sentBytesCntMetric.accept(cnt); ses.bytesSent(cnt); onWrite(cnt); @@ -1786,7 +1779,7 @@ private void processWrite0(SelectionKey key) throws IOException { else { // For test purposes only (skipWrite is set to true in tests only). try { - U.sleep(50); + CommonUtils.sleep(50); } catch (IgniteInterruptedCheckedException e) { throw new IOException("Thread has been interrupted.", e); @@ -1839,7 +1832,7 @@ private boolean writeToBuffer(GridSelectorNioSessionImpl ses, ByteBuffer buf, Se Span span = tracing.create(SpanType.COMMUNICATION_SOCKET_WRITE, req.span()); try (TraceSurroundings ignore = span.equals(NoopSpan.INSTANCE) ? null : MTC.support(span)) { - span.addTag(SpanTags.MESSAGE, () -> traceName(msg)); + span.addTag(SpanTags.MESSAGE, () -> tracing.traceName(msg)); int startPos = buf.position(); @@ -1981,10 +1974,10 @@ private abstract class AbstractNioClientWorker extends GridWorker implements Gri } catch (IgniteCheckedException e) { if (!Thread.currentThread().isInterrupted()) { - U.error(log, "Failed to read data from remote connection (will wait for " + + CommonUtils.error(log, "Failed to read data from remote connection (will wait for " + ERR_WAIT_TIME + "ms).", e); - U.sleep(ERR_WAIT_TIME); + CommonUtils.sleep(ERR_WAIT_TIME); reset = true; } @@ -1992,7 +1985,7 @@ private abstract class AbstractNioClientWorker extends GridWorker implements Gri } } catch (Throwable e) { - U.error(log, "Caught unhandled exception in NIO worker thread (restart the node).", e); + CommonUtils.error(log, "Caught unhandled exception in NIO worker thread (restart the node).", e); err = e; @@ -2032,7 +2025,7 @@ private void createSelector() throws IgniteCheckedException { SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet(); Class selectorImplCls = - Class.forName("sun.nio.ch.SelectorImpl", false, U.gridClassLoader()); + Class.forName("sun.nio.ch.SelectorImpl", false, CommonUtils.gridClassLoader()); // Ensure the current selector implementation is what we can instrument. if (!selectorImplCls.isAssignableFrom(selector.getClass())) @@ -2114,7 +2107,7 @@ private void createSelector() throws IgniteCheckedException { */ private void bodyInternal() throws IgniteCheckedException, InterruptedException { try { - long lastIdleCheck = U.currentTimeMillis(); + long lastIdleCheck = CommonUtils.currentTimeMillis(); while (selector.isOpen() && !(isCancelled() && changeReqs.isEmpty())) { SessionChangeRequest req; @@ -2148,7 +2141,7 @@ private void bodyInternal() throws IgniteCheckedException, InterruptedException break; // Just in case we do busy selects. - long now = U.currentTimeMillis(); + long now = CommonUtils.currentTimeMillis(); if (now - lastIdleCheck > 2000) { lastIdleCheck = now; @@ -2197,7 +2190,7 @@ private void bodyInternal() throws IgniteCheckedException, InterruptedException select = false; } - long now = U.currentTimeMillis(); + long now = CommonUtils.currentTimeMillis(); if (now - lastIdleCheck > 2000) { lastIdleCheck = now; @@ -2233,7 +2226,7 @@ private void bodyInternal() throws IgniteCheckedException, InterruptedException if (log.isDebugEnabled()) log.debug("Closing NIO selector."); - U.close(selector, log); + CommonUtils.close(selector, log); } } } @@ -2266,7 +2259,7 @@ private void processSessionChangedRequest(SessionChangeRequest req0) throws Igni if (key != null) key.cancel(); - U.closeQuiet(ch); + CommonUtils.closeQuiet(ch); req.onDone(); @@ -2448,7 +2441,7 @@ private void dumpSelectorInfo(StringBuilder sb, Set keys) { .append(", bytesRcvd0=").append(bytesRcvd0) .append(", bytesSent=").append(bytesSent) .append(", bytesSent0=").append(bytesSent0) - .append("]").append(U.nl()); + .append("]").append(CommonUtils.nl()); } /** @@ -2506,8 +2499,8 @@ private void dumpStats(StringBuilder sb, Object msg = req.message(); - if (shortInfo && msg instanceof GridIoMessage) - msg = ((GridIoMessage)msg).message().getClass().getSimpleName(); + if (shortInfo && msg instanceof MessageWrapper) + msg = ((MessageWrapper)msg).message().getClass().getSimpleName(); sb.append(msg); @@ -2550,8 +2543,8 @@ private void dumpStats(StringBuilder sb, for (SessionWriteRequest req : ses.writeQueue()) { Object msg = req.message(); - if (shortInfo && msg instanceof GridIoMessage) - msg = ((GridIoMessage)msg).message().getClass().getSimpleName(); + if (shortInfo && msg instanceof MessageWrapper) + msg = ((MessageWrapper)msg).message().getClass().getSimpleName(); if (cnt == 0) sb.append(",\n opQueue=[").append(msg); @@ -2614,7 +2607,7 @@ private void processSelectedKeysOptimized(SelectionKey[] keys) throws ClosedByIn } catch (Exception | Error e) { // TODO IGNITE-2659. try { - U.sleep(1000); + CommonUtils.sleep(1000); } catch (IgniteInterruptedCheckedException ignore) { // No-op. @@ -2623,7 +2616,7 @@ private void processSelectedKeysOptimized(SelectionKey[] keys) throws ClosedByIn GridSelectorNioSessionImpl ses = attach.session(); if (!closed) - U.error(log, "Failed to process selector key [ses=" + ses + ']', e); + CommonUtils.error(log, "Failed to process selector key [ses=" + ses + ']', e); else if (log.isDebugEnabled()) log.debug("Failed to process selector key [ses=" + ses + ", err=" + e + ']'); @@ -2681,7 +2674,7 @@ private void processSelectedKeys(Set keys) throws ClosedByInterrup } catch (Exception | Error e) { // TODO IGNITE-2659. try { - U.sleep(1000); + CommonUtils.sleep(1000); } catch (IgniteInterruptedCheckedException ignore) { // No-op. @@ -2690,7 +2683,7 @@ private void processSelectedKeys(Set keys) throws ClosedByInterrup GridSelectorNioSessionImpl ses = attach.session(); if (!closed) - U.error(log, "Failed to process selector key [ses=" + ses + ']', e); + CommonUtils.error(log, "Failed to process selector key [ses=" + ses + ']', e); else if (log.isDebugEnabled()) log.debug("Failed to process selector key [ses=" + ses + ", err=" + e + ']'); } @@ -2703,7 +2696,7 @@ else if (log.isDebugEnabled()) * @param keys Keys registered to selector. */ private void checkIdle(Iterable keys) { - long now = U.currentTimeMillis(); + long now = CommonUtils.currentTimeMillis(); for (SelectionKey key : keys) { GridNioKeyAttachment attach = (GridNioKeyAttachment)key.attachment(); @@ -2782,7 +2775,9 @@ private void register(NioOperationFuture fut) { (InetSocketAddress)sockCh.getRemoteAddress(), fut.accepted(), sndQueueLimit, - mreg, + outboundMessagesQueueSizeMetric, + maxMessagesQueueSizeMetric, + tracing, writeBuf, readBuf); @@ -2847,11 +2842,11 @@ private void register(NioOperationFuture fut) { ses.onServerStopped(); } catch (ClosedChannelException e) { - U.warn(log, "Failed to register accepted socket channel to selector (channel was closed): " + CommonUtils.warn(log, "Failed to register accepted socket channel to selector (channel was closed): " + sock.getRemoteSocketAddress(), e); } catch (IOException e) { - U.error(log, "Failed to get socket addresses.", e); + CommonUtils.error(log, "Failed to get socket addresses.", e); } } @@ -2878,8 +2873,8 @@ private void closeKey(SelectionKey key) { } } finally { - U.close(key, log); - U.close(sock, log); + CommonUtils.close(key, log); + CommonUtils.close(sock, log); } } @@ -2908,11 +2903,11 @@ protected boolean close( if (e != null) { // Print stack trace only if has runtime exception in it's cause. if (e.hasCause(IOException.class)) - U.warn(log, "Client disconnected abruptly due to network connection loss or because " + + CommonUtils.warn(log, "Client disconnected abruptly due to network connection loss or because " + "the connection was left open on application shutdown. [cls=" + e.getClass() + ", msg=" + e.getMessage() + ']'); else - U.error(log, "Closing NIO session because of unhandled exception.", e); + CommonUtils.error(log, "Closing NIO session because of unhandled exception.", e); } sessions.remove(ses); @@ -3000,7 +2995,7 @@ private void processConnect(SelectionKey key) throws IOException { register(sesFut); } catch (IOException e) { - U.closeQuiet(ch); + CommonUtils.closeQuiet(ch); sesFut.onDone(new GridNioException("Failed to connect to node", e)); @@ -3057,18 +3052,6 @@ final void reset0() { } } - /** - * Gets outbound messages queue size. - * - * @return Write queue size. - */ - public int outboundMessagesQueueSize() { - if (outboundMessagesQueueSizeMetric == null) - return -1; - - return (int)outboundMessagesQueueSizeMetric.value(); - } - /** * A separate thread that will accept incoming connections and schedule read to some worker. */ @@ -3121,10 +3104,10 @@ protected GridNioAcceptWorker( } catch (IgniteCheckedException e) { if (!Thread.currentThread().isInterrupted()) { - U.error(log, "Failed to accept remote connection (will wait for " + ERR_WAIT_TIME + "ms).", + CommonUtils.error(log, "Failed to accept remote connection (will wait for " + ERR_WAIT_TIME + "ms).", e); - U.sleep(ERR_WAIT_TIME); + CommonUtils.sleep(ERR_WAIT_TIME); reset = true; } @@ -3213,12 +3196,12 @@ private void closeSelector() { // Close all channels registered with selector. for (SelectionKey key : selector.keys()) - U.close(key.channel(), log); + CommonUtils.close(key.channel(), log); if (log.isDebugEnabled()) log.debug("Closing NIO selector."); - U.close(selector, log); + CommonUtils.close(selector, log); } } @@ -3277,9 +3260,9 @@ private void addRegistrationRequest(SocketChannel sockCh) { offerBalanced(new NioOperationFuture<>(sockCh, true, null), null); } catch (IgniteCheckedException e) { - U.warn(log, "Incoming connection was rejected [addr=" + sockCh.socket().getRemoteSocketAddress() + ']', e); + CommonUtils.warn(log, "Incoming connection was rejected [addr=" + sockCh.socket().getRemoteSocketAddress() + ']', e); - U.close(sockCh, log); + CommonUtils.close(sockCh, log); } } } @@ -3946,11 +3929,20 @@ public static class Builder { /** Worker lifecycle listener to be used by server's worker threads. */ private GridWorkerListener workerLsnr; - /** Metrics registry. */ - private MetricRegistryImpl mreg; + /** Received bytes count metric. */ + private LongConsumer rcvdBytesCntMetric; + + /** Sent bytes count metric. */ + private LongConsumer sentBytesCntMetric; - /** Tracing processor */ - private Tracing tracing; + /** Per-session outbound messages queue size metric. */ + private LongConsumer outboundMessagesQueueSizeMetric; + + /** Per-session maximum outbound messages queue size metric. */ + private LongConsumer maxMessagesQueueSizeMetric; + + /** Span manager */ + private SpanManager tracing; /** Message factory. */ private MessageFactory msgFactory; @@ -3984,7 +3976,10 @@ public GridNioServer build() throws IgniteCheckedException { msgQueueLsnr, readWriteSelectorsAssign, workerLsnr, - mreg, + rcvdBytesCntMetric, + sentBytesCntMetric, + outboundMessagesQueueSizeMetric, + maxMessagesQueueSizeMetric, tracing, msgFactory, filters != null ? Arrays.copyOf(filters, filters.length) : EMPTY_FILTERS @@ -4010,10 +4005,10 @@ public Builder readWriteSelectorsAssign(boolean readWriteSelectorsAssign) { } /** - * @param tracing Tracing processor. + * @param tracing Span manager. * @return This for chaining. */ - public Builder tracing(Tracing tracing) { + public Builder tracing(SpanManager tracing) { this.tracing = tracing; return this; @@ -4253,11 +4248,41 @@ public Builder workerListener(GridWorkerListener workerLsnr) { } /** - * @param mreg Metrics registry. + * @param rcvdBytesCntMetric Received bytes count metric. * @return This for chaining. */ - public Builder metricRegistry(MetricRegistryImpl mreg) { - this.mreg = mreg; + public Builder receivedBytesMetric(LongConsumer rcvdBytesCntMetric) { + this.rcvdBytesCntMetric = rcvdBytesCntMetric; + + return this; + } + + /** + * @param sentBytesCntMetric Sent bytes count metric. + * @return This for chaining. + */ + public Builder sentBytesMetric(LongConsumer sentBytesCntMetric) { + this.sentBytesCntMetric = sentBytesCntMetric; + + return this; + } + + /** + * @param outboundMessagesQueueSizeMetric Per-session outbound messages queue size metric. + * @return This for chaining. + */ + public Builder outboundMessagesQueueSizeMetric(LongConsumer outboundMessagesQueueSizeMetric) { + this.outboundMessagesQueueSizeMetric = outboundMessagesQueueSizeMetric; + + return this; + } + + /** + * @param maxMessagesQueueSizeMetric Per-session maximum outbound messages queue size metric. + * @return This for chaining. + */ + public Builder maxMessagesQueueSizeMetric(LongConsumer maxMessagesQueueSizeMetric) { + this.maxMessagesQueueSizeMetric = maxMessagesQueueSizeMetric; return this; } @@ -4295,7 +4320,7 @@ private class ReadWriteSizeBasedBalancer implements IgniteRunnable { /** {@inheritDoc} */ @Override public void run() { - long now = U.currentTimeMillis(); + long now = CommonUtils.currentTimeMillis(); if (lastBalance + balancePeriod < now) { lastBalance = now; @@ -4358,9 +4383,9 @@ private class ReadWriteSizeBasedBalancer implements IgniteRunnable { long bytesSent0 = ses0.bytesSent0(); if (bytesSent0 < threshold && - (ses == null || delta > U.safeAbs(bytesSent0 - sentDiff / 2))) { + (ses == null || delta > CommonUtils.safeAbs(bytesSent0 - sentDiff / 2))) { ses = ses0; - delta = U.safeAbs(bytesSent0 - sentDiff / 2); + delta = CommonUtils.safeAbs(bytesSent0 - sentDiff / 2); } } @@ -4391,9 +4416,9 @@ private class ReadWriteSizeBasedBalancer implements IgniteRunnable { long bytesRcvd0 = ses0.bytesReceived0(); if (bytesRcvd0 < threshold && - (ses == null || delta > U.safeAbs(bytesRcvd0 - rcvdDiff / 2))) { + (ses == null || delta > CommonUtils.safeAbs(bytesRcvd0 - rcvdDiff / 2))) { ses = ses0; - delta = U.safeAbs(bytesRcvd0 - rcvdDiff / 2); + delta = CommonUtils.safeAbs(bytesRcvd0 - rcvdDiff / 2); } } @@ -4441,7 +4466,7 @@ private class SizeBasedBalancer implements IgniteRunnable { /** {@inheritDoc} */ @Override public void run() { - long now = U.currentTimeMillis(); + long now = CommonUtils.currentTimeMillis(); if (lastBalance + balancePeriod < now) { lastBalance = now; @@ -4485,9 +4510,9 @@ private class SizeBasedBalancer implements IgniteRunnable { long bytesSent0 = ses0.bytesSent0(); if (bytesSent0 < threshold && - (ses == null || delta > U.safeAbs(bytesSent0 - bytesDiff / 2))) { + (ses == null || delta > CommonUtils.safeAbs(bytesSent0 - bytesDiff / 2))) { ses = ses0; - delta = U.safeAbs(bytesSent0 - bytesDiff / 2); + delta = CommonUtils.safeAbs(bytesSent0 - bytesDiff / 2); } } @@ -4594,4 +4619,10 @@ interface SessionChangeRequest { */ NioOperation operation(); } + + /** */ + public interface MessageWrapper { + /** */ + public Message message(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerBuffer.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerBuffer.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerBuffer.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerBuffer.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListener.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListener.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListener.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListener.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListenerAdapter.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListenerAdapter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListenerAdapter.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioServerListenerAdapter.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioSession.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioSession.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioSession.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioSession.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionImpl.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionImpl.java similarity index 96% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionImpl.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionImpl.java index 0211eb85dcae1..56638bcefe97a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionImpl.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionImpl.java @@ -24,10 +24,10 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.nio.ssl.GridSslMeta; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteInClosure; import org.jetbrains.annotations.Nullable; @@ -103,7 +103,7 @@ public GridNioSessionImpl( this.rmtAddr = rmtAddr; this.accepted = accepted; - long now = U.currentTimeMillis(); + long now = CommonUtils.currentTimeMillis(); sndSchedTime = now; createTime = now; @@ -317,7 +317,7 @@ public void bytesSent(int cnt) { bytesSent += cnt; bytesSent0 += cnt; - lastSndTime = U.currentTimeMillis(); + lastSndTime = CommonUtils.currentTimeMillis(); } /** @@ -331,14 +331,14 @@ public void bytesReceived(int cnt) { bytesRcvd += cnt; bytesRcvd0 += cnt; - lastRcvTime = U.currentTimeMillis(); + lastRcvTime = CommonUtils.currentTimeMillis(); } /** * Resets send schedule time to avoid multiple idle notifications. */ public void resetSendScheduleTime() { - sndSchedTime = U.currentTimeMillis(); + sndSchedTime = CommonUtils.currentTimeMillis(); } /** @@ -348,7 +348,7 @@ public void resetSendScheduleTime() { * {@code false} if session was already closed. */ public boolean setClosed() { - return closeTime.compareAndSet(0, U.currentTimeMillis()); + return closeTime.compareAndSet(0, CommonUtils.currentTimeMillis()); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionMetaKey.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionMetaKey.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionMetaKey.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioSessionMetaKey.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java similarity index 93% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java index 650aeb2cc7ce3..47644636def68 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java @@ -23,9 +23,9 @@ import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.tracing.MTC; import org.apache.ignite.internal.processors.tracing.NoopSpan; -import org.apache.ignite.internal.processors.tracing.NoopTracing; +import org.apache.ignite.internal.processors.tracing.NoopSpanManager; import org.apache.ignite.internal.processors.tracing.Span; -import org.apache.ignite.internal.processors.tracing.Tracing; +import org.apache.ignite.internal.processors.tracing.SpanManager; import org.apache.ignite.internal.processors.tracing.messages.SpanTransport; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; @@ -42,7 +42,7 @@ public class GridNioTracerFilter extends GridNioFilterAdapter { private IgniteLogger log; /** Tracing processor. */ - private final Tracing tracer; + private final SpanManager tracer; /** * Creates a tracer filter. @@ -50,11 +50,11 @@ public class GridNioTracerFilter extends GridNioFilterAdapter { * @param log Log instance to use. * @param tracer Tracing processor. */ - public GridNioTracerFilter(IgniteLogger log, Tracing tracer) { + public GridNioTracerFilter(IgniteLogger log, SpanManager tracer) { super("GridNioTracerFilter"); this.log = log; - this.tracer = tracer == null ? new NoopTracing() : tracer; + this.tracer = tracer == null ? new NoopSpanManager() : tracer; } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioWorker.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioWorker.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioWorker.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridNioWorker.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java similarity index 88% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java index 561941903b6b7..267851bac0f57 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java @@ -26,25 +26,19 @@ import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.LongConsumer; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.processors.metric.MetricRegistryImpl; -import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric; -import org.apache.ignite.internal.processors.metric.impl.MaxValueMetric; import org.apache.ignite.internal.processors.tracing.MTC; +import org.apache.ignite.internal.processors.tracing.SpanManager; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.LT; import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.util.deque.FastSizeDeque; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable.traceName; -import static org.apache.ignite.internal.util.nio.GridNioServer.MAX_MESSAGES_QUEUE_SIZE_METRIC_DESC; -import static org.apache.ignite.internal.util.nio.GridNioServer.MAX_MESSAGES_QUEUE_SIZE_METRIC_NAME; -import static org.apache.ignite.internal.util.nio.GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC; -import static org.apache.ignite.internal.util.nio.GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME; - /** * Session implementation bound to selector API and socket API. * Note that this implementation requires non-null values for local and remote @@ -93,10 +87,13 @@ public class GridSelectorNioSessionImpl extends GridNioSessionImpl implements Gr private volatile boolean closeSocket = true; /** Outbound messages queue size metric. */ - @Nullable private final LongAdderMetric outboundMessagesQueueSizeMetric; + @Nullable private final LongConsumer outboundMessagesQueueSizeMetric; /** Maximum outbound messages queue size metric. */ - @Nullable private final MaxValueMetric maxMessagesQueueSizeMetric; + @Nullable private final LongConsumer maxMessagesQueueSizeMetric; + + /** Span manager used to resolve trace names for logging. */ + private final SpanManager tracing; /** * Creates session instance. @@ -108,6 +105,9 @@ public class GridSelectorNioSessionImpl extends GridNioSessionImpl implements Gr * @param rmtAddr Remote address. * @param accepted Accepted flag. * @param sndQueueLimit Send queue limit. + * @param outboundMessagesQueueSizeMetric Outbound messages queue size metric, or {@code null} if metrics disabled. + * @param maxMessagesQueueSizeMetric Maximum outbound messages queue size metric, or {@code null} if metrics disabled. + * @param tracing Span manager used to resolve trace names for logging. * @param writeBuf Write buffer. * @param readBuf Read buffer. */ @@ -119,7 +119,9 @@ public class GridSelectorNioSessionImpl extends GridNioSessionImpl implements Gr InetSocketAddress rmtAddr, boolean accepted, int sndQueueLimit, - @Nullable MetricRegistryImpl mreg, + @Nullable LongConsumer outboundMessagesQueueSizeMetric, + @Nullable LongConsumer maxMessagesQueueSizeMetric, + SpanManager tracing, @Nullable ByteBuffer writeBuf, @Nullable ByteBuffer readBuf ) { @@ -151,17 +153,11 @@ public class GridSelectorNioSessionImpl extends GridNioSessionImpl implements Gr this.readBuf = readBuf; } - outboundMessagesQueueSizeMetric = mreg == null ? null : mreg.longAdderMetric( - OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME, - OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC - ); + this.outboundMessagesQueueSizeMetric = outboundMessagesQueueSizeMetric; + + this.maxMessagesQueueSizeMetric = maxMessagesQueueSizeMetric; - maxMessagesQueueSizeMetric = mreg == null ? null : mreg.maxValueMetric( - MAX_MESSAGES_QUEUE_SIZE_METRIC_NAME, - MAX_MESSAGES_QUEUE_SIZE_METRIC_DESC, - 60_000, - 5 - ); + this.tracing = tracing; } /** {@inheritDoc} */ @@ -323,17 +319,17 @@ int offerSystemFuture(SessionWriteRequest writeFut) { boolean res = queue.offerFirst(writeFut); - MTC.span().addLog(() -> "Added to system queue - " + traceName(writeFut.message())); + MTC.span().addLog(() -> "Added to system queue - " + tracing.traceName((Message)writeFut.message())); assert res : "Future was not added to queue"; if (outboundMessagesQueueSizeMetric != null) - outboundMessagesQueueSizeMetric.increment(); + outboundMessagesQueueSizeMetric.accept(1); if (maxMessagesQueueSizeMetric != null) { int queueSize = queue.sizex(); - maxMessagesQueueSizeMetric.update(queueSize); + maxMessagesQueueSizeMetric.accept(queueSize); return queueSize; } @@ -361,17 +357,17 @@ int offerFuture(SessionWriteRequest writeFut) { boolean res = queue.offer(writeFut); - MTC.span().addLog(() -> "Added to queue - " + traceName(writeFut.message())); + MTC.span().addLog(() -> "Added to queue - " + tracing.traceName((Message)writeFut.message())); assert res : "Future was not added to queue"; if (outboundMessagesQueueSizeMetric != null) - outboundMessagesQueueSizeMetric.increment(); + outboundMessagesQueueSizeMetric.accept(1); if (maxMessagesQueueSizeMetric != null) { int queueSize = queue.sizex(); - maxMessagesQueueSizeMetric.update(queueSize); + maxMessagesQueueSizeMetric.accept(queueSize); return queueSize; } @@ -390,10 +386,10 @@ void resend(Collection futs) { assert add; if (outboundMessagesQueueSizeMetric != null) - outboundMessagesQueueSizeMetric.add(futs.size()); + outboundMessagesQueueSizeMetric.accept(futs.size()); if (maxMessagesQueueSizeMetric != null) - maxMessagesQueueSizeMetric.update(futs.size()); + maxMessagesQueueSizeMetric.accept(futs.size()); } /** @@ -404,7 +400,7 @@ void resend(Collection futs) { if (last != null) { if (outboundMessagesQueueSizeMetric != null) - outboundMessagesQueueSizeMetric.decrement(); + outboundMessagesQueueSizeMetric.accept(-1); if (sem != null && !last.messageThread()) sem.release(); @@ -439,7 +435,7 @@ boolean removeFuture(SessionWriteRequest fut) { boolean rmv = queue.removeLastOccurrence(fut); if (rmv && outboundMessagesQueueSizeMetric != null) - outboundMessagesQueueSizeMetric.decrement(); + outboundMessagesQueueSizeMetric.accept(-1); return rmv; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridTcpNioCommunicationClient.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridTcpNioCommunicationClient.java similarity index 97% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridTcpNioCommunicationClient.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridTcpNioCommunicationClient.java index 4ff126fa4cf91..f553f8d97e583 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridTcpNioCommunicationClient.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/GridTcpNioCommunicationClient.java @@ -25,9 +25,9 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.lang.IgniteInClosure2X; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.plugin.extensions.communication.Message; import org.jetbrains.annotations.Nullable; @@ -135,7 +135,7 @@ public GridNioSession session() { /** {@inheritDoc} */ @Override public long getIdleTime() { - long now = U.currentTimeMillis(); + long now = CommonUtils.currentTimeMillis(); // Session can be used for receiving and sending. return Math.min(Math.min(now - ses.lastReceiveTime(), now - ses.lastSendScheduleTime()), diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/SelectedSelectionKeySet.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/SelectedSelectionKeySet.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/SelectedSelectionKeySet.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/SelectedSelectionKeySet.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/SessionWriteRequest.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/SessionWriteRequest.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/SessionWriteRequest.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/SessionWriteRequest.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/package-info.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/package-info.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/package-info.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/package-info.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/BlockingSslHandler.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/BlockingSslHandler.java similarity index 98% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/BlockingSslHandler.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/BlockingSslHandler.java index 1da7c8ab62ae3..bcf85808db758 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/BlockingSslHandler.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/BlockingSslHandler.java @@ -28,8 +28,8 @@ import javax.net.ssl.SSLException; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.nio.GridNioException; -import org.apache.ignite.internal.util.typedef.internal.U; import static javax.net.ssl.SSLEngineResult.HandshakeStatus.FINISHED; import static javax.net.ssl.SSLEngineResult.HandshakeStatus.NEED_TASK; @@ -171,7 +171,7 @@ public boolean handshake() throws IgniteCheckedException, SSLException { case NEED_WRAP: { // If the output buffer has remaining data, clear it. if (outNetBuf.hasRemaining()) - U.warn(log, "Output net buffer has unsent bytes during handshake (will clear). "); + CommonUtils.warn(log, "Output net buffer has unsent bytes during handshake (will clear). "); outNetBuf.clear(); @@ -301,7 +301,7 @@ public ByteBuffer decode(ByteBuffer buf) throws IgniteCheckedException, SSLExcep // If we received close_notify but not all bytes has been read by SSL engine, print a warning. if (buf.hasRemaining()) - U.warn(log, "Got unread bytes after receiving close_notify message (will ignore)."); + CommonUtils.warn(log, "Got unread bytes after receiving close_notify message (will ignore)."); } inNetBuf.clear(); @@ -539,7 +539,7 @@ private void readFromNet() throws IgniteCheckedException { */ private void writeNetBuffer() throws IgniteCheckedException { try { - U.writeFully(ch, outNetBuf); + CommonUtils.writeFully(ch, outNetBuf); } catch (IOException e) { throw new IgniteCheckedException("Failed to write byte to socket.", e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java similarity index 91% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java index ab9f29946999b..9abcae2ad56a4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.function.LongConsumer; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLException; @@ -27,16 +28,13 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.processors.metric.MetricRegistryImpl; -import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl; -import org.apache.ignite.internal.processors.metric.impl.IntMetricImpl; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.nio.GridNioException; import org.apache.ignite.internal.util.nio.GridNioFilterAdapter; import org.apache.ignite.internal.util.nio.GridNioSession; import org.apache.ignite.internal.util.nio.GridNioSessionMetaKey; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteInClosure; import org.jetbrains.annotations.Nullable; @@ -86,10 +84,10 @@ public class GridNioSslFilter extends GridNioFilterAdapter { @Nullable private Exception onSessionOpenedException; /** Metric that indicates sessions count that were rejected due to SSL errors. */ - @Nullable private final IntMetricImpl rejectedSesCnt; + @Nullable private final Runnable rejectedSesCnt; /** Histogram that provides distribution of SSL handshake duration. */ - @Nullable private final HistogramMetricImpl handshakeDuration; + @Nullable private final LongConsumer handshakeDuration; /** * Creates SSL filter. @@ -98,14 +96,16 @@ public class GridNioSslFilter extends GridNioFilterAdapter { * @param directBuf Direct buffer flag. * @param order Byte order. * @param log Logger to use. - * @param mreg Optional metric registry. + * @param handshakeDuration Records SSL handshake duration (ms), or {@code null} if metrics disabled. + * @param rejectedSesCnt Increments the rejected-sessions counter, or {@code null} if metrics disabled. */ public GridNioSslFilter( SSLContext sslCtx, boolean directBuf, ByteOrder order, IgniteLogger log, - @Nullable MetricRegistryImpl mreg + @Nullable LongConsumer handshakeDuration, + @Nullable Runnable rejectedSesCnt ) { super("SSL filter"); @@ -113,17 +113,8 @@ public GridNioSslFilter( this.sslCtx = sslCtx; this.directBuf = directBuf; this.order = order; - - handshakeDuration = mreg == null ? null : mreg.histogram( - SSL_HANDSHAKE_DURATION_HISTOGRAM_METRIC_NAME, - new long[] {250, 500, 1000}, - "SSL handshake duration in milliseconds." - ); - - rejectedSesCnt = mreg == null ? null : mreg.intMetric( - SSL_REJECTED_SESSIONS_CNT_METRIC_NAME, - "TCP sessions count that were rejected due to SSL errors." - ); + this.handshakeDuration = handshakeDuration; + this.rejectedSesCnt = rejectedSesCnt; } /** @@ -253,7 +244,7 @@ public void enabledProtocols(String... enabledProtos) { long startTime = System.nanoTime(); - fut.listen(() -> handshakeDuration.value(U.nanosToMillis(System.nanoTime() - startTime))); + fut.listen(() -> handshakeDuration.accept(CommonUtils.nanosToMillis(System.nanoTime() - startTime))); } hnd.handshake(); @@ -262,7 +253,7 @@ public void enabledProtocols(String... enabledProtos) { } catch (SSLException e) { onSessionOpenedException = e; - U.error(log, "Failed to start SSL handshake (will close inbound connection): " + ses, e); + CommonUtils.error(log, "Failed to start SSL handshake (will close inbound connection): " + ses, e); ses.close(); } @@ -275,7 +266,7 @@ public void enabledProtocols(String... enabledProtos) { if (fut != null) { if (rejectedSesCnt != null) - rejectedSesCnt.increment(); + rejectedSesCnt.run(); fut.onDone(new IgniteCheckedException("SSL handshake failed (connection closed).", onSessionOpenedException)); } @@ -455,7 +446,7 @@ private IgniteInternalFuture shutdownSession(GridNioSession ses, GridNi hnd.writeNetBuffer(null); } catch (SSLException e) { - U.warn(log, "Failed to shutdown SSL session gracefully (will force close) [ex=" + e + ", ses=" + ses + ']'); + CommonUtils.warn(log, "Failed to shutdown SSL session gracefully (will force close) [ex=" + e + ", ses=" + ses + ']'); } return proceedSessionClose(ses); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslHandler.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslHandler.java similarity index 98% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslHandler.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslHandler.java index 13cf4ab96bed6..0b225256c29fe 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslHandler.java +++ b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslHandler.java @@ -30,10 +30,10 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.nio.GridNioException; import org.apache.ignite.internal.util.nio.GridNioSession; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteInClosure; import org.jetbrains.annotations.Nullable; @@ -197,7 +197,7 @@ void handshake() throws IgniteCheckedException, SSLException { if (log.isDebugEnabled()) log.debug("Entered handshake(): [handshakeStatus=" + handshakeStatus + ", ses=" + ses + ']'); - long startTs = U.currentTimeMillis(); + long startTs = CommonUtils.currentTimeMillis(); lock(); @@ -258,7 +258,7 @@ void handshake() throws IgniteCheckedException, SSLException { case NEED_WRAP: { // If the output buffer has remaining data, clear it. if (outNetBuf.hasRemaining()) - U.warn(log, "Output net buffer has unsent bytes during handshake (will clear): " + ses); + CommonUtils.warn(log, "Output net buffer has unsent bytes during handshake (will clear): " + ses); outNetBuf.clear(); @@ -287,7 +287,7 @@ void handshake() throws IgniteCheckedException, SSLException { finally { unlock(); - long elapsed = U.currentTimeMillis() - startTs; + long elapsed = CommonUtils.currentTimeMillis() - startTs; if (elapsed > LONG_HANDSHAKE_THRESHOLD_MS && log.isInfoEnabled()) { log.info("Handshake took too long: [millis=" + elapsed + ", handshakeStatus=" + handshakeStatus + @@ -334,7 +334,7 @@ void messageReceived(ByteBuffer buf) throws IgniteCheckedException, SSLException // If we received close_notify but not all bytes has been read by SSL engine, print a warning. if (buf.hasRemaining()) - U.warn(log, "Got unread bytes after receiving close_notify message (will ignore): " + ses); + CommonUtils.warn(log, "Got unread bytes after receiving close_notify message (will ignore): " + ses); } inNetBuf.clear(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridSslMeta.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridSslMeta.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridSslMeta.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridSslMeta.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/package-info.java b/modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/package-info.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/package-info.java rename to modules/nio/src/main/java/org/apache/ignite/internal/util/nio/ssl/package-info.java diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/Message.java diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageArrayType.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageArrayType.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageArrayType.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageArrayType.java diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionItemType.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionItemType.java similarity index 97% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionItemType.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionItemType.java index b28e67297ce16..b98e79a46af43 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionItemType.java +++ b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionItemType.java @@ -83,6 +83,9 @@ public enum MessageCollectionItemType { /** Ignite UUID. */ IGNITE_UUID, + /** GridCacheVersion */ + GRID_CACHE_VERSION, + /** Message. */ MSG, diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionType.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionType.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionType.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageCollectionType.java diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageMapType.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageMapType.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageMapType.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageMapType.java diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java similarity index 97% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java index 05390bc5fb751..796acc40a191d 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java +++ b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.KeyCacheObject; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.lang.IgniteUuid; @@ -274,6 +275,9 @@ public default T readMessage() { /** @return Ignite product version. */ IgniteProductVersion readIgniteProductVersion(); + /** @return Grid cache version. */ + GridCacheVersion readGridCacheVersion(); + /** * Tells whether last invocation of any of {@code readXXX(...)} * methods has fully written the value. {@code False} is returned diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageType.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageType.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageType.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageType.java diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java similarity index 97% rename from modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java rename to modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java index 4386c8f8dcf00..019bab8fa9db9 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java +++ b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.KeyCacheObject; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.lang.IgniteUuid; @@ -337,6 +338,14 @@ public default boolean writeMap(Map map, MessageMapType type) { */ public boolean writeIgniteProductVersion(IgniteProductVersion ver); + /** + * Writes ignite cache version. + * + * @param ver Version. + * @return Whether value was fully written. + */ + public boolean writeGridCacheVersion(GridCacheVersion ver); + /** * @return Whether header of current message is already written. */ diff --git a/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/App.config b/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/App.config index 016078e069ac5..9dad03a80002b 100644 --- a/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/App.config +++ b/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/App.config @@ -29,8 +29,8 @@ - - + + 127.0.0.1:47500 @@ -44,7 +44,7 @@ - + 127.0.0.1:47500 @@ -58,7 +58,7 @@ - + 127.0.0.1:47500 diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs index cd25ad6e87f49..58035508f3c08 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs @@ -57,6 +57,7 @@ public class BinarySelfTest { "的的abcdкириллица", new string(new[] {(char) 0xD801, (char) 0xDC37}), "Ḽơᶉëᶆ ȋṕšᶙṁ", + "kjkl\r\nklk;", "A_\ud83e\udd26\ud83c\udffc\u200d\u2642\ufe0f_B" // A_🤦🏼‍♂️_B }; diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeTaskSessionTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeTaskSessionTest.cs index e336b52a6f1d8..6c4639dfa5d90 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeTaskSessionTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeTaskSessionTest.cs @@ -75,7 +75,8 @@ private static IgniteConfiguration GetIgniteConfiguration(string igniteName, boo ConsistentId = igniteName, IgniteInstanceName = igniteName, DiscoverySpi = GetStaticDiscovery(), - JvmOptions = TestJavaOptions() + JvmOptions = TestJavaOptions(), + Localhost = "127.0.0.1" }; ///

      diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ConsoleRedirectTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ConsoleRedirectTest.cs index c882e1dd18ffc..457d92becadb9 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ConsoleRedirectTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ConsoleRedirectTest.cs @@ -115,7 +115,7 @@ public void TestConsoleWriteSpecialStrings() MyStringWriter.LastValue = null; // Send to Java as UTF-16 to avoid dealing with IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2 - var bytes = Encoding.Unicode.GetBytes(MyStringWriter.Prefix + val); + var bytes = Encoding.Unicode.GetBytes(MyStringWriter.Prefix + val + MyStringWriter.Suffix); ignite.GetCompute().ExecuteJavaTask(ConsoleWriteTask, bytes); var expectedStr = GetExpectedStr(val); @@ -124,7 +124,7 @@ public void TestConsoleWriteSpecialStrings() // Test Env.NewString MyStringWriter.LastValue = null; - TestUtilsJni.Println(MyStringWriter.Prefix + val); + TestUtilsJni.Println(MyStringWriter.Prefix + val + MyStringWriter.Suffix); Assert.AreEqual(expectedStr.Length, MyStringWriter.LastValue?.Length, message: val); if (val != BinarySelfTest.SpecialStrings[0]) @@ -288,6 +288,9 @@ private class MyStringWriter : StringWriter { public const string Prefix = "[MyStringWriter]"; + /** */ + public const string Suffix = "[/MyStringWriter]"; + public static bool Throw { get; set; } public static string LastValue { get; set; } @@ -306,9 +309,13 @@ public override void Write(string value) base.Write(value); - if (!string.IsNullOrWhiteSpace(value) && value.StartsWith(Prefix)) + if (!string.IsNullOrWhiteSpace(value) && value.StartsWith(Prefix, StringComparison.Ordinal)) { - LastValue = value.Substring(Prefix.Length); + var suffixIndex = value.LastIndexOf(Suffix, StringComparison.Ordinal); + + Assert.GreaterOrEqual(suffixIndex, Prefix.Length, "Suffix is missing: " + value); + + LastValue = value.Substring(Prefix.Length, suffixIndex - Prefix.Length); } } } diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs index 70174060fb92d..16100321055f9 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs @@ -105,7 +105,7 @@ public void TestMissingJarsCauseProperException() Assert.AreEqual("ERROR: Apache.Ignite.Core.Common.IgniteException: Java class is not found " + "(did you set IGNITE_HOME environment variable?): " + "org/apache/ignite/internal/processors/platform/utils/PlatformUtils", - reader.GetOutput().First()); + reader.GetOutputWithoutJavaWarnings().First()); } /// @@ -170,6 +170,8 @@ private void TestDeployment(string dllFolder, string jarFolder, bool buildClassp Assert.Fail("Node failed to start: " + string.Join("\n", reader.GetOutput())); } + Assert.IsFalse(proc.HasExited, "Node process died: " + string.Join("\n", reader.GetOutput())); + VerifyNodeStarted(exePath); } @@ -191,7 +193,7 @@ private void DeployTo(string folder, string jarFolder = null) // Copy jars. var home = IgniteHome.Resolve(); - var jarNames = new[] {@"\ignite-core-", @"\cache-api-1.0.0.jar", @"\modules\spring\"}; + var jarNames = new[] {@"\ignite-core-", @"\cache-api-1.0.0.jar", @"\modules\spring\", @"\ignite-spring-"}; var jars = Directory.GetFiles(home, "*.jar", SearchOption.AllDirectories) .Where(jarPath => jarNames.Any(jarPath.Contains)).ToArray(); diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs index e96fcaa8be034..e30a16bf14b54 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs @@ -327,17 +327,6 @@ public void TestXmlConfigurationCmd() [Test] public void TestInvalidCmdArgs() { - var ignoredWarns = new[] - { - "WARNING: An illegal reflective access operation has occurred", - "WARNING: Illegal reflective access by org.apache.ignite.internal.util.GridUnsafe$2 " + - "(file:/C:/w/incubator-ignite/modules/core/target/classes/) to field java.nio.Buffer.address", - "WARNING: Please consider reporting this to the maintainers of org.apache.ignite.internal.util." + - "GridUnsafe$2", - "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations", - "WARNING: All illegal access operations will be denied in a future release" - }; - Action checkError = (args, err) => { var reader = new ListDataReader(); @@ -347,8 +336,7 @@ public void TestInvalidCmdArgs() Assert.IsTrue(proc.Join(30000, out exitCode)); Assert.AreEqual(-1, exitCode); - Assert.AreEqual(err, reader.GetOutput() - .Except(ignoredWarns) + Assert.AreEqual(err, reader.GetOutputWithoutJavaWarnings() .FirstOrDefault(x => !string.IsNullOrWhiteSpace(x))); }; diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/JavaServer/pom.xml b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/JavaServer/pom.xml index 79734f0930445..f27377312f5be 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/JavaServer/pom.xml +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/JavaServer/pom.xml @@ -35,7 +35,7 @@ org.apache.ignite ignite-core - 2.4.0 + 2.18.0 diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Process/ListDataReader.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Process/ListDataReader.cs index 5660cf962dbb9..4e2ac05fe4bdb 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Process/ListDataReader.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Process/ListDataReader.cs @@ -17,6 +17,7 @@ namespace Apache.Ignite.Core.Tests.Process { + using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -26,6 +27,17 @@ namespace Apache.Ignite.Core.Tests.Process /// public class ListDataReader : IIgniteProcessOutputReader { + /** JVM warnings that can appear before the actual Apache.Ignite.exe output. */ + private static readonly string[] IgnoredJavaWarnings = + { + "OpenJDK 64-Bit Server VM warning: Ignoring option --illegal-access=permit; support was removed in 17.0", + "WARNING: An illegal reflective access operation has occurred", + "WARNING: Illegal reflective access by org.apache.ignite.internal.util.GridUnsafe$2", + "WARNING: Please consider reporting this to the maintainers of org.apache.ignite.internal.util.GridUnsafe$2", + "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations", + "WARNING: All illegal access operations will be denied in a future release" + }; + /** Target list. */ private readonly List _list = new List(); @@ -53,5 +65,21 @@ public IList GetOutput() return _list.ToList(); } } + + /// + /// Gets the output without known JVM warnings. + /// + public IList GetOutputWithoutJavaWarnings() + { + return GetOutput().Where(x => !IsIgnoredJavaWarning(x)).ToList(); + } + + /// + /// Returns a value indicating whether provided message is a known JVM warning. + /// + private static bool IsIgnoredJavaWarning(string message) + { + return IgnoredJavaWarnings.Any(warning => message.StartsWith(warning, StringComparison.Ordinal)); + } } } diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs index c9ef65f4ab4b9..6652a87440b5a 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs @@ -371,7 +371,14 @@ public static TcpDiscoverySpi GetStaticDiscovery(int? maxPort = null) { Endpoints = new[] { "127.0.0.1:47500" + (maxPort == null ? null : (".." + maxPort)) } }, - SocketTimeout = TimeSpan.FromSeconds(0.3) + SocketTimeout = TimeSpan.FromSeconds(0.3), + // If the finder port is squatted at bind time (e.g. lingering teardown of the previous + // fixture), the node binds the next port and the default infinite join retries the finder + // address forever, eating the whole suite execution timeout: fail the test fast instead. + // MaxAckTimeout caps the exponential handshake backoff, otherwise a single retry sweep + // takes up to 20 minutes and JoinTimeout, checked between sweeps, never gets a chance. + JoinTimeout = TimeSpan.FromMinutes(2), + MaxAckTimeout = TimeSpan.FromSeconds(10) }; } diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/app.config b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/app.config index 845680633c3bd..b2bc4c8437858 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/app.config +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/app.config @@ -32,8 +32,8 @@ - - + + 127.0.0.1:47500 @@ -47,7 +47,7 @@ - + 127.0.0.1:47500 diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/custom_app.config b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/custom_app.config index 9fa96f5a4985a..68d31ef7273c7 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/custom_app.config +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/custom_app.config @@ -27,7 +27,7 @@ - + 127.0.0.1:47500 diff --git a/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/App.config b/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/App.config index 0e0da8d457653..7c1ce90ee4c4f 100644 --- a/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/App.config +++ b/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/App.config @@ -25,8 +25,8 @@ - - + + 127.0.0.1:47500 @@ -39,7 +39,7 @@ - + 127.0.0.1:47500 diff --git a/modules/rest-http/pom.xml b/modules/rest-http/pom.xml index 24610347ac09d..0125e003c89af 100644 --- a/modules/rest-http/pom.xml +++ b/modules/rest-http/pom.xml @@ -82,9 +82,15 @@ ${jetty.version} + + org.eclipse.jetty.ee11 + jetty-ee11-servlet + ${jetty.version} + + org.eclipse.jetty - jetty-servlet + jetty-session ${jetty.version} @@ -95,8 +101,8 @@ - org.eclipse.jetty.toolchain - jetty-jakarta-servlet-api + jakarta.servlet + jakarta.servlet-api ${jetty-jakarta-servlet-api.version} diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java index dcb5d1d6e4bf5..c91ed3ec58762 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java @@ -31,13 +31,14 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.InjectableValues; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.InjectableValues; +import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.IgniteSystemProperties; @@ -72,8 +73,6 @@ import org.apache.ignite.lang.IgniteClosure; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.plugin.security.SecurityCredentials; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; import org.jetbrains.annotations.Nullable; import static java.lang.String.format; @@ -93,7 +92,7 @@ /** * Jetty REST handler. The following URL format is supported: {@code /ignite?cmd=cmdName¶m1=abc¶m2=123} */ -public class GridJettyRestHandler extends AbstractHandler { +public class GridJettyRestHandler extends HttpServlet { /** */ public static final String IGNITE_CMD_PATH = "/ignite"; @@ -270,16 +269,13 @@ private static int intValue(String key, Map params, int dfltVal) } /** {@inheritDoc} */ - @Override public void handle(String target, Request req, HttpServletRequest srvReq, HttpServletResponse res) { - if (log.isDebugEnabled()) - log.debug("Handling request [target=" + target + ", req=" + req + ", srvReq=" + srvReq + ']'); + @Override protected void service(HttpServletRequest srvReq, HttpServletResponse res) { + String target = srvReq.getRequestURI(); - if (!target.startsWith(IGNITE_CMD_PATH)) - return; + if (log.isDebugEnabled()) + log.debug("Handling request [target=" + target + ", srvReq=" + srvReq + ']'); processRequest(target, srvReq, res); - - req.setHandled(true); } /** diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestProtocol.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestProtocol.java index 2631840cc0b22..5bdad0701d9f7 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestProtocol.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestProtocol.java @@ -44,20 +44,20 @@ import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.spi.IgniteSpiException; +import org.eclipse.jetty.ee11.servlet.FilterHolder; +import org.eclipse.jetty.ee11.servlet.ServletContextHandler; +import org.eclipse.jetty.ee11.servlet.ServletHolder; import org.eclipse.jetty.server.AbstractNetworkConnector; import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.NetworkConnector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.util.MultiException; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceFactory; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.xml.XmlConfiguration; import org.jetbrains.annotations.Nullable; @@ -238,17 +238,6 @@ private boolean startJetty() throws IgniteCheckedException { catch (Exception e) { boolean failedToBind = e instanceof SocketException; - if (e instanceof MultiException) { - if (log.isDebugEnabled()) - log.debug("Caught multi exception: " + e); - - failedToBind = true; - - for (Object obj : ((MultiException)e).getThrowables()) - if (!(obj instanceof SocketException)) - failedToBind = false; - } - if (e instanceof IOException && X.hasCause(e, SocketException.class)) failedToBind = true; @@ -309,7 +298,7 @@ private void loadJettyConfiguration(@Nullable URL cfgUrl) throws IgniteCheckedEx XmlConfiguration cfg; try { - Resource rsrc = Resource.newResource(cfgUrl); + Resource rsrc = ResourceFactory.root().newResource(cfgUrl.toURI()); cfg = new XmlConfiguration(rsrc); } @@ -336,18 +325,27 @@ private void loadJettyConfiguration(@Nullable URL cfgUrl) throws IgniteCheckedEx assert httpSrv != null; - Handler extsHnd = loadExtensions(); - WelcomeHandler welcomeHnd = new WelcomeHandler(log); + ContextHandlerCollection hnds = new ContextHandlerCollection(); - httpSrv.setHandler(new HandlerList(jettyHnd, extsHnd, welcomeHnd)); + loadExtensions(hnds); + + // Main context serves the REST command endpoint and the welcome page. + // Its root context path ("/") is matched last, after the more specific extension contexts. + ServletContextHandler mainCtx = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); + + mainCtx.setContextPath("/"); + mainCtx.addServlet(new ServletHolder(jettyHnd), IGNITE_CMD_PATH + "/*"); + mainCtx.addServlet(new ServletHolder(new WelcomeHandler(log)), "/"); + + hnds.addHandler(mainCtx); + + httpSrv.setHandler(hnds); override(getJettyConnector()); } - /** */ - private Handler loadExtensions() throws IgniteCheckedException { - HandlerList extsHnd = new HandlerList(); - + /** Discovers REST extensions and registers a dedicated servlet context for each one. */ + private void loadExtensions(ContextHandlerCollection hnds) throws IgniteCheckedException { CommonUtils.loadService(IgniteRestExtension.class).forEach(exts::add); Set paths = new HashSet<>(); @@ -372,13 +370,11 @@ private Handler loadExtensions() throws IgniteCheckedException { A.ensure(!extCtx.isContextPathDefault(), "The context path must be configured: " + ext.getClass().getName()); A.ensure(paths.add(extCtx.getContextPath()), "Duplicate REST context path: " + extCtx.getContextPath()); - extsHnd.addHandler(extCtx); + hnds.addHandler(extCtx); if (log.isInfoEnabled()) log.info("Configured REST extension: " + ext.getClass().getName()); } - - return extsHnd; } /** diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/IgniteRestExtension.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/IgniteRestExtension.java index 275cac62c2274..ee4b749a4f9b2 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/IgniteRestExtension.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/IgniteRestExtension.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.processors.rest.protocols.http.jetty; -import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.ee11.servlet.ServletContextHandler; /** * Extension point for registering custom HTTP REST endpoints in the Jetty REST protocol. diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/WelcomeHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/WelcomeHandler.java index 72b162b467ab6..ed137e252cb64 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/WelcomeHandler.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/WelcomeHandler.java @@ -19,16 +19,15 @@ import java.io.IOException; import java.io.InputStream; +import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.apache.ignite.IgniteLogger; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; /** * Handles welcome page. */ -public class WelcomeHandler extends AbstractHandler { +public class WelcomeHandler extends HttpServlet { /** Default page. */ private final byte[] dfltPage; @@ -51,14 +50,17 @@ public WelcomeHandler(IgniteLogger log) { } /** {@inheritDoc} */ - @Override public void handle(String target, Request req, HttpServletRequest srvReq, HttpServletResponse res) throws IOException { + @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws IOException { if (dfltPage == null || favicon == null || logo == null) { res.setStatus(HttpServletResponse.SC_NOT_FOUND); - req.setHandled(true); return; } + String target = req.getRequestURI(); + + res.setStatus(HttpServletResponse.SC_OK); + if (target.startsWith("/favicon.ico")) { res.setContentType("image/x-icon"); res.getOutputStream().write(favicon); @@ -73,9 +75,6 @@ else if (target.startsWith("/logo.svg")) { } res.getOutputStream().flush(); - - res.setStatus(HttpServletResponse.SC_OK); - req.setHandled(true); } /** */ diff --git a/modules/rest-http/src/test/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/IgniteRestExtensionTest.java b/modules/rest-http/src/test/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/IgniteRestExtensionTest.java index c057aa5644362..7ea3a27cda535 100644 --- a/modules/rest-http/src/test/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/IgniteRestExtensionTest.java +++ b/modules/rest-http/src/test/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/IgniteRestExtensionTest.java @@ -29,8 +29,8 @@ import org.apache.ignite.plugin.security.SecurityException; import org.apache.ignite.resources.IgniteInstanceResource; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.ee11.servlet.ServletContextHandler; +import org.eclipse.jetty.ee11.servlet.ServletHolder; import org.junit.Test; import static org.apache.ignite.cluster.ClusterState.INACTIVE; diff --git a/modules/spring/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceSpringBeanInjector.java b/modules/spring/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceSpringBeanInjector.java index 876e79fc09313..9980bf9598e27 100644 --- a/modules/spring/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceSpringBeanInjector.java +++ b/modules/spring/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceSpringBeanInjector.java @@ -21,12 +21,12 @@ import java.lang.reflect.Modifier; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.managers.deployment.GridDeployment; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.resources.SpringResource; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.ApplicationContext; -import org.springframework.util.StringUtils; /** * Spring bean injector implementation works with resources provided @@ -111,7 +111,7 @@ private Object getBeanByResourceAnnotation(SpringResource annotation) throws Ign String beanName = annotation.resourceName(); Class beanCls = annotation.resourceClass(); - boolean oneParamSet = !StringUtils.isEmpty(beanName) ^ beanCls != SpringResource.DEFAULT.class; + boolean oneParamSet = !F.isEmpty(beanName) ^ beanCls != SpringResource.DEFAULT.class; if (!oneParamSet) { throw new IgniteCheckedException("Either bean name or its class must be specified in @SpringResource, " + @@ -119,7 +119,7 @@ private Object getBeanByResourceAnnotation(SpringResource annotation) throws Ign } try { - return !StringUtils.isEmpty(beanName) ? springCtx.getBean(beanName) : springCtx.getBean(beanCls); + return !F.isEmpty(beanName) ? springCtx.getBean(beanName) : springCtx.getBean(beanCls); } catch (NoUniqueBeanDefinitionException e) { throw e; diff --git a/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridResourceProcessorSelfTest.java b/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridResourceProcessorSelfTest.java index e6739b07d9eec..15e9e3240634e 100644 --- a/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridResourceProcessorSelfTest.java +++ b/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridResourceProcessorSelfTest.java @@ -234,10 +234,13 @@ private class TestClassWithAnnotationsDeep { /** */ private Callable c = new Callable() { + /** */ @TestAnnotation private String cStr; + /** */ private Runnable r = new Runnable() { + /** */ @TestAnnotation private String rStr; @@ -403,7 +406,7 @@ public void testInjectResourceGridTaskAndJob() throws Exception { try { // Should not be null if task has been completed successfully (meaning all resources have been injected). - Assert.notNull(g.compute().execute(TestTask.class, null)); + Assert.notNull(g.compute().execute(TestTask.class, null), "must not be null"); } finally { stopGrid(); diff --git a/modules/thin-client/impl/README.txt b/modules/thin-client/impl/README.txt new file mode 100644 index 0000000000000..160a268db0e9e --- /dev/null +++ b/modules/thin-client/impl/README.txt @@ -0,0 +1,8 @@ +Apache Ignite Thin Client Implementation Module +------------------------ + +ignite-thin-client-impl module is internal module to separate thin-client API and implementation. +It contains the implementation of the thin client API. + +Note, class files of this module are copied in ignite-core.jar during project assembly +to ensure compatibility with previous Ignite releases. diff --git a/modules/thin-client/impl/pom.xml b/modules/thin-client/impl/pom.xml new file mode 100644 index 0000000000000..d19ba53ec78a8 --- /dev/null +++ b/modules/thin-client/impl/pom.xml @@ -0,0 +1,81 @@ + + + + + + + 4.0.0 + + + org.apache.ignite + ignite-parent-internal + ${revision} + ../../../parent-internal/pom.xml + + + ignite-thin-client-impl + + http://ignite.apache.org + + + + ${project.groupId} + ignite-commons + provided + + + + ${project.groupId} + ignite-binary-api + provided + + + + ${project.groupId} + ignite-thin-client-api + provided + + + + ${project.groupId} + ignite-nio + provided + + + + org.jetbrains + annotations + ${jetbrains.annotations.version} + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven.deploy.plugin.version} + + false + + + + + diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/monitoring/EventListenerDemultiplexer.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/monitoring/EventListenerDemultiplexer.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/monitoring/EventListenerDemultiplexer.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/monitoring/EventListenerDemultiplexer.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/BinaryNameMapperMode.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/BinaryNameMapperMode.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/BinaryNameMapperMode.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/BinaryNameMapperMode.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java similarity index 94% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java index f7f6f521b2659..29055ea3d3fc3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java @@ -21,7 +21,7 @@ import org.apache.ignite.client.ClientAtomicLong; import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.BinaryWriterEx; -import org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor; +import org.apache.ignite.internal.util.CommonUtils; import org.jetbrains.annotations.Nullable; /** @@ -53,8 +53,8 @@ public ClientAtomicLongImpl(String name, @Nullable String groupName, ReliableCha this.groupName = groupName; this.ch = ch; - String grpNameInternal = groupName == null ? DataStructuresProcessor.DEFAULT_DS_GROUP_NAME : groupName; - cacheId = ClientUtils.cacheId(DataStructuresProcessor.ATOMICS_CACHE_NAME + "@" + grpNameInternal); + String grpNameInternal = groupName == null ? CommonUtils.DEFAULT_DS_GROUP_NAME : groupName; + cacheId = ClientUtils.cacheId(CommonUtils.ATOMICS_CACHE_NAME + "@" + grpNameInternal); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientBinary.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinary.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientBinary.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinary.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java similarity index 92% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java index a496265c5b18e..671e1a2c869b9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientBinaryMarshaller.java @@ -17,14 +17,14 @@ package org.apache.ignite.internal.client.thin; +import java.util.Collections; import org.apache.ignite.configuration.BinaryConfiguration; -import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.binary.BinaryContext; import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.binary.BinaryMetadataHandler; +import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.binary.streams.BinaryInputStream; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.logger.NullLogger; import org.apache.ignite.marshaller.MarshallerContext; @@ -108,10 +108,14 @@ private GridBinaryMarshaller createImpl(BinaryConfiguration binCfg) { marsh.setContext(marshCtx); - BinaryContext ctx = U.binaryContext( + BinaryContext ctx = BinaryUtils.binaryContext( metaHnd, marsh, - new IgniteConfiguration().setBinaryConfiguration(binCfg), + null, + null, + binCfg, + Collections.emptyMap(), + BinaryUtils::affinityFieldName, NullLogger.INSTANCE ); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java similarity index 99% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java index 9ac655460ef71..fb3877dbdee6d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java @@ -38,8 +38,8 @@ import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.BinaryWriterEx; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridConcurrentHashSet; -import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion.NONE; @@ -365,7 +365,7 @@ public void registerCache(String cacheName) { ClientPartitionAwarenessMapperHolder hld = cacheKeyMapperFactoryMap.computeIfAbsent(ClientUtils.cacheId(cacheName), id -> new ClientPartitionAwarenessMapperHolder(cacheName)); - hld.ts = U.currentTimeMillis(); + hld.ts = CommonUtils.currentTimeMillis(); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java similarity index 96% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java index 4a944e0c6915e..1ee7b28fb7eef 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java @@ -26,7 +26,6 @@ import java.util.UUID; import java.util.function.Function; import org.apache.ignite.IgniteBinary; -import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.client.ClientFeatureNotSupportedByServerException; import org.apache.ignite.client.ClientPartitionAwarenessMapper; import org.apache.ignite.internal.binary.BinaryReaderEx; @@ -34,8 +33,8 @@ import org.apache.ignite.internal.binary.BinaryWriterEx; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.U; import static org.apache.ignite.internal.client.thin.ProtocolBitmaskFeature.ALL_AFFINITY_MAPPINGS; import static org.apache.ignite.internal.client.thin.ProtocolBitmaskFeature.DC_AWARE; @@ -211,7 +210,7 @@ public static ClientCacheAffinityMapping readResponse( int cachesCnt = in.readInt(); if (applicable) { // Partition awareness is applicable for these caches. - Map> cacheKeyCfg = U.newHashMap(cachesCnt); + Map> cacheKeyCfg = CommonUtils.newHashMap(cachesCnt); for (int j = 0; j < cachesCnt; j++) cacheKeyCfg.put(in.readInt(), readCacheKeyConfiguration(in)); @@ -264,7 +263,7 @@ public static ClientCacheAffinityMapping readResponse( private static Map readCacheKeyConfiguration(BinaryReaderEx in) { int keyCfgCnt = in.readInt(); - Map keyCfg = U.newHashMap(keyCfgCnt); + Map keyCfg = CommonUtils.newHashMap(keyCfgCnt); for (int i = 0; i < keyCfgCnt; i++) keyCfg.put(in.readInt(), in.readInt()); @@ -298,7 +297,7 @@ private static UUID[] readNodePartitions(BinaryReaderEx in) { // Expand partToNode if needed. if (part >= partToNode.length) - partToNode = Arrays.copyOf(partToNode, U.ceilPow2(part + 1)); + partToNode = Arrays.copyOf(partToNode, CommonUtils.ceilPow2(part + 1)); } partToNode[part] = nodeId; @@ -384,12 +383,12 @@ private static class RendezvousAffinityKeyMapper implements ClientPartitionAware */ private RendezvousAffinityKeyMapper(int parts) { this.parts = parts; - affinityMask = RendezvousAffinityFunction.calculateMask(parts); + affinityMask = CommonUtils.calculateMask(parts); } /** {@inheritDoc} */ @Override public int partition(Object key) { - return RendezvousAffinityFunction.calculatePartition(key, affinityMask, parts); + return CommonUtils.calculatePartition(key, affinityMask, parts); } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntry.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntry.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntry.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntry.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenerHandler.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenerHandler.java similarity index 98% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenerHandler.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenerHandler.java index 72142323a2546..5ca39dc97d98d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenerHandler.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenerHandler.java @@ -36,8 +36,8 @@ import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.internal.binary.streams.BinaryStreams; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.T2; -import org.apache.ignite.internal.util.typedef.internal.U; import static org.apache.ignite.internal.client.thin.ClientNotificationType.CONTINUOUS_QUERY_EVENT; import static org.apache.ignite.internal.client.thin.TcpClientCache.JAVA_PLATFORM; @@ -176,7 +176,7 @@ public synchronized void startListen( if (lsnr != null) lsnr.onDisconnected(reason); - U.closeQuiet(this); + CommonUtils.closeQuiet(this); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenersRegistry.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenersRegistry.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenersRegistry.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheEntryListenersRegistry.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientChannelConfiguration.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterGroupImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterGroupImpl.java similarity index 99% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterGroupImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterGroupImpl.java index 838aecc92a33a..fbca7b15caa04 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterGroupImpl.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterGroupImpl.java @@ -42,10 +42,10 @@ import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.binary.BinaryReaderEx; import org.apache.ignite.internal.binary.BinaryWriterEx; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.lang.ClusterNodeFunc; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteProductVersion; import org.jetbrains.annotations.Nullable; @@ -121,7 +121,7 @@ private ClientClusterGroupImpl(ReliableChannelEx ch, ClientUtils utils, @Override public ClientClusterGroup forOthers(ClusterNode node, ClusterNode... nodes) { A.notNull(node, "node"); - Collection nodes0 = collection(U::newHashSet, node, nodes); + Collection nodes0 = collection(CommonUtils::newHashSet, node, nodes); return forPredicate(n -> !nodes0.contains(n)); } @@ -221,7 +221,7 @@ private ClientClusterGroupImpl(ReliableChannelEx ch, ClientUtils utils, @Override public ClientClusterGroup forHost(String host, String... hosts) { A.notNull(host, "host"); - Collection hosts0 = collection(U::newHashSet, host, hosts); + Collection hosts0 = collection(CommonUtils::newHashSet, host, hosts); return forPredicate(n -> { for (String hostName : n.hostNames()) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterImpl.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterImpl.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterNodeImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterNodeImpl.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterNodeImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientClusterNodeImpl.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientComputeImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientComputeImpl.java similarity index 99% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientComputeImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientComputeImpl.java index 7234473597c2e..d3fbf8744ffae 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientComputeImpl.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientComputeImpl.java @@ -37,9 +37,9 @@ import org.apache.ignite.internal.binary.BinaryWriterEx; import org.apache.ignite.internal.binary.streams.BinaryStreams; import org.apache.ignite.internal.processors.platform.client.ClientStatus; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.U; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.client.thin.ClientNotificationType.COMPUTE_TASK_FINISHED; @@ -266,7 +266,7 @@ private static boolean cancelGridFuture(GridFutureAdapter fut, Boolean mayInt return mayInterruptIfRunning ? fut.cancel() : fut.onCancelled(); } catch (IgniteCheckedException e) { - throw U.convertException(e); + throw CommonUtils.convertException(e); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientContinuousQueryCursor.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientContinuousQueryCursor.java similarity index 93% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientContinuousQueryCursor.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientContinuousQueryCursor.java index 0ff1f41782e61..7a5e1447b5e25 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientContinuousQueryCursor.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientContinuousQueryCursor.java @@ -21,7 +21,7 @@ import java.util.Iterator; import java.util.List; import org.apache.ignite.cache.query.QueryCursor; -import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.internal.util.CommonUtils; import org.jetbrains.annotations.NotNull; /** @@ -50,8 +50,8 @@ class ClientContinuousQueryCursor implements QueryCursor { /** {@inheritDoc} */ @Override public void close() { - U.closeQuiet(initQryCursor); - U.closeQuiet(lsnrHnd); + CommonUtils.closeQuiet(initQryCursor); + CommonUtils.closeQuiet(lsnrHnd); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientDiscoveryContext.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientDiscoveryContext.java similarity index 97% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientDiscoveryContext.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientDiscoveryContext.java index 928c00349c860..b09a119d731ea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientDiscoveryContext.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientDiscoveryContext.java @@ -37,8 +37,8 @@ import org.apache.ignite.client.ClientAddressFinder; import org.apache.ignite.client.ClientException; import org.apache.ignite.configuration.ClientConfiguration; -import org.apache.ignite.configuration.ClientConnectorConfiguration; import org.apache.ignite.internal.binary.BinaryReaderEx; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.HostAndPortRange; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.logger.NullLogger; @@ -231,8 +231,8 @@ private static Set> parsedAddresses(String[] addrs) thro try { ranges.add(HostAndPortRange.parse( a, - ClientConnectorConfiguration.DFLT_PORT, - ClientConnectorConfiguration.DFLT_PORT + ClientConnectorConfiguration.DFLT_PORT_RANGE, + CommonUtils.DFLT_PORT, + CommonUtils.DFLT_PORT + CommonUtils.DFLT_PORT_RANGE, "Failed to parse Ignite server address" )); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryCursor.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryCursor.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryCursor.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryCursor.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryPager.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryPager.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryPager.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientFieldsQueryPager.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientIgniteSetImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientIgniteSetImpl.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientIgniteSetImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientIgniteSetImpl.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientInternalBinaryConfiguration.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientInternalBinaryConfiguration.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientInternalBinaryConfiguration.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientInternalBinaryConfiguration.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheAdapter.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheAdapter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheAdapter.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheAdapter.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheEntryListenerAdapter.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheEntryListenerAdapter.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheEntryListenerAdapter.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientJCacheEntryListenerAdapter.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientNotificationType.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientNotificationType.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientNotificationType.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientNotificationType.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientOperation.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientProtocolError.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientProtocolError.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientProtocolError.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientProtocolError.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryPager.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryPager.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryPager.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryPager.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientRetryPolicyContextImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientRetryPolicyContextImpl.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientRetryPolicyContextImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientRetryPolicyContextImpl.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientServiceDescriptorImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientServiceDescriptorImpl.java similarity index 98% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientServiceDescriptorImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientServiceDescriptorImpl.java index 51a1eea708b93..580c7963676d7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientServiceDescriptorImpl.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientServiceDescriptorImpl.java @@ -20,7 +20,6 @@ import java.util.UUID; import org.apache.ignite.client.ClientServiceDescriptor; import org.apache.ignite.platform.PlatformType; -import org.apache.ignite.services.Service; import org.jetbrains.annotations.Nullable; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientServicesImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientServicesImpl.java similarity index 98% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientServicesImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientServicesImpl.java index 6cda195ddf72a..342ce8f630c5f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientServicesImpl.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientServicesImpl.java @@ -40,9 +40,9 @@ import org.apache.ignite.internal.binary.BinaryWriterEx; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.service.ServiceCallContextImpl; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.A; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.platform.PlatformServiceMethod; import org.apache.ignite.platform.PlatformType; import org.apache.ignite.services.ServiceCallContext; @@ -218,7 +218,7 @@ private ServiceTopology(String name) { */ private boolean isUpdateRequired(AffinityTopologyVersion curAffTop) { return lastAffTop == null || curAffTop.topologyVersion() > lastAffTop.topologyVersion() - || U.nanosToMillis(System.nanoTime() - lastUpdateRequestTime) >= SRV_TOP_UPDATE_PERIOD; + || CommonUtils.nanosToMillis(System.nanoTime() - lastUpdateRequestTime) >= SRV_TOP_UPDATE_PERIOD; } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientSslUtils.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientSslUtils.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientSslUtils.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientSslUtils.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/FieldsQueryPager.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/FieldsQueryPager.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/FieldsQueryPager.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/FieldsQueryPager.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/IgniteClientFutureImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/IgniteClientFutureImpl.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/IgniteClientFutureImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/IgniteClientFutureImpl.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/NotificationListener.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/NotificationListener.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/NotificationListener.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/NotificationListener.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/PayloadInputChannel.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/PayloadOutputChannel.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/PayloadOutputChannel.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/PayloadOutputChannel.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/PayloadOutputChannel.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ProtocolContext.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ProtocolContext.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ProtocolContext.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ProtocolContext.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersion.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersion.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersion.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersion.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersionFeature.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersionFeature.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersionFeature.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ProtocolVersionFeature.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelEx.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java similarity index 99% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java index ec6e96cb0f979..b29bb69629fe3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ReliableChannelImpl.java @@ -39,8 +39,8 @@ import java.util.function.Function; import java.util.stream.Collectors; import org.apache.ignite.IgniteBinary; +import org.apache.ignite.IgniteCommonsSystemProperties; import org.apache.ignite.IgniteLogger; -import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.client.ClientAuthenticationException; import org.apache.ignite.client.ClientConnectionException; import org.apache.ignite.client.ClientException; @@ -52,8 +52,8 @@ import org.apache.ignite.configuration.ClientConfiguration; import org.apache.ignite.internal.client.thin.io.ClientConnectionMultiplexer; import org.apache.ignite.internal.client.thin.io.gridnioserver.GridNioClientConnectionMultiplexer; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.logger.NullLogger; import org.jetbrains.annotations.Nullable; @@ -141,10 +141,10 @@ final class ReliableChannelImpl implements ReliableChannelEx { partitionAwarenessEnabled = clientCfg.isPartitionAwarenessEnabled(); - String dcId = IgniteSystemProperties.getString(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + String dcId = IgniteCommonsSystemProperties.getString(IgniteCommonsSystemProperties.IGNITE_DATA_CENTER_ID); if (dcId == null && !F.isEmpty(clientCfg.getUserAttributes())) - dcId = clientCfg.getUserAttributes().get(IgniteSystemProperties.IGNITE_DATA_CENTER_ID); + dcId = clientCfg.getUserAttributes().get(IgniteCommonsSystemProperties.IGNITE_DATA_CENTER_ID); affinityCtx = new ClientCacheAffinityContext( binary, @@ -1133,7 +1133,7 @@ private ClientChannel getOrCreateChannel(boolean ignoreThrottling) */ private synchronized void closeChannel() { if (ch != null) { - U.closeQuiet(ch); + CommonUtils.closeQuiet(ch); ch = null; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java similarity index 99% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java index 0099f096b4fbf..ab574b9cf3eb4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java @@ -72,11 +72,11 @@ import org.apache.ignite.internal.processors.cache.CacheInvokeResult; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.processors.platform.client.ClientStatus; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.T3; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.internal.A; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.transactions.TransactionConcurrency; import org.apache.ignite.transactions.TransactionIsolation; import org.jetbrains.annotations.Nullable; @@ -1146,7 +1146,7 @@ else if (qry instanceof IndexQuery) return new ClientContinuousQueryCursor<>(cur, hnd); } catch (Exception e) { - U.closeQuiet(hnd); + CommonUtils.closeQuiet(hnd); throw e; } @@ -1202,7 +1202,7 @@ else if (qry instanceof IndexQuery) @Override public void deregisterCacheEntryListener(CacheEntryListenerConfiguration cfg) { ClientCacheEntryListenerHandler hnd = lsnrsRegistry.deregisterCacheEntryListener(name, cfg); - U.closeQuiet(hnd); + CommonUtils.closeQuiet(hnd); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java similarity index 98% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java index 00a6c56c59e88..c61a80b4ffda3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java @@ -64,16 +64,14 @@ import org.apache.ignite.internal.client.thin.io.ClientMessageHandler; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.odbc.ClientConnectionNodeRecoveryException; -import org.apache.ignite.internal.processors.odbc.ClientListenerNioListener; -import org.apache.ignite.internal.processors.odbc.ClientListenerRequest; import org.apache.ignite.internal.processors.platform.client.ClientFlag; import org.apache.ignite.internal.processors.platform.client.ClientStatus; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.T2; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.internal.S; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.logger.NullLogger; import org.jetbrains.annotations.Nullable; @@ -217,7 +215,7 @@ class TcpClientChannel implements ClientChannel, ClientMessageHandler, ClientCon catch (ClientConnectionException e) { log.info("Can't establish connection with " + addr); - connectionEx = U.addSuppressed(connectionEx, e); + connectionEx = CommonUtils.addSuppressed(connectionEx, e); continue; } @@ -231,9 +229,9 @@ class TcpClientChannel implements ClientChannel, ClientMessageHandler, ClientCon log.info("Can't establish connection with " + addr + ". Node in recovery mode."); - connectionEx = U.addSuppressed(connectionEx, e); + connectionEx = CommonUtils.addSuppressed(connectionEx, e); - U.closeQuiet(sock); + CommonUtils.closeQuiet(sock); sock = null; continue; @@ -290,7 +288,7 @@ private void close(Exception cause) { if (heartbeatTimer != null) heartbeatTimer.cancel(); - U.closeQuiet(sock); + CommonUtils.closeQuiet(sock); pendingReqsLock.writeLock().lock(); @@ -842,17 +840,17 @@ else if (!supportedVers.contains(srvVer) || /** Send handshake request. */ private void handshakeReq(ProtocolVersion proposedVer, String user, String pwd, Map userAttrs) throws ClientConnectionException { - try (BinaryWriterEx writer = BinaryUtils.writer(U.binaryContext(null), BinaryStreams.outputStream(32), null)) { + try (BinaryWriterEx writer = BinaryUtils.writer(BinaryUtils.binaryContext(null), BinaryStreams.outputStream(32), null)) { ProtocolContext protocolCtx = protocolContextFromVersion(proposedVer); writer.writeInt(0); // reserve an integer for the request size - writer.writeByte((byte)ClientListenerRequest.HANDSHAKE); + writer.writeByte((byte)CommonUtils.HANDSHAKE); writer.writeShort(proposedVer.major()); writer.writeShort(proposedVer.minor()); writer.writeShort(proposedVer.patch()); - writer.writeByte(ClientListenerNioListener.THIN_CLIENT); + writer.writeByte(CommonUtils.THIN_CLIENT); if (protocolCtx.isFeatureSupported(BITMAP_FEATURES)) { byte[] features = ProtocolBitmaskFeature.featuresAsBytes(protocolCtx.features()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java similarity index 99% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index b21eca8578160..3aca5f9fde6b9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -71,9 +71,9 @@ import org.apache.ignite.internal.client.thin.io.ClientConnectionMultiplexer; import org.apache.ignite.internal.processors.platform.client.ClientStatus; import org.apache.ignite.internal.processors.platform.client.IgniteClientException; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridArgumentCheck; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.logger.NullLogger; import org.apache.ignite.marshaller.MarshallerContext; @@ -792,7 +792,7 @@ private class ClientMarshallerContext implements MarshallerContext { */ public ClientMarshallerContext() { try { - MarshallerUtils.processSystemClasses(U.gridClassLoader(), null, sysTypes::add); + MarshallerUtils.processSystemClasses(CommonUtils.gridClassLoader(), sysTypes::add); } catch (IOException e) { throw new IllegalStateException("Failed to initialize marshaller context.", e); @@ -858,7 +858,8 @@ public ClientMarshallerContext() { @Override public Class getClass(int typeId, ClassLoader ldr) throws ClassNotFoundException, IgniteCheckedException { - return U.forName(getClassName(MarshallerPlatformIds.JAVA_ID, typeId), ldr, null); + return CommonUtils.forName(getClassName(MarshallerPlatformIds.JAVA_ID, typeId), ldr, null, + Marshallers.USE_CACHE.get()); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnection.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnection.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnection.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnection.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionMultiplexer.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionMultiplexer.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionMultiplexer.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionMultiplexer.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionStateHandler.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionStateHandler.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionStateHandler.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientConnectionStateHandler.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageDecoder.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageDecoder.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageDecoder.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageDecoder.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageHandler.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageHandler.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageHandler.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/ClientMessageHandler.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnection.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnection.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnection.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnection.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java similarity index 99% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java index a26a6f2dac7e7..5d157fe725178 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java @@ -82,7 +82,7 @@ public GridNioClientConnectionMultiplexer(ClientConfiguration cfg) { sslCtx = ClientSslUtils.getSslContext(cfg); if (sslCtx != null) { - GridNioSslFilter sslFilter = new GridNioSslFilter(sslCtx, true, ByteOrder.nativeOrder(), gridLog, null); + GridNioSslFilter sslFilter = new GridNioSslFilter(sslCtx, true, ByteOrder.nativeOrder(), gridLog, null, null); sslFilter.directMode(false); filters = new GridNioFilter[] {codecFilter, sslFilter}; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientListener.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientListener.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientListener.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientListener.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientParser.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientParser.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientParser.java rename to modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientParser.java diff --git a/modules/tools/pom.xml b/modules/tools/pom.xml index c784858758a8d..5a53d9b7bf9db 100644 --- a/modules/tools/pom.xml +++ b/modules/tools/pom.xml @@ -125,7 +125,7 @@ org.apache.ant ant - 1.10.13 + 1.10.17 diff --git a/modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentSpringDocument.java b/modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentSpringDocument.java index 0143537c52258..0a3159013515a 100644 --- a/modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentSpringDocument.java +++ b/modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentSpringDocument.java @@ -24,7 +24,7 @@ import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.spi.IgniteSpiException; import org.springframework.beans.BeansException; -import org.springframework.beans.factory.xml.XmlBeanFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; /** * Helper class which helps to read deployer and tasks information from @@ -32,7 +32,7 @@ */ class GridUriDeploymentSpringDocument { /** Initialized springs beans factory. */ - private final XmlBeanFactory factory; + private final DefaultListableBeanFactory factory; /** List of tasks from package description. */ private List>> tasks; @@ -42,7 +42,7 @@ class GridUriDeploymentSpringDocument { * * @param factory Configuration factory. */ - GridUriDeploymentSpringDocument(XmlBeanFactory factory) { + GridUriDeploymentSpringDocument(DefaultListableBeanFactory factory) { assert factory != null; this.factory = factory; diff --git a/modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentSpringParser.java b/modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentSpringParser.java index 842a8cf9be07c..f62ce2a146a33 100644 --- a/modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentSpringParser.java +++ b/modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentSpringParser.java @@ -24,7 +24,8 @@ import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.spi.IgniteSpiException; import org.springframework.beans.BeansException; -import org.springframework.beans.factory.xml.XmlBeanFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.InputStreamResource; @@ -52,8 +53,8 @@ private GridUriDeploymentSpringParser() { * @param log Logger * @return Grid wrapper for the input stream. * @throws org.apache.ignite.spi.IgniteSpiException Thrown if incoming input stream could not be - * read or parsed by {@code Spring} {@link XmlBeanFactory}. - * @see XmlBeanFactory + * read or parsed by {@code Spring} {@link DefaultListableBeanFactory}. + * @see DefaultListableBeanFactory */ static GridUriDeploymentSpringDocument parseTasksDocument(InputStream in, IgniteLogger log) throws IgniteSpiException { @@ -65,7 +66,8 @@ static GridUriDeploymentSpringDocument parseTasksDocument(InputStream in, Ignite try { U.copy(in, out); - XmlBeanFactory factory = new XmlBeanFactory(new ByteArrayResource(out.toByteArray())); + DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); + new XmlBeanDefinitionReader(factory).loadBeanDefinitions(new ByteArrayResource(out.toByteArray())); return new GridUriDeploymentSpringDocument(factory); } diff --git a/modules/urideploy/src/test/java/org/apache/ignite/spi/deployment/uri/scanners/http/GridHttpDeploymentSelfTest.java b/modules/urideploy/src/test/java/org/apache/ignite/spi/deployment/uri/scanners/http/GridHttpDeploymentSelfTest.java index b366d4fe2fa93..b7d7fb4c7ab06 100644 --- a/modules/urideploy/src/test/java/org/apache/ignite/spi/deployment/uri/scanners/http/GridHttpDeploymentSelfTest.java +++ b/modules/urideploy/src/test/java/org/apache/ignite/spi/deployment/uri/scanners/http/GridHttpDeploymentSelfTest.java @@ -30,6 +30,7 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.handler.ResourceHandler; +import org.eclipse.jetty.util.resource.ResourceFactory; import org.junit.Test; /** @@ -86,7 +87,7 @@ public class GridHttpDeploymentSelfTest extends GridUriDeploymentAbstractSelfTes ResourceHandler hnd = new ResourceHandler(); - hnd.setDirectoriesListed(true); + hnd.setDirAllowed(true); String garPathTmp = GridTestProperties.getProperty("urideployment.path.tmp"); @@ -100,7 +101,7 @@ public class GridHttpDeploymentSelfTest extends GridUriDeploymentAbstractSelfTes rsrcBase = resourseBaseDir.getPath(); - hnd.setResourceBase(rsrcBase); + hnd.setBaseResource(ResourceFactory.root().newResource(rsrcBase)); srv.setHandler(hnd); diff --git a/modules/web/ignite-appserver-test/src/main/webapp/WEB-INF/web.xml b/modules/web/ignite-appserver-test/src/main/webapp/WEB-INF/web.xml index 6fe7358724e75..44b1dd498edb6 100644 --- a/modules/web/ignite-appserver-test/src/main/webapp/WEB-INF/web.xml +++ b/modules/web/ignite-appserver-test/src/main/webapp/WEB-INF/web.xml @@ -15,11 +15,11 @@ ~ limitations under the License. --> - - - + Archetype Created Web Application diff --git a/modules/web/ignite-websphere-test/pom.xml b/modules/web/ignite-websphere-test/pom.xml index 84dad0d4b6cff..6495420328842 100644 --- a/modules/web/ignite-websphere-test/pom.xml +++ b/modules/web/ignite-websphere-test/pom.xml @@ -43,12 +43,18 @@ ${project.groupId} ignite-jta + + + jakarta.transaction + jakarta.transaction-api + + - com.ibm.websphere.appserver.api - com.ibm.websphere.appserver.api.transaction - 1.1.113 + jakarta.transaction + jakarta.transaction-api + 2.0.1 diff --git a/modules/web/ignite-websphere-test/src/main/java/org/apache/ignite/webtest/TestJtaTxServlet.java b/modules/web/ignite-websphere-test/src/main/java/org/apache/ignite/webtest/TestJtaTxServlet.java index e7f33aa3fc31e..f859bfdab58ae 100644 --- a/modules/web/ignite-websphere-test/src/main/java/org/apache/ignite/webtest/TestJtaTxServlet.java +++ b/modules/web/ignite-websphere-test/src/main/java/org/apache/ignite/webtest/TestJtaTxServlet.java @@ -19,13 +19,13 @@ import java.io.IOException; import java.io.PrintWriter; -import javax.transaction.RollbackException; -import javax.transaction.TransactionManager; -import com.ibm.tx.jta.TransactionManagerFactory; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import jakarta.transaction.RollbackException; +import jakarta.transaction.UserTransaction; +import javax.naming.InitialContext; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.Ignition; @@ -56,7 +56,7 @@ public class TestJtaTxServlet extends HttpServlet { final IgniteCache cache = ignite.cache("tx"); - TransactionManager tmMgr = TransactionManagerFactory.getTransactionManager(); + UserTransaction tmMgr = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction"); tmMgr.begin(); diff --git a/modules/web/ignite-websphere-test/src/main/webapp/WEB-INF/web.xml b/modules/web/ignite-websphere-test/src/main/webapp/WEB-INF/web.xml index 94cb0cf6b6d3f..c4d24ea9bd316 100644 --- a/modules/web/ignite-websphere-test/src/main/webapp/WEB-INF/web.xml +++ b/modules/web/ignite-websphere-test/src/main/webapp/WEB-INF/web.xml @@ -15,11 +15,11 @@ ~ limitations under the License. --> - - - + Archetype Created Web Application diff --git a/modules/web/pom.xml b/modules/web/pom.xml index d75e7d4542091..26c082bb43df7 100644 --- a/modules/web/pom.xml +++ b/modules/web/pom.xml @@ -47,8 +47,8 @@ - org.eclipse.jetty.toolchain - jetty-jakarta-servlet-api + jakarta.servlet + jakarta.servlet-api ${jetty-jakarta-servlet-api.version} @@ -65,15 +65,15 @@ - org.eclipse.jetty - jetty-servlets + org.eclipse.jetty.ee11 + jetty-ee11-servlets ${jetty.version} test - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee11 + jetty-ee11-webapp ${jetty.version} test diff --git a/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java b/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java index adbbc18690e54..c297f5c5c53fe 100644 --- a/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java +++ b/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java @@ -21,10 +21,6 @@ import java.util.Collection; import java.util.Map; import java.util.Objects; -import javax.cache.CacheException; -import javax.cache.expiry.Duration; -import javax.cache.expiry.ExpiryPolicy; -import javax.cache.expiry.ModifiedExpiryPolicy; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; @@ -35,6 +31,10 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequestWrapper; import jakarta.servlet.http.HttpSession; +import javax.cache.CacheException; +import javax.cache.expiry.Duration; +import javax.cache.expiry.ExpiryPolicy; +import javax.cache.expiry.ModifiedExpiryPolicy; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteClientDisconnectedException; @@ -862,7 +862,6 @@ private void handleAttributeUpdateException(final String sesId, final int tryCnt } } - /** * Handles cache operation exception. * @param e Exception diff --git a/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionSelfTest.java b/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionSelfTest.java index 45b4ecf838fdf..c5c6e69902d73 100644 --- a/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionSelfTest.java +++ b/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionSelfTest.java @@ -57,12 +57,13 @@ import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.eclipse.jetty.ee11.servlet.ServletHolder; +import org.eclipse.jetty.ee11.webapp.WebAppContext; import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.SecurityHandler; +import org.eclipse.jetty.security.authentication.BasicAuthenticator; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.security.Constraint; -import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.util.resource.ResourceFactory; import org.jetbrains.annotations.Nullable; import org.junit.Ignore; import org.junit.Test; @@ -998,10 +999,10 @@ private Server startServerWithLoginService( HashLoginService hashLoginSrvc = new HashLoginService(); hashLoginSrvc.setName("Test Realm"); createRealm(); - hashLoginSrvc.setConfig("/tmp/realm.properties"); + hashLoginSrvc.setConfig(ResourceFactory.root().newResource("/tmp/realm.properties")); SecurityHandler securityHnd = ctx.getSecurityHandler(); // DefaultAuthenticatorFactory doesn't default to basic auth anymore. - securityHnd.setAuthMethod(Constraint.__BASIC_AUTH); + securityHnd.setAuthenticator(new BasicAuthenticator()); securityHnd.setLoginService(hashLoginSrvc); srv.setHandler(ctx); diff --git a/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionServerStart.java b/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionServerStart.java index b620085e09e16..a2d0ca6cd39ac 100644 --- a/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionServerStart.java +++ b/modules/web/src/test/java/org/apache/ignite/internal/websession/WebSessionServerStart.java @@ -25,9 +25,9 @@ import jakarta.servlet.http.HttpSession; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.internal.U; +import org.eclipse.jetty.ee11.servlet.ServletHolder; +import org.eclipse.jetty.ee11.webapp.WebAppContext; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.webapp.WebAppContext; /** * Server starter for web sessions caching test. diff --git a/modules/web/src/test/webapp2/WEB-INF/web.xml b/modules/web/src/test/webapp2/WEB-INF/web.xml index d51b87d27a621..bb1e5ee85d85a 100644 --- a/modules/web/src/test/webapp2/WEB-INF/web.xml +++ b/modules/web/src/test/webapp2/WEB-INF/web.xml @@ -17,11 +17,11 @@ ~ limitations under the License. --> - + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee + https://jakarta.ee/xml/ns/jakartaee/web-app_6_1.xsd" + version="6.1"> diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/DiscoveryMessageParser.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/DiscoveryMessageParser.java index d29a73f7039f4..b33684d6abdb6 100644 --- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/DiscoveryMessageParser.java +++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/DiscoveryMessageParser.java @@ -27,13 +27,12 @@ import java.util.zip.InflaterInputStream; import org.apache.ignite.internal.direct.DirectMessageReader; import org.apache.ignite.internal.direct.DirectMessageWriter; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.plugin.extensions.communication.MessageFactory; import org.apache.ignite.plugin.extensions.communication.MessageSerializer; import org.apache.ignite.spi.IgniteSpiException; -import static org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.makeMessageType; - /** * Class is responsible for serializing discovery messages using RU-ready {@link MessageSerializer} mechanism. */ @@ -104,7 +103,7 @@ private T deserializeMessage(InputStream in) throws IOExcept msgReader.setBuffer(msgBuf); - Message msg = msgFactory.create(makeMessageType((byte)in.read(), (byte)in.read())); + Message msg = msgFactory.create(CommonUtils.makeMessageType((byte)in.read(), (byte)in.read())); MessageSerializer msgSer = msgFactory.serializer(msg.directType()); boolean finished; diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkBulkJoinContext.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkBulkJoinContext.java index a186aed526567..7bdc5ff8ea43e 100644 --- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkBulkJoinContext.java +++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkBulkJoinContext.java @@ -17,28 +17,28 @@ package org.apache.ignite.spi.discovery.zk.internal; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.ignite.internal.util.typedef.T2; +import org.apache.ignite.plugin.extensions.communication.Message; /** * */ class ZkBulkJoinContext { /** */ - List>> nodes; + List> nodes; /** * @param nodeEvtData Node event data. * @param discoData Discovery data for node. */ - void addJoinedNode(ZkJoinedNodeEvtData nodeEvtData, Map discoData) { + void addJoinedNode(ZkJoinedNodeEvtData nodeEvtData, Map discoData) { if (nodes == null) nodes = new ArrayList<>(); - nodes.add(new T2<>(nodeEvtData, discoData)); + nodes.add(new T2<>(nodeEvtData, new ZkDiscoDataBagWrapper(discoData))); } /** diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDiscoDataBagWrapper.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDiscoDataBagWrapper.java new file mode 100644 index 0000000000000..28a188ec0cafd --- /dev/null +++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDiscoDataBagWrapper.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.spi.discovery.zk.internal; + +import java.util.Map; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.Order; +import org.apache.ignite.plugin.extensions.communication.Message; +import org.apache.ignite.plugin.extensions.communication.MessageFactory; +import org.apache.ignite.spi.discovery.SerializableDataBagItemWrapper; + +/** Data bag data holder. */ +public class ZkDiscoDataBagWrapper implements Message { + /** */ + @Order(0) + Map data; + + /** */ + private IgniteCheckedException unmarshErr; + + /** Default constructor for {@link MessageFactory}. */ + public ZkDiscoDataBagWrapper() { + // No-op. + } + + /** @param data Discovery data. */ + public ZkDiscoDataBagWrapper(Map data) { + this.data = data; + } + + /** + * Returns data or throws caught unmarshalling errors. + * + * @return Data. + * @throws IgniteCheckedException Unmarshalling exception, if any. + */ + public Map unmarshalledData() throws IgniteCheckedException { + if (unmarshErr != null) + throw unmarshErr; + + IgniteCheckedException err = null; + + for (Message msg : data.values()) { + if (msg instanceof SerializableDataBagItemWrapper wrapper && wrapper.unmarshallError() != null) { + IgniteCheckedException e = wrapper.unmarshallError(); + + if (err == null) + err = e; + else + err.addSuppressed(e); + } + } + + if (err != null) { + unmarshErr = err; + + throw err; + } + + return data; + } +} diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkMessageFactory.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkMessageFactory.java index 39d89b32af878..cf9f95a908f7e 100644 --- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkMessageFactory.java +++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkMessageFactory.java @@ -28,5 +28,6 @@ public class ZkMessageFactory implements MessageFactoryProvider { factory.register(401, ZkCommunicationErrorResolveStartMessage::new, new ZkCommunicationErrorResolveStartMessageSerializer()); factory.register(402, ZkForceNodeFailMessage::new, new ZkForceNodeFailMessageSerializer()); factory.register(403, ZkNoServersMessage::new, new ZkNoServersMessageSerializer()); + factory.register(404, ZkDiscoDataBagWrapper::new, new ZkDiscoDataBagWrapperSerializer()); } } diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java index 0d0531d1a9a2c..f69e9f6d10658 100644 --- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java +++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java @@ -78,6 +78,7 @@ import org.apache.ignite.lang.IgniteRunnable; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.marshaller.jdk.JdkMarshaller; +import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.plugin.extensions.communication.MessageFactory; import org.apache.ignite.plugin.security.SecurityCredentials; import org.apache.ignite.spi.IgniteNodeValidationResult; @@ -1781,7 +1782,7 @@ private void generateBulkJoinEvent(TreeMap curTop, Z long evtId = rtState.evtsData.evtIdGen; - List>> nodes = joinCtx.nodes; + List> nodes = joinCtx.nodes; assert nodes != null && !nodes.isEmpty(); @@ -1793,11 +1794,9 @@ private void generateBulkJoinEvent(TreeMap curTop, Z Map dupDiscoData = null; for (int i = 0; i < nodeCnt; i++) { - T2> nodeEvtData = nodes.get(i); + T2 nodeEvtData = nodes.get(i); - Map discoData = nodeEvtData.get2(); - - byte[] discoDataBytes = U.marshal(marsh, discoData); + byte[] discoDataBytes = msgParser.marshalZip(nodeEvtData.get2()); Long dupDataNode = null; @@ -2251,7 +2250,7 @@ private void addJoinedNode( exchange.collect(collectBag); - Map commonData = collectBag.commonData(); + Map commonData = collectBag.commonData(); Object old = curTop.put(joinedNode.order(), joinedNode); @@ -3021,12 +3020,11 @@ private void processLocalJoin(ZkDiscoveryEventsData evtsData, byte[] discoDataBytes = dataForJoined.discoveryDataForNode(locNode.order()); - Map commonDiscoData = - marsh.unmarshal(discoDataBytes, U.resolveClassLoader(spi.ignite().configuration())); + ZkDiscoDataBagWrapper zkDataBagWrapper = msgParser.unmarshalZip(discoDataBytes); DiscoveryDataBag dataBag = new DiscoveryDataBag(locNode.id(), locNode.isClient()); - dataBag.commonData(commonDiscoData); + dataBag.commonData(zkDataBagWrapper.unmarshalledData()); exchange.onExchange(dataBag); diff --git a/parent/pom.xml b/parent/pom.xml index 5249ea65a3f0f..6acf8838ec5c2 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -74,7 +74,7 @@ 5.9.0 33.5.0-jre 1.0.1 - 1.62.2 + 1.81.0 1.4.197 2.2 2.21.3 @@ -83,10 +83,10 @@ 1.0.0_1 1.1.1 1.0.0 - 1.0.6.Final + 3.6.3.Final 26.1.0 - 11.0.25 - 5.0.2 + 12.1.10 + 6.1.0 1.37 4.5.2 3.1.15 @@ -101,13 +101,13 @@ 1.7.3 pom-installed.xml 3.8.9 - 8.45 + 12.3.1 5.21.0 8.0.30 42.7.3 2.0.17 - 1.1.10.7 - 5.3.39 + 1.1.10.8 + 6.2.19 3.5.6 10.0.27 0.8.3 @@ -117,6 +117,7 @@ 3.20.0 1.0.0 1.4.17 + 7.3.4.Final 3.12.0 @@ -683,6 +684,18 @@ [3.9.6,) + + + javax.transaction:jta + javax.transaction:javax.transaction-api + jakarta.transaction:jakarta.transaction-api:(,2.0.1) + + + Use jakarta.transaction:jakarta.transaction-api:2.0.1+ only. + Add <exclusions> to the transitive source if this fails. + + + @@ -860,6 +873,7 @@ NameSet* **/.gitignore + **/.git **/.asf.yaml .travis.yml .github/PULL_REQUEST_TEMPLATE.md diff --git a/pom.xml b/pom.xml index 5b4ef9e6f5516..d666654f0377c 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,9 @@ modules/binary/api modules/binary/impl modules/thin-client/api + modules/thin-client/impl modules/unsafe + modules/nio modules/core modules/compress modules/dev-utils @@ -567,7 +569,7 @@ - + From c343fd1b645452658108a7dac8c42276db8c341d Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 22 Jul 2026 18:04:46 +0300 Subject: [PATCH 53/54] [MINOR] Remove ClassCache interface --- .../ignite/internal/util/ClassCache.java | 32 ------------------- .../ignite/internal/util/CommonUtils.java | 4 +-- 2 files changed, 1 insertion(+), 35 deletions(-) delete mode 100644 modules/commons/src/main/java/org/apache/ignite/internal/util/ClassCache.java diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/util/ClassCache.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/ClassCache.java deleted file mode 100644 index 7d6edbe9163b3..0000000000000 --- a/modules/commons/src/main/java/org/apache/ignite/internal/util/ClassCache.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.util; - -/** - * Class cache. - */ -public interface ClassCache { - /** - * Get class for the given name. - * - * @param clsName Class name. - * @return Class. - * @throws ClassNotFoundException If not found. - */ - public Class getFromCache(String clsName) throws ClassNotFoundException; -} diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java index 8954c0cafd18c..ab5ff9f2a865a 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java @@ -855,9 +855,7 @@ public static Class forName( return cls; if (ldr != null) { - if (ldr instanceof ClassCache) - return ((ClassCache)ldr).getFromCache(clsName); - else if (!useCache) { + if (!useCache) { cls = Class.forName(clsName, true, ldr); return cls; From 005c33f929e1013dce7b4f42751b60c94127c47c Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 14 Sep 2026 10:06:00 +0300 Subject: [PATCH 54/54] [MINOR] Fix test after IGNITE-28088 --- .../java/org/apache/ignite/internal/CoreMessagesProvider.java | 4 ++-- .../apache/ignite/internal/client/thin/TcpIgniteClient.java | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java index 5e0b4b9b31a99..b4a2b88a85cd4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java @@ -761,8 +761,8 @@ public CoreMessagesProvider() { register(RollingUpgradeClusterData.class); register(IgniteNodeFeatureSet.class); - withNoSchema(DownloadClassPathMessage.class); - withNoSchema(DownloadClassPathFailureMessage.class); + register(DownloadClassPathMessage.class); + register(DownloadClassPathFailureMessage.class); assert msgIdx <= MAX_MESSAGE_ID; } diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index 40075f9a8b541..552fdf496927d 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -79,6 +79,7 @@ import org.apache.ignite.internal.marshaller.ClassLoaderUtils; import org.apache.ignite.internal.processors.platform.client.ClientStatus; import org.apache.ignite.internal.processors.platform.client.IgniteClientException; +import org.apache.ignite.internal.util.CommonUtils; import org.apache.ignite.internal.util.GridArgumentCheck; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.logger.NullLogger; @@ -654,7 +655,7 @@ public void uploadClasspathFile(ClusterNode node, UUID icpID, Path file) throws cliCh.service( ClientOperation.FILE_UPLOAD, ch -> { - try (BinaryWriterEx w = BinaryUtils.writer(marsh.context(), ch.out(), null)) { + try (BinaryWriterEx w = BinaryUtils.writerWithoutSchema(marsh.context(), ch.out())) { w.writeUuid(node.id()); w.writeUuid(icpID); w.writeString(name);