Liran Zelkha has uploaded a new change for review. Change subject: core: Improve audit_log seach query ......................................................................
core: Improve audit_log seach query This patch improves the performance of the SearchQuery mechanism for the audit_log table. Change-Id: I396a90d63a10fc049a37e4792d3e558ff2a7fea3 Bug-Url: https://bugzilla.redhat.com/1056064 Signed-off-by: lzel...@redhat.com <lzel...@redhat.com> --- M backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java M backend/manager/modules/searchbackend/src/test/java/org/ovirt/engine/core/searchbackend/SyntaxCheckerTest.java 2 files changed, 46 insertions(+), 2 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/24048/1 diff --git a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java index 561bbbd..f0e77f7 100644 --- a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java +++ b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java @@ -889,6 +889,9 @@ sortExpr.append(mSearchObjectAC.getDefaultSort(searchObjStr)); } + // TODO: The database configuration PostgresSearchTemplate has an extra closing braces. Hence our + // queries in this code have an extra opening one. Fix it in a future patch. + // only audit log search supports the SearchFrom which enables getting records starting from a certain // audit_log_id, this is done to make search queries from the client more efficient and eliminate the client // from registering to such queries and comparing last data with previous. @@ -899,14 +902,19 @@ .format("SELECT * FROM %1$s WHERE ( %2$s > %3$s and not deleted", tableNameWithOutTags, primeryKey, syntax.getSearchFrom()); + } else if (whereBuilder.size() == 1 && wherePhrase.toString().contains("severity")) { + inQuery = + StringFormat.format("SELECT %1$s.* FROM %2$s %3$s and (not deleted", + tableName, + fromStatement, + wherePhrase); } else { inQuery = StringFormat .format("SELECT * FROM %1$s WHERE ( %2$s > %3$s and %2$s IN (%4$s) and not deleted", tableNameWithOutTags, primeryKey, syntax.getSearchFrom(), innerQuery); } - } - else if (primeryKey.equals("vmt_guid") && wherePhrase.length() > 0 + } else if (primeryKey.equals("vmt_guid") && wherePhrase.length() > 0 && wherePhrase.toString().contains("storage_pool_name") && whereBuilder.size() == 1) { inQuery = StringFormat .format("(SELECT * FROM %1$s %2$s", diff --git a/backend/manager/modules/searchbackend/src/test/java/org/ovirt/engine/core/searchbackend/SyntaxCheckerTest.java b/backend/manager/modules/searchbackend/src/test/java/org/ovirt/engine/core/searchbackend/SyntaxCheckerTest.java index 312566d..aecc0ad 100644 --- a/backend/manager/modules/searchbackend/src/test/java/org/ovirt/engine/core/searchbackend/SyntaxCheckerTest.java +++ b/backend/manager/modules/searchbackend/src/test/java/org/ovirt/engine/core/searchbackend/SyntaxCheckerTest.java @@ -4,9 +4,16 @@ import java.util.Arrays; +import junit.framework.Assert; + +import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.mockito.Mockito; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigCommon; import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.common.config.IConfigUtilsInterface; import org.ovirt.engine.core.utils.MockConfigRule; public class SyntaxCheckerTest { @@ -16,6 +23,21 @@ public boolean contains(SyntaxContainer res, String item) { return Arrays.asList(res.getCompletionArray()).contains(item); + } + + @Before + public void setup() { + final IConfigUtilsInterface configUtils = Mockito.mock(IConfigUtilsInterface.class); + Mockito.when(configUtils.getValue(ConfigValues.SearchResultsLimit, ConfigCommon.defaultConfigurationVersion)) + .thenReturn(100); + Mockito.when(configUtils.getValue(ConfigValues.DBPagingType, ConfigCommon.defaultConfigurationVersion)) + .thenReturn("Range"); + Mockito.when(configUtils.getValue(ConfigValues.DBSearchTemplate, ConfigCommon.defaultConfigurationVersion)) + .thenReturn("SELECT * FROM (%2$s) %1$s) as T1 %3$s"); + Mockito.when(configUtils.getValue(ConfigValues.DBPagingSyntax, ConfigCommon.defaultConfigurationVersion)) + .thenReturn("OFFSET (%1$s -1) LIMIT %2$s"); + + Config.setConfigUtils(configUtils); } /** @@ -41,6 +63,7 @@ * Test the following where each word should be the completion for the earlier portion Host : sortby migrating_vms * asc */ + @Test public void testHostCompletion() { SyntaxChecker chkr = new SyntaxChecker(20); SyntaxContainer res = null; @@ -75,4 +98,17 @@ // check valid config values assertTrue(chkr.getPagePhrase(res, "1") != ""); } + + @Test + public void testAlerts() { + SyntaxChecker chkr = new SyntaxChecker(100); + + ISyntaxChecker curSyntaxChecker = SyntaxCheckerFactory.createBackendSyntaxChecker("foo"); + + SyntaxContainer res = curSyntaxChecker.analyzeSyntaxState("Events: severity=error", true); + String query = chkr.generateQueryFromSyntaxContainer(res, true); + Assert.assertEquals("SELECT * FROM (SELECT audit_log.* FROM audit_log WHERE audit_log.severity = '2' and (not deleted) ORDER BY audit_log_id DESC ) as T1 OFFSET (1 -1) LIMIT 0", + query); + } + } -- To view, visit http://gerrit.ovirt.org/24048 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I396a90d63a10fc049a37e4792d3e558ff2a7fea3 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Liran Zelkha <lzel...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches