diff --git a/src/main/java/com/avaje/ebean/config/AutofetchConfig.java b/src/main/java/com/avaje/ebean/config/AutofetchConfig.java index 02dbdda38..96aa821d5 100644 --- a/src/main/java/com/avaje/ebean/config/AutofetchConfig.java +++ b/src/main/java/com/avaje/ebean/config/AutofetchConfig.java @@ -7,19 +7,15 @@ public class AutofetchConfig { private AutofetchMode mode = AutofetchMode.DEFAULT_ONIFEMPTY; - private boolean queryTuning = false; + private boolean queryTuning; - private boolean queryTuningAddVersion = false; + private boolean queryTuningAddVersion; - private boolean profiling = false; + private boolean profiling; - private int profilingMin = 1; + private int profilingBase = 5; - private int profilingBase = 10; - - private double profilingRate = 0.05; - - private String logDirectory; + private double profilingRate = 0.01; private int profileUpdateFrequency = 60; @@ -101,22 +97,6 @@ public class AutofetchConfig { this.profiling = profiling; } - /** - * Return the minimum number of queries to profile before autofetch will start - * tuning the queries. - */ - public int getProfilingMin() { - return profilingMin; - } - - /** - * Set the minimum number of queries to profile before autofetch will start - * tuning the queries. - */ - public void setProfilingMin(int profilingMin) { - this.profilingMin = profilingMin; - } - /** * Return the base number of queries to profile before changing to profile * only a percentage of following queries (profileRate). @@ -148,20 +128,6 @@ public class AutofetchConfig { this.profilingRate = profilingRate; } - /** - * Return the log directory to put the autofetch log. - */ - public String getLogDirectory() { - return logDirectory; - } - - /** - * Set the directory to put the autofetch log in. - */ - public void setLogDirectory(String logDirectory) { - this.logDirectory = logDirectory; - } - /** * Return the frequency in seconds to update the autofetch tuned queries from * the profiled information. @@ -228,18 +194,16 @@ public class AutofetchConfig { */ public void loadSettings(PropertiesWrapper p) { - logDirectory = p.get("autofetch.logDirectory", logDirectory); - queryTuning = p.getBoolean("autofetch.querytuning", queryTuning); - queryTuningAddVersion = p.getBoolean("autofetch.queryTuningAddVersion", queryTuningAddVersion); - garbageCollectionOnShutdown = p.getBoolean("autofetch.garbageCollectionOnShutdown", garbageCollectionOnShutdown); + queryTuning = p.getBoolean("autotune.querytuning", queryTuning); + queryTuningAddVersion = p.getBoolean("autotune.queryTuningAddVersion", queryTuningAddVersion); + garbageCollectionOnShutdown = p.getBoolean("autotune.garbageCollectionOnShutdown", garbageCollectionOnShutdown); - profiling = p.getBoolean("autofetch.profiling", profiling); - mode = p.getEnum(AutofetchMode.class, "autofetch.implicitmode", mode); + profiling = p.getBoolean("autotune.profiling", profiling); + mode = p.getEnum(AutofetchMode.class, "autotune.implicitmode", mode); - profilingMin = p.getInt("autofetch.profiling.min", profilingMin); - profilingBase = p.getInt("autofetch.profiling.base", profilingBase); + profilingBase = p.getInt("autotune.profiling.base", profilingBase); - profilingRate = p.getDouble("autofetch.profiling.rate", profilingRate); - profileUpdateFrequency = p.getInt("autofetch.profiling.updatefrequency", profileUpdateFrequency); + profilingRate = p.getDouble("autotune.profiling.rate", profilingRate); + profileUpdateFrequency = p.getInt("autotune.profiling.updatefrequency", profileUpdateFrequency); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/autofetch/service/AutoTuneServiceFactory.java b/src/main/java/com/avaje/ebeaninternal/server/autofetch/service/AutoTuneServiceFactory.java index c0327c4fb..f730a3b31 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/autofetch/service/AutoTuneServiceFactory.java +++ b/src/main/java/com/avaje/ebeaninternal/server/autofetch/service/AutoTuneServiceFactory.java @@ -8,7 +8,7 @@ public class AutoTuneServiceFactory { public static AutoTuneService create(SpiEbeanServer server, ServerConfig serverConfig) { - return new BaseAutoTuneService(server, serverConfig); + return new DefaultAutoTuneService(server, serverConfig); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/autofetch/service/BaseAutoTuneService.java b/src/main/java/com/avaje/ebeaninternal/server/autofetch/service/DefaultAutoTuneService.java similarity index 97% rename from src/main/java/com/avaje/ebeaninternal/server/autofetch/service/BaseAutoTuneService.java rename to src/main/java/com/avaje/ebeaninternal/server/autofetch/service/DefaultAutoTuneService.java index 5dc886cfe..3a22f1d57 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/autofetch/service/BaseAutoTuneService.java +++ b/src/main/java/com/avaje/ebeaninternal/server/autofetch/service/DefaultAutoTuneService.java @@ -23,9 +23,9 @@ import java.util.List; /** * Implementation of the AutoTuneService which is comprised of profiling and query tuning. */ -public class BaseAutoTuneService implements AutoTuneService { +public class DefaultAutoTuneService implements AutoTuneService { - private static final Logger logger = LoggerFactory.getLogger(BaseAutoTuneService.class); + private static final Logger logger = LoggerFactory.getLogger(DefaultAutoTuneService.class); private final long defaultGarbageCollectionWait; @@ -35,7 +35,7 @@ public class BaseAutoTuneService implements AutoTuneService { private final ProfileManager profileManager; - public BaseAutoTuneService(SpiEbeanServer server, ServerConfig serverConfig) { + public DefaultAutoTuneService(SpiEbeanServer server, ServerConfig serverConfig) { AutofetchConfig config = serverConfig.getAutofetchConfig(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java index 62c1e2470..9f77e4029 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java @@ -15,9 +15,9 @@ import com.avaje.ebeaninternal.api.SpiBackgroundExecutor; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.server.autofetch.AutoTuneService; import com.avaje.ebeaninternal.server.autofetch.service.AutoTuneServiceFactory; +import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogListener; import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogPrepare; import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogRegister; -import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogListener; import com.avaje.ebeaninternal.server.cluster.ClusterManager; import com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager; import com.avaje.ebeaninternal.server.deploy.DeployOrmXml; @@ -32,8 +32,6 @@ import com.avaje.ebeaninternal.server.persist.DefaultPersister; import com.avaje.ebeaninternal.server.query.CQueryEngine; import com.avaje.ebeaninternal.server.query.DefaultOrmQueryEngine; import com.avaje.ebeaninternal.server.query.DefaultRelationalQueryEngine; -import com.avaje.ebeaninternal.server.resource.ResourceManager; -import com.avaje.ebeaninternal.server.resource.ResourceManagerFactory; import com.avaje.ebeaninternal.server.text.json.DJsonContext; import com.avaje.ebeaninternal.server.transaction.AutoCommitTransactionManager; import com.avaje.ebeaninternal.server.transaction.DefaultTransactionScopeManager; @@ -68,8 +66,6 @@ public class InternalConfiguration { private final DeployInherit deployInherit; - private final ResourceManager resourceManager; - private final DeployOrmXml deployOrmXml; private final TypeManager typeManager; @@ -120,8 +116,7 @@ public class InternalConfiguration { this.typeManager = new DefaultTypeManager(serverConfig, bootupClasses); - this.resourceManager = ResourceManagerFactory.createResourceManager(serverConfig); - this.deployOrmXml = new DeployOrmXml(resourceManager.getResourceSource()); + this.deployOrmXml = new DeployOrmXml(); this.deployInherit = new DeployInherit(bootupClasses); this.deployCreateProperties = new DeployCreateProperties(typeManager); @@ -288,10 +283,6 @@ public class InternalConfiguration { return deployInherit; } - public ResourceManager getResourceManager() { - return resourceManager; - } - public DeployOrmXml getDeployOrmXml() { return deployOrmXml; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployOrmXml.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployOrmXml.java index 833d1a5cc..fedc80baf 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployOrmXml.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployOrmXml.java @@ -1,18 +1,16 @@ package com.avaje.ebeaninternal.server.deploy; +import com.avaje.ebeaninternal.server.lib.util.Dnode; +import com.avaje.ebeaninternal.server.lib.util.DnodeReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import com.avaje.ebeaninternal.server.lib.resource.ResourceContent; -import com.avaje.ebeaninternal.server.lib.resource.ResourceSource; -import com.avaje.ebeaninternal.server.lib.util.Dnode; -import com.avaje.ebeaninternal.server.lib.util.DnodeReader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * Controls the creation and caching of BeanManager's, BeanDescriptors, * BeanTable etc for both beans and tables(MapBeans). @@ -27,15 +25,10 @@ public class DeployOrmXml { private final HashMap nativeQueryCache; private final ArrayList ormXmlList; - - private final ResourceSource resSource; - public DeployOrmXml(ResourceSource resSource) { - - this.resSource = resSource; + public DeployOrmXml() { this.nativeQueryCache = new HashMap(); this.ormXmlList = findAllOrmXml(); - initialiseNativeQueries(); } @@ -106,17 +99,7 @@ public class DeployOrmXml { private void readOrmXml(String ormXmlName, ArrayList ormXmlList) { try { - Dnode ormXml; - ResourceContent content = resSource.getContent(ormXmlName); - if (content != null) { - // servlet resource or file system... - ormXml = readOrmXml(content.getInputStream()); - - } else { - // try the classpath... - ormXml = readOrmXmlFromClasspath(ormXmlName); - } - + Dnode ormXml = readOrmXmlFromClasspath(ormXmlName); if (ormXml != null) { ormXml.setAttribute("ebean.filename", ormXmlName); ormXmlList.add(ormXml); diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/DirectoryFinder.java b/src/main/java/com/avaje/ebeaninternal/server/lib/resource/DirectoryFinder.java deleted file mode 100644 index 0755ba6c8..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/DirectoryFinder.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.avaje.ebeaninternal.server.lib.resource; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; - -/** - * Helper object used to find directories typically from the current working - * directory. - */ -public class DirectoryFinder { - - private static final Logger logger = LoggerFactory.getLogger(DirectoryFinder.class); - - /** - * Find a directory by search through subdirectories. - *

- * For example, used to find the WEB-INF directory starting from the current - * working directory. - *

- * - *
-	 * 
-	 * // search to a depth of 3 from the current working directory
-	 * // looking for a directory WEB-INF that contains the subdirectory
-	 * // data
-	 * 
-	 * File dir = DirectoryFinder.find(null, "WEB-INF/data", 3);
-	 * if (dir != null) {
-	 * 	//found the directory
-	 * }
-	 * 
- */ - public static File find(File startDir, String match, int maxDepth) { - - String matchSub = null; - int slashPos = match.indexOf('/'); - if (slashPos > -1) { - // match has sub directories - matchSub = match.substring(slashPos + 1); - match = match.substring(0, slashPos); - } - - // search for the directory - File found = find(startDir, match, matchSub, 0, maxDepth); - - if (found != null && matchSub != null) { - // match has sub directories - return new File(found, matchSub); - } - return found; - } - - private static File find(File dir, String match, String matchSub, int depth, int maxDepth) { - - if (dir == null) { - String curDir = System.getProperty("user.dir"); - dir = new File(curDir); - } - - if (dir.exists()) { - File[] list = dir.listFiles(); - if (list != null){ - for (int i = 0; i < list.length; i++) { - if (isMatch(list[i], match, matchSub)) { - return list[i]; - } - } - - // go through the directories again - // Aka *NOT* a depth first search - if (depth < maxDepth) { - for (int i = 0; i < list.length; i++) { - if (list[i].isDirectory()) { - File found = find(list[i], match, matchSub, depth + 1, maxDepth); - if (found != null) { - return found; - } - } - } - } - } - } - return null; - } - - private static boolean isMatch(File f, String match, String matchSub) { - if (f == null) { - return false; - } - if (!f.isDirectory()) { - return false; - } - if (!f.getName().equalsIgnoreCase(match)) { - return false; - } - if (matchSub == null) { - return true; - } - File sub = new File(f, matchSub); - if (logger.isTraceEnabled()){ - logger.trace("search; " + f.getPath()); - } - return sub.exists(); - - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/FileResourceContent.java b/src/main/java/com/avaje/ebeaninternal/server/lib/resource/FileResourceContent.java deleted file mode 100644 index b2f6cb07e..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/FileResourceContent.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.avaje.ebeaninternal.server.lib.resource; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Date; - -/** - * Content from a file system file. - */ -public class FileResourceContent implements ResourceContent { - - /** - * The underlying file. - */ - final File file; - - final String entryName; - - /** - * Create with a File and the entryName. - */ - public FileResourceContent(File file, String entryName) { - this.file = file; - this.entryName = entryName; - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("[").append(getName()); - sb.append("] size[").append(size()); - sb.append("] lastModified[").append(new Date(lastModified())); - sb.append("]"); - return sb.toString(); - } - - /** - * Returns the entry name which contains the path from the base directory. - *

- * This does not return the full path of the file, but the path relative to - * the FileIoSource directory. - *

- */ - public String getName() { - return entryName; - } - - /** - * Return the time the file was last modified. - */ - public long lastModified() { - return file.lastModified(); - } - - /** - * Return the size of the file. - */ - public long size() { - return file.length(); - } - - /** - * Return the input stream for this file. - */ - public InputStream getInputStream() throws IOException { - - return new FileInputStream(file); - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/FileResourceSource.java b/src/main/java/com/avaje/ebeaninternal/server/lib/resource/FileResourceSource.java deleted file mode 100644 index 496660c1e..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/FileResourceSource.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.avaje.ebeaninternal.server.lib.resource; - -import java.io.File; - -/** - * A file system directory represented as a FileSource. - */ -public class FileResourceSource implements ResourceSource { - - /** - * The directory name. - */ - final String directory; - - final String baseDir; - - /** - * Create the source based on a directory name. - */ - public FileResourceSource(String directory) { - this.directory = directory; - this.baseDir = directory + File.separator; - } - - /** - * Create the source based on a directory file. - */ - public FileResourceSource(File dir) { - this(dir.getPath()); - } - - - public String getRealPath() { - return directory; - } - - /** - * Search for the given file and return as IoContent. - */ - public ResourceContent getContent(String entry) { - - String fullPath = baseDir + entry; - - File f = new File(fullPath); - if (f.exists()) { - return new FileResourceContent(f, entry); - } - return null; - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/ResourceContent.java b/src/main/java/com/avaje/ebeaninternal/server/lib/resource/ResourceContent.java deleted file mode 100644 index 6aab953c7..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/ResourceContent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.avaje.ebeaninternal.server.lib.resource; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Represents content that can be read via the ResourceManager. - *

- * Typically either content from a File or a URL. - *

- */ -public interface ResourceContent { - - /** - * The name of the content. - */ - String getName(); - - /** - * The size of the content in bytes. - */ - long size(); - - /** - * The last modified timestamp of the content. - */ - long lastModified(); - - /** - * The content itself. - */ - InputStream getInputStream() throws IOException; - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/ResourceSource.java b/src/main/java/com/avaje/ebeaninternal/server/lib/resource/ResourceSource.java deleted file mode 100644 index 1be9338bb..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/ResourceSource.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.avaje.ebeaninternal.server.lib.resource; - -/** - * A Source for ResourceManager. - *

- * Typically a File System Directory based source or a ServletContext URL - * resource based source (for Servlet WAR files). - *

- */ -public interface ResourceSource { - - /** - * Return the File System path of the root of the ResourceSource. - *

- * This will return null IF the ResourceSource is an unpacked WAR file. - *

- */ - String getRealPath(); - - /** - * Find the content with a given entry name. This will return null if no - * matching content was found. - */ - ResourceContent getContent(String entry); - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/package.html b/src/main/java/com/avaje/ebeaninternal/server/lib/resource/package.html deleted file mode 100644 index 9ca4bbdba..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/resource/package.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - AvajeLib - - -Service for reading content from either the file system or servlet context. -

-A service used to read deployment content such as xml files, images etc -taking into account the environment (servlet war file or file system). -

- - \ No newline at end of file diff --git a/src/main/java/com/avaje/ebeaninternal/server/resource/ResourceManager.java b/src/main/java/com/avaje/ebeaninternal/server/resource/ResourceManager.java deleted file mode 100644 index 087e1d2cd..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/resource/ResourceManager.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.avaje.ebeaninternal.server.resource; - -import java.io.File; - -import com.avaje.ebeaninternal.server.lib.resource.ResourceSource; - -/** - * The ResourceManager implementation. - */ -public class ResourceManager { - - final ResourceSource resourceSource; - - final File autofetchDir; - - public ResourceManager(ResourceSource resourceSource, File autofetchDir) { - this.resourceSource = resourceSource; - this.autofetchDir = autofetchDir; - } - - public ResourceSource getResourceSource() { - return resourceSource; - } - - public File getAutofetchDirectory() { - return autofetchDir; - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/resource/ResourceManagerFactory.java b/src/main/java/com/avaje/ebeaninternal/server/resource/ResourceManagerFactory.java deleted file mode 100644 index a32fd5625..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/resource/ResourceManagerFactory.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.avaje.ebeaninternal.server.resource; - -import com.avaje.ebean.config.ServerConfig; -import com.avaje.ebeaninternal.server.lib.resource.DirectoryFinder; -import com.avaje.ebeaninternal.server.lib.resource.FileResourceSource; -import com.avaje.ebeaninternal.server.lib.resource.ResourceSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; - -/** - * Creates a ResourceManager for a server depending on the avaje.properties. - *

- * This can use URL based resource loading for web applications or file based - * otherwise. - *

- */ -public class ResourceManagerFactory { - - private static final Logger logger = LoggerFactory.getLogger(ResourceManagerFactory.class); - - /** - * Construct with the properties for a server. - */ - public ResourceManagerFactory() { - } - - /** - * Create the resource manager given the properties for this server. - */ - public static ResourceManager createResourceManager(ServerConfig serverConfig) { - - ResourceSource resourceSource = createResourceSource(serverConfig); - File autofetchDir = getAutofetchDir(serverConfig, resourceSource); - - return new ResourceManager(resourceSource, autofetchDir); - } - - - /** - * Return the directory that autofetch file goes into. - */ - protected static File getAutofetchDir(ServerConfig serverConfig, ResourceSource resourceSource) { - - String dir = null; - if (serverConfig.getAutofetchConfig() != null) { - dir = serverConfig.getAutofetchConfig().getLogDirectory(); - } - if (dir != null) { - return new File(dir); - } - - String realPath = resourceSource.getRealPath(); - if (realPath != null) { - return new File(realPath); - - } else { - throw new RuntimeException("No autofetch directory set?"); - } - } - - /** - * Return the resource loader for external sql files. - *

- * This can be url based (for webapps) or otherwise file based. - *

- */ - protected static ResourceSource createResourceSource(ServerConfig serverConfig) { - - // default for web application, override this for file system - String defaultDir = serverConfig.getResourceDirectory(); - - // use File System directory - return createFileSource(defaultDir); - } - - private static ResourceSource createFileSource(String fileDir) { - - if (fileDir != null) { - // explicitly stated so - File dir = new File(fileDir); - if (dir.exists()) { - logger.info("ResourceManager initialised: type[file] [" + fileDir + "]"); - return new FileResourceSource(fileDir); - } else { - String msg = "ResourceManager could not find directory [" + fileDir + "]"; - throw new IllegalArgumentException(msg); - } - } - - // try to guess the directory starting from the current working - // directory, and searching to a maximum depth of 3 subdirectories - File guessDir = DirectoryFinder.find(null, "WEB-INF", 3); - if (guessDir != null) { - // Typically this means we found the WEB-INF directory below the - // current working directory - logger.info("ResourceManager initialised: type[file] [" + guessDir.getPath() + "]"); - return new FileResourceSource(guessDir.getPath()); - } - - // default to the current working directory - File workingDir = new File("."); - return new FileResourceSource(workingDir); - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/resource/package.html b/src/main/java/com/avaje/ebeaninternal/server/resource/package.html deleted file mode 100644 index abed4e076..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/resource/package.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - Resource Management - - -Resource Management - - - \ No newline at end of file diff --git a/src/test/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetailTest.java b/src/test/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetailTest.java index 4a6a18ec6..3fa127b73 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetailTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetailTest.java @@ -10,10 +10,10 @@ public class OrmQueryDetailTest { @Test public void test_isAutoTuneEqual() { - OrmQueryDetailParser parser1 = new OrmQueryDetailParser("select order (id,name) fetch customer (name) fetch details (code)"); + OrmQueryDetailParser parser1 = new OrmQueryDetailParser("select (id,name) fetch customer (name) fetch details (code)"); OrmQueryDetail detail1 = parser1.parse(); - OrmQueryDetailParser parser2 = new OrmQueryDetailParser("select order (id,name) fetch details (code) fetch customer (name)"); + OrmQueryDetailParser parser2 = new OrmQueryDetailParser("select (id,name) fetch details (code) fetch customer (name)"); OrmQueryDetail detail2 = parser2.parse(); assertTrue(detail1.isAutoTuneEqual(detail2));