You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ng...@apache.org on 2020/04/24 07:36:05 UTC
svn commit: r1876917 - in /jackrabbit/oak/trunk/oak-search-elastic/src:
main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/
test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/
Author: ngupta
Date: Fri Apr 24 07:36:04 2020
New Revision: 1876917
URL: http://svn.apache.org/viewvc?rev=1876917&view=rev
Log:
OAK-9014 | Refactor Oak-Search-Elastic tests to make them more modularized
Added:
jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java (with props)
jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java (with props)
jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java (with props)
Modified:
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java
jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java
jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java
Modified: jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java?rev=1876917&r1=1876916&r2=1876917&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java Fri Apr 24 07:36:04 2020
@@ -230,7 +230,7 @@ public class ElasticsearchConnection imp
}
@Override
- public BuildStep withApiKeys(@NotNull String id, @NotNull String secret) {
+ public BuildStep withApiKeys(String id, String secret) {
this.apiKeyId = id;
this.apiKeySecret = secret;
return this;
Modified: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java?rev=1876917&r1=1876916&r2=1876917&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java Fri Apr 24 07:36:04 2020
@@ -67,49 +67,21 @@ import static org.apache.jackrabbit.JcrC
import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
import static org.apache.jackrabbit.JcrConstants.NT_FILE;
import static org.apache.jackrabbit.oak.api.Type.NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
import static org.apache.jackrabbit.oak.plugins.memory.BinaryPropertyState.binaryProperty;
import static org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeNotNull;
-public class ElasticIndexAggregationNtFileTest extends AbstractQueryTest {
- private static final Logger LOG = LoggerFactory.getLogger(ElasticIndexAggregationNtFileTest.class);
+public class ElasticIndexAggregationNtFileTest extends ElasticsearchAbstractQueryTest {
private static final String NT_TEST_ASSET = "test:Asset";
- @Rule
- public final ElasticsearchContainer elastic =
- new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:" + Version.CURRENT);
-
- @BeforeClass
- public static void beforeMethod() {
- DockerClient client = null;
- try {
- client = DockerClientFactory.instance().client();
- } catch (Exception e) {
- LOG.warn("Docker is not available, ElasticsearchPropertyIndexTest will be skipped");
- }
- assumeNotNull(client);
- }
-
@Override
- protected ContentRepository createRepository() {
- ElasticsearchConnection connection = ElasticsearchConnection.newBuilder()
- .withIndexPrefix("" + System.nanoTime())
- .withConnectionParameters(
- ElasticsearchConnection.DEFAULT_SCHEME,
- elastic.getContainerIpAddress(),
- elastic.getMappedPort(ElasticsearchConnection.DEFAULT_PORT)
- ).build();
-
- ElasticsearchIndexEditorProvider editorProvider = new ElasticsearchIndexEditorProvider(connection,
- new ExtractedTextCache(10 * FileUtils.ONE_MB, 100));
- ElasticsearchIndexProvider provider = new ElasticsearchIndexProvider(connection);
-
- return new Oak()
- .with(new InitialContent() {
+ protected InitialContent getInitialContent() {
+ return new InitialContent() {
- @Override
- public void initialize(@NotNull NodeBuilder builder) {
+ @Override
+ public void initialize(@NotNull NodeBuilder builder) {
super.initialize(builder);
// registering additional node types for wider testing
InputStream stream = null;
@@ -137,14 +109,10 @@ public class ElasticIndexAggregationNtFi
LOG.debug("Ignoring exception on stream closing.", e);
}
}
- }
- }
+ }
+ }
- })
- .with(new OpenSecurityProvider())
- .with(editorProvider)
- .with(provider)
- .createContentRepository();
+ };
}
/**
@@ -195,7 +163,11 @@ public class ElasticIndexAggregationNtFi
"the quick brown fox jumps over the lazy dog."));
root.commit();
expected.add("/content/asset");
- Thread.sleep(5000);
- assertQuery(statement, "xpath", expected);
+
+ assertEventually(()-> {
+ assertQuery(statement, "xpath", expected);
+ });
+
+
}
}
Added: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java?rev=1876917&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java (added)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java Fri Apr 24 07:36:04 2020
@@ -0,0 +1,209 @@
+/*
+ * 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.jackrabbit.oak.plugins.index.elasticsearch;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.oak.InitialContent;
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.api.ContentRepository;
+import org.apache.jackrabbit.oak.commons.PerfLogger;
+import org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate;
+import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.TrackingCorruptIndexHandler;
+import org.apache.jackrabbit.oak.plugins.index.counter.NodeCounterEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.elasticsearch.index.ElasticsearchIndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.elasticsearch.query.ElasticsearchIndexProvider;
+import org.apache.jackrabbit.oak.plugins.index.elasticsearch.util.ElasticsearchIndexDefinitionBuilder;
+import org.apache.jackrabbit.oak.plugins.index.nodetype.NodeTypeIndexProvider;
+import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.search.ExtractedTextCache;
+import org.apache.jackrabbit.oak.plugins.index.search.util.IndexDefinitionBuilder;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
+import org.apache.jackrabbit.oak.query.AbstractQueryTest;
+import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.jetbrains.annotations.NotNull;
+import org.junit.After;
+import org.junit.ClassRule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static org.apache.jackrabbit.oak.plugins.index.CompositeIndexEditorProvider.compose;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.elasticsearch.ElasticsearchIndexDefinition.BULK_FLUSH_INTERVAL_MS_DEFAULT;
+
+public abstract class ElasticsearchAbstractQueryTest extends AbstractQueryTest {
+
+ protected static final Logger LOG = LoggerFactory.getLogger(ElasticsearchAbstractQueryTest.class);
+
+ protected static final PerfLogger PERF_LOGGER =
+ new PerfLogger(LoggerFactory.getLogger(ElasticsearchAbstractQueryTest.class.getName() + ".perf"));
+
+
+ // Set this connection string as
+ // <scheme>://<hostname>:<port>?key_id=<>,key_secret=<>
+ // key_id and key_secret are optional in case the ES server
+ // needs authentication
+ // Do not set this if docker is running and you want to run the tests on docker instead.
+ private static final String elasticConnectionString = System.getProperty("elasticConnectionString");
+ private ElasticsearchConnection esConnection;
+
+ // This is instantiated during repo creation but not hooked up to the async indexing lane
+ // This can be used by the extending classes to trigger the async index update as per need (not having to wait for async indexing cycle)
+ protected AsyncIndexUpdate asyncIndexUpdate;
+ protected long INDEX_CORRUPT_INTERVAL_IN_MILLIS = 100;
+ protected ElasticsearchIndexEditorProvider editorProvider;
+ protected NodeStore nodeStore;
+ protected int DEFAULT_ASYNC_INDEXING_TIME_IN_SECONDS = 5;
+
+
+ @ClassRule
+ public static ElasticsearchConnectionRule elasticRule = new ElasticsearchConnectionRule(elasticConnectionString);
+
+ /*
+ Close the ES connection after every test method execution
+ */
+ @After
+ public void cleanup() throws IOException {
+ elasticRule.closeElasticSearchConnection();
+ }
+
+ // Override this in extending test class to provide different ExtractedTextCache if needed
+ protected ElasticsearchIndexEditorProvider getElasticIndexEditorProvider(ElasticsearchConnection esConnection) {
+ return new ElasticsearchIndexEditorProvider(esConnection,
+ new ExtractedTextCache(10 * FileUtils.ONE_MB, 100));
+ }
+
+ protected AsyncIndexUpdate getAsyncIndexUpdate(String asyncName, NodeStore store, IndexEditorProvider editorProvider) {
+ return new AsyncIndexUpdate(asyncName, store, editorProvider);
+ }
+
+ /*
+ Override this to create some other repo initializer if needed
+ // Make sure to call super.initialize(builder)
+ */
+ protected InitialContent getInitialContent() {
+ return new InitialContent() {
+ @Override
+ public void initialize(@NotNull NodeBuilder builder) {
+ super.initialize(builder);
+ // remove all indexes to avoid cost competition (essentially a TODO for fixing cost ES cost estimation)
+ NodeBuilder oiBuilder = builder.child(INDEX_DEFINITIONS_NAME);
+ oiBuilder.getChildNodeNames().forEach(idxName -> oiBuilder.child(idxName).remove());
+ }
+ };
+ }
+
+ // Override this to provide a different flavour of node store
+ // like segment or mongo mk
+ // Tests would need to handle the cleanup accordingly.
+ // TODO provide a util here so that test classes simply need to mention the type of store they want to create
+ // for now, memory store should suffice.
+ protected NodeStore getNodeStore() {
+ if (nodeStore == null) {
+ nodeStore = new MemoryNodeStore();
+ }
+ return nodeStore;
+ }
+
+ protected boolean useAsyncIndexing() {
+ return false;
+ }
+
+ protected Oak addAsyncIndexingLanesToOak(Oak oak) {
+ // Override this in extending clases to configure different
+ // indexing lanes with different time limits.
+ return oak.withAsyncIndexing("async", DEFAULT_ASYNC_INDEXING_TIME_IN_SECONDS);
+ }
+
+
+ @Override
+ protected ContentRepository createRepository() {
+
+ esConnection = elasticRule.useDocker() ? elasticRule.getElasticSearchConnectionForDocker() :
+ elasticRule.getElasticsearchConnectionFromString();
+ ElasticsearchIndexEditorProvider editorProvider = getElasticIndexEditorProvider(esConnection);
+ ElasticsearchIndexProvider indexProvider = new ElasticsearchIndexProvider(esConnection);
+
+ nodeStore = getNodeStore();
+
+ asyncIndexUpdate = getAsyncIndexUpdate("async", nodeStore, compose(newArrayList(
+ editorProvider,
+ new NodeCounterEditorProvider()
+ )));
+
+ TrackingCorruptIndexHandler trackingCorruptIndexHandler = new TrackingCorruptIndexHandler();
+ trackingCorruptIndexHandler.setCorruptInterval(INDEX_CORRUPT_INTERVAL_IN_MILLIS, TimeUnit.MILLISECONDS);
+ asyncIndexUpdate.setCorruptIndexHandler(trackingCorruptIndexHandler);
+
+
+ Oak oak = new Oak(nodeStore)
+ .with(getInitialContent())
+ .with(new OpenSecurityProvider())
+ .with(editorProvider)
+ .with(indexProvider)
+ .with(new PropertyIndexEditorProvider())
+ .with(new NodeTypeIndexProvider());
+
+ if (useAsyncIndexing()) {
+ oak = addAsyncIndexingLanesToOak(oak);
+ }
+ return oak.createContentRepository();
+ }
+
+
+ protected static void assertEventually(Runnable r) {
+ ElasticsearchTestUtils.assertEventually(r, BULK_FLUSH_INTERVAL_MS_DEFAULT * 5);
+ }
+
+ protected IndexDefinitionBuilder createIndex(String... propNames) {
+ IndexDefinitionBuilder builder = new ElasticsearchIndexDefinitionBuilder();
+ if (!useAsyncIndexing()) {
+ builder = builder.noAsync();
+ }
+ IndexDefinitionBuilder.IndexRule indexRule = builder.indexRule("nt:base");
+ for (String propName : propNames) {
+ indexRule.property(propName).propertyIndex();
+ }
+ return builder;
+ }
+
+ protected void setIndex(String idxName, IndexDefinitionBuilder builder) {
+ builder.build(root.getTree("/").addChild(INDEX_DEFINITIONS_NAME).addChild(idxName));
+ }
+
+ protected String explain(String query) {
+ return explain(query, SQL2);
+ }
+
+ protected String explain(String query, String language) {
+ String explain = "explain " + query;
+ return executeQuery(explain, language).get(0);
+ }
+
+ @Override
+ protected void createTestIndexNode() throws Exception {
+ setTraversalEnabled(false);
+ }
+
+}
Propchange: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java?rev=1876917&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java (added)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java Fri Apr 24 07:36:04 2020
@@ -0,0 +1,153 @@
+/*
+ * 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.jackrabbit.oak.plugins.index.elasticsearch;
+
+
+import com.github.dockerjava.api.DockerClient;
+import org.elasticsearch.Version;
+import org.junit.rules.ExternalResource;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.DockerClientFactory;
+import org.testcontainers.elasticsearch.ElasticsearchContainer;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import static org.junit.Assume.assumeNotNull;
+
+/*
+To be used as a @ClassRule
+ */
+public class ElasticsearchConnectionRule extends ExternalResource {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ElasticsearchConnectionRule.class);
+ private ElasticsearchConnection elasticSearchConnection;
+ private final String elasticSearchConnectionString;
+ private static final String INDEX_PREFIX = "ElasticTest_";
+ private static boolean useDocker = false;
+
+ public ElasticsearchConnectionRule(String elasticSearchConnectionString) {
+ this.elasticSearchConnectionString = elasticSearchConnectionString;
+ }
+
+ public ElasticsearchContainer elastic;
+
+ /*
+ Executed once in the test class' execution lifecycle, after the execution of apply()
+ */
+ @Override
+ protected void before() {
+ if (useDocker()) {
+ elasticSearchConnection = getElasticSearchConnectionForDocker();
+ }
+ }
+
+ /*
+ This is the first method to be executed. It gets executed exactly once at the beginning of the test class execution.
+ */
+ @Override
+ public Statement apply(Statement base, Description description) {
+ Statement s = super.apply(base, description);
+ // see if docker is to be used or not... initialize docker rule only if that's the case.
+
+ if (elasticSearchConnectionString == null || getElasticsearchConnectionFromString() == null) {
+ checkIfDockerClientAvailable();
+ elastic = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:" + Version.CURRENT);
+ s = elastic.apply(s, description);
+ setUseDocker(true);
+ }
+ return s;
+ }
+
+ @Override
+ protected void after() {
+ //TODO: See if something needs to be cleaned up at test class level ??
+ }
+
+ public ElasticsearchConnection getElasticsearchConnectionFromString() {
+ if (elasticSearchConnection == null) {
+ try {
+ URI uri = new URI(elasticSearchConnectionString);
+ String host = uri.getHost();
+ String scheme = uri.getScheme();
+ int port = uri.getPort();
+ String query = uri.getQuery();
+
+ String api_key = null;
+ String api_secret = null;
+ if (query != null) {
+ api_key = query.split(",")[0].split("=")[1];
+ api_secret = query.split(",")[1].split("=")[1];
+ }
+ elasticSearchConnection = ElasticsearchConnection.newBuilder()
+ .withIndexPrefix(INDEX_PREFIX + System.currentTimeMillis())
+ .withConnectionParameters(scheme, host, port)
+ .withApiKeys(api_key, api_secret)
+ .build();
+ } catch (URISyntaxException e) {
+ return null;
+ }
+ }
+ return elasticSearchConnection;
+ }
+
+ public ElasticsearchConnection getElasticSearchConnectionForDocker() {
+ if (elasticSearchConnection == null) {
+ elasticSearchConnection = ElasticsearchConnection.newBuilder()
+ .withIndexPrefix(INDEX_PREFIX + System.currentTimeMillis())
+ .withConnectionParameters(ElasticsearchConnection.DEFAULT_SCHEME,
+ elastic.getContainerIpAddress(),
+ elastic.getMappedPort(ElasticsearchConnection.DEFAULT_PORT))
+ .withApiKeys(null, null)
+ .build();
+ }
+ return elasticSearchConnection;
+ }
+
+ public void closeElasticSearchConnection() throws IOException {
+ if (elasticSearchConnection != null) {
+ elasticSearchConnection.close();
+ // Make this object null otherwise tests after the first test would
+ // receive an client that is closed.
+ elasticSearchConnection = null;
+ }
+ }
+
+
+ private void checkIfDockerClientAvailable() {
+ DockerClient client = null;
+ try {
+ client = DockerClientFactory.instance().client();
+ } catch (Exception e) {
+ LOG.warn("Docker is not available and elasticConnectionDetails sys prop not specified or incorrect" +
+ ", Elastic tests will be skipped");
+ }
+ assumeNotNull(client);
+ }
+
+ private void setUseDocker(boolean useDocker) {
+ this.useDocker = useDocker;
+ }
+
+ public boolean useDocker() {
+ return useDocker;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java?rev=1876917&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java (added)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java Fri Apr 24 07:36:04 2020
@@ -0,0 +1,68 @@
+/*
+ * 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.jackrabbit.oak.plugins.index.elasticsearch;
+
+
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.plugins.index.search.util.IndexDefinitionBuilder;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ElasticsearchFullTextAsyncTest extends ElasticsearchAbstractQueryTest {
+
+ @Override
+ protected boolean useAsyncIndexing() {
+ return true;
+ }
+
+ @Test
+ public void testFullTextQuery() throws Exception {
+ IndexDefinitionBuilder builder = createIndex("propa");
+ builder.async("async");
+ builder.indexRule("nt:base").property("propa").analyzed();
+
+ setIndex("test1", builder);
+ root.commit();
+
+ //add content
+ Tree test = root.getTree("/").addChild("test");
+
+ test.addChild("a").setProperty("propa", "Hello World!");
+ test.addChild("c").setProperty("propa", "Hello everyone. This is an elastic test");
+ test.addChild("b").setProperty("propa", "Simple test");
+ root.commit();
+ // Wait for DEFAULT_ASYNC_INDEXING_TIME_IN_SECONDS
+ // This is needed in addition to assertEventually to make the
+ // test reliable, otherwise they seem to fail sometimes even
+ // with assertEventually wait in place, due to minor delay in async
+ // cycle exec.
+ Thread.sleep(DEFAULT_ASYNC_INDEXING_TIME_IN_SECONDS * 1000);
+
+ String query = "//*[jcr:contains(@propa, 'Hello')] ";
+
+ assertEventually(() -> {
+ assertThat(explain(query, XPATH), containsString("elasticsearch:test1"));
+ assertQuery(query, XPATH, Arrays.asList("/test/a", "/test/c"));
+ });
+
+ }
+
+}
Propchange: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java?rev=1876917&r1=1876916&r2=1876917&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java Fri Apr 24 07:36:04 2020
@@ -16,95 +16,20 @@
*/
package org.apache.jackrabbit.oak.plugins.index.elasticsearch;
-import com.github.dockerjava.api.DockerClient;
-import org.apache.commons.io.FileUtils;
-import org.apache.jackrabbit.oak.InitialContentHelper;
-import org.apache.jackrabbit.oak.Oak;
-import org.apache.jackrabbit.oak.api.ContentRepository;
import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.plugins.index.elasticsearch.index.ElasticsearchIndexEditorProvider;
-import org.apache.jackrabbit.oak.plugins.index.elasticsearch.query.ElasticsearchIndexProvider;
-import org.apache.jackrabbit.oak.plugins.index.elasticsearch.util.ElasticsearchIndexDefinitionBuilder;
-import org.apache.jackrabbit.oak.plugins.index.nodetype.NodeTypeIndexProvider;
-import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
-import org.apache.jackrabbit.oak.plugins.index.search.ExtractedTextCache;
import org.apache.jackrabbit.oak.plugins.index.search.util.IndexDefinitionBuilder;
-import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
-import org.apache.jackrabbit.oak.query.AbstractQueryTest;
-import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
-import org.elasticsearch.Version;
-import org.junit.BeforeClass;
-import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.elasticsearch.ElasticsearchContainer;
import java.util.Arrays;
import static java.util.Collections.singletonList;
-import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
-import static org.apache.jackrabbit.oak.plugins.index.elasticsearch.ElasticsearchIndexDefinition.BULK_FLUSH_INTERVAL_MS_DEFAULT;
import static org.apache.jackrabbit.oak.plugins.index.search.FulltextIndexConstants.PROPDEF_PROP_NODE_NAME;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assume.assumeNotNull;
-public class ElasticsearchPropertyIndexTest extends AbstractQueryTest {
-
- private static final Logger LOG = LoggerFactory.getLogger(ElasticsearchPropertyIndexTest.class);
-
- @Rule
- public final ElasticsearchContainer elastic =
- new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:" + Version.CURRENT);
-
- @BeforeClass
- public static void beforeMethod() {
- DockerClient client = null;
- try {
- client = DockerClientFactory.instance().client();
- } catch (Exception e) {
- LOG.warn("Docker is not available, ElasticsearchPropertyIndexTest will be skipped");
- }
- assumeNotNull(client);
- }
-
- @Override
- protected ContentRepository createRepository() {
- ElasticsearchConnection connection = ElasticsearchConnection.newBuilder()
- .withIndexPrefix("" + System.nanoTime())
- .withConnectionParameters(
- ElasticsearchConnection.DEFAULT_SCHEME,
- elastic.getContainerIpAddress(),
- elastic.getMappedPort(ElasticsearchConnection.DEFAULT_PORT)
- ).build();
- ElasticsearchIndexEditorProvider editorProvider = new ElasticsearchIndexEditorProvider(connection,
- new ExtractedTextCache(10 * FileUtils.ONE_MB, 100));
- ElasticsearchIndexProvider indexProvider = new ElasticsearchIndexProvider(connection);
-
- // remove all indexes to avoid cost competition (essentially a TODO for fixing cost ES cost estimation)
- NodeBuilder builder = InitialContentHelper.INITIAL_CONTENT.builder();
- NodeBuilder oiBuilder = builder.child(INDEX_DEFINITIONS_NAME);
- oiBuilder.getChildNodeNames().forEach(idxName -> oiBuilder.child(idxName).remove());
-
- NodeStore nodeStore = new MemoryNodeStore(builder.getNodeState());
-
- return new Oak(nodeStore)
- .with(new OpenSecurityProvider())
- .with(editorProvider)
- .with(indexProvider)
- .with(new PropertyIndexEditorProvider())
- .with(new NodeTypeIndexProvider())
- .createContentRepository();
- }
-
- @Override
- protected void createTestIndexNode() {
- setTraversalEnabled(false);
- }
+public class ElasticsearchPropertyIndexTest extends ElasticsearchAbstractQueryTest {
@Test
public void testBulkProcessorFlushLimit() throws Exception {
@@ -232,26 +157,4 @@ public class ElasticsearchPropertyIndexT
Arrays.asList("/test/a", "/test/b")));
}
- private static IndexDefinitionBuilder createIndex(String... propNames) {
- IndexDefinitionBuilder builder = new ElasticsearchIndexDefinitionBuilder().noAsync();
- IndexDefinitionBuilder.IndexRule indexRule = builder.indexRule("nt:base");
- for (String propName : propNames) {
- indexRule.property(propName).propertyIndex();
- }
- return builder;
- }
-
- private void setIndex(String idxName, IndexDefinitionBuilder builder) {
- builder.build(root.getTree("/").addChild(INDEX_DEFINITIONS_NAME).addChild(idxName));
- }
-
- private String explain(String query) {
- String explain = "explain " + query;
- return executeQuery(explain, "JCR-SQL2").get(0);
- }
-
- private static void assertEventually(Runnable r) {
- ElasticsearchTestUtils.assertEventually(r, BULK_FLUSH_INTERVAL_MS_DEFAULT * 3);
- }
-
}