DATAGEODE-163 - Add dependency between Lucene Index bean definition and the GemFireCache instance.
This commit is contained in:
@@ -224,7 +224,6 @@ public class IndexConfiguration extends EntityDefinedRegionsConfiguration {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
private String toRegionName(String from) {
|
private String toRegionName(String from) {
|
||||||
|
|
||||||
return Optional.ofNullable(from)
|
return Optional.ofNullable(from)
|
||||||
@@ -233,13 +232,12 @@ public class IndexConfiguration extends EntityDefinedRegionsConfiguration {
|
|||||||
|
|
||||||
boolean isSubRegionPath = from.lastIndexOf(Region.SEPARATOR) > 0;
|
boolean isSubRegionPath = from.lastIndexOf(Region.SEPARATOR) > 0;
|
||||||
|
|
||||||
return (!isSubRegionPath && from.startsWith(Region.SEPARATOR) ? from.substring(1) : from);
|
return !isSubRegionPath && from.startsWith(Region.SEPARATOR) ? from.substring(1) : from;
|
||||||
|
|
||||||
})
|
})
|
||||||
.orElseThrow(() -> newIllegalArgumentException("From clause [%s] is required", from));
|
.orElseThrow(() -> newIllegalArgumentException("From clause [%s] is required", from));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
private String toRegionPath(String from) {
|
private String toRegionPath(String from) {
|
||||||
|
|
||||||
return Optional.ofNullable(from)
|
return Optional.ofNullable(from)
|
||||||
@@ -281,8 +279,11 @@ public class IndexConfiguration extends EntityDefinedRegionsConfiguration {
|
|||||||
|
|
||||||
String indexName = luceneIndexAttributes.getString("name");
|
String indexName = luceneIndexAttributes.getString("name");
|
||||||
|
|
||||||
boolean destroy = (luceneIndexAttributes.containsKey("destroy")
|
boolean destroy = luceneIndexAttributes.containsKey("destroy")
|
||||||
&& luceneIndexAttributes.getBoolean("destroy"));
|
&& luceneIndexAttributes.getBoolean("destroy");
|
||||||
|
|
||||||
|
luceneIndexFactoryBeanBuilder.addPropertyReference("cache",
|
||||||
|
GemfireConstants.DEFAULT_GEMFIRE_CACHE_NAME);
|
||||||
|
|
||||||
luceneIndexFactoryBeanBuilder.addPropertyValue("destroy", destroy);
|
luceneIndexFactoryBeanBuilder.addPropertyValue("destroy", destroy);
|
||||||
|
|
||||||
@@ -298,7 +299,6 @@ public class IndexConfiguration extends EntityDefinedRegionsConfiguration {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
private List<IndexConfigurer> resolveIndexConfigurers() {
|
private List<IndexConfigurer> resolveIndexConfigurers() {
|
||||||
|
|
||||||
return Optional.ofNullable(this.indexConfigurers)
|
return Optional.ofNullable(this.indexConfigurers)
|
||||||
@@ -316,46 +316,45 @@ public class IndexConfiguration extends EntityDefinedRegionsConfiguration {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
private boolean resolveDefine(AnnotationAttributes enableIndexingAttributes) {
|
private boolean resolveDefine(AnnotationAttributes enableIndexingAttributes) {
|
||||||
return (enableIndexingAttributes.containsKey("define")
|
|
||||||
&& enableIndexingAttributes.getBoolean("define"));
|
return enableIndexingAttributes.containsKey("define")
|
||||||
|
&& enableIndexingAttributes.getBoolean("define");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private String resolveExpression(GemfirePersistentEntity<?> persistentEntity,
|
private String resolveExpression(GemfirePersistentEntity<?> persistentEntity,
|
||||||
GemfirePersistentProperty persistentProperty, AnnotationAttributes indexedAttributes) {
|
GemfirePersistentProperty persistentProperty, AnnotationAttributes indexedAttributes) {
|
||||||
|
|
||||||
String expression = (indexedAttributes.containsKey("expression")
|
String expression = indexedAttributes.containsKey("expression")
|
||||||
? indexedAttributes.getString("expression") : null);
|
? indexedAttributes.getString("expression")
|
||||||
|
: null;
|
||||||
|
|
||||||
return (StringUtils.hasText(expression) ? expression : persistentProperty.getName());
|
return (StringUtils.hasText(expression) ? expression : persistentProperty.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private String resolveFrom(GemfirePersistentEntity<?> persistentEntity,
|
private String resolveFrom(GemfirePersistentEntity<?> persistentEntity,
|
||||||
GemfirePersistentProperty persistentProperty, AnnotationAttributes indexedAttributes) {
|
GemfirePersistentProperty persistentProperty, AnnotationAttributes indexedAttributes) {
|
||||||
|
|
||||||
String from = (indexedAttributes.containsKey("from")
|
String from = indexedAttributes.containsKey("from")
|
||||||
? indexedAttributes.getString("from") : null);
|
? indexedAttributes.getString("from")
|
||||||
|
: null;
|
||||||
|
|
||||||
return (StringUtils.hasText(from) ? from : persistentEntity.getRegionName());
|
return (StringUtils.hasText(from) ? from : persistentEntity.getRegionName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
private String resolveName(GemfirePersistentEntity<?> persistentEntity,
|
private String resolveName(GemfirePersistentEntity<?> persistentEntity,
|
||||||
GemfirePersistentProperty persistentProperty, AnnotationAttributes indexedAttributes, IndexType indexType) {
|
GemfirePersistentProperty persistentProperty, AnnotationAttributes indexedAttributes, IndexType indexType) {
|
||||||
|
|
||||||
String indexName = (indexedAttributes.containsKey("name")
|
String indexName = indexedAttributes.containsKey("name")
|
||||||
? indexedAttributes.getString("name") : null);
|
? indexedAttributes.getString("name")
|
||||||
|
: null;
|
||||||
|
|
||||||
return (StringUtils.hasText(indexName) ? indexName
|
return (StringUtils.hasText(indexName) ? indexName
|
||||||
: generateIndexName(persistentEntity, persistentProperty, indexType));
|
: generateIndexName(persistentEntity, persistentProperty, indexType));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
private String generateIndexName(GemfirePersistentEntity persistentEntity,
|
private String generateIndexName(GemfirePersistentEntity persistentEntity,
|
||||||
GemfirePersistentProperty persistentProperty, IndexType indexType) {
|
GemfirePersistentProperty persistentProperty, IndexType indexType) {
|
||||||
|
|
||||||
@@ -364,13 +363,13 @@ public class IndexConfiguration extends EntityDefinedRegionsConfiguration {
|
|||||||
StringUtils.capitalize(indexType.name().toLowerCase()));
|
StringUtils.capitalize(indexType.name().toLowerCase()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc) */
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private IndexType resolveType(GemfirePersistentEntity<?> persistentEntity,
|
private IndexType resolveType(GemfirePersistentEntity<?> persistentEntity,
|
||||||
GemfirePersistentProperty persistentProperty, AnnotationAttributes indexedAttributes, IndexType indexType) {
|
GemfirePersistentProperty persistentProperty, AnnotationAttributes indexedAttributes, IndexType indexType) {
|
||||||
|
|
||||||
IndexType resolvedIndexType = (indexedAttributes.containsKey("type")
|
IndexType resolvedIndexType = indexedAttributes.containsKey("type")
|
||||||
? indexedAttributes.getEnum("type") : null);
|
? indexedAttributes.getEnum("type")
|
||||||
|
: null;
|
||||||
|
|
||||||
return Optional.ofNullable(resolvedIndexType).orElse(indexType);
|
return Optional.ofNullable(resolvedIndexType).orElse(indexType);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed 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.springframework.data.gemfire.config.annotation;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import org.apache.geode.cache.Region;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.DependsOn;
|
||||||
|
import org.springframework.data.gemfire.search.lucene.ProjectingLuceneOperations;
|
||||||
|
import org.springframework.data.gemfire.search.lucene.ProjectingLuceneTemplate;
|
||||||
|
import org.springframework.data.gemfire.test.model.Book;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The EnableLuceneIndexingConfigurationIntegrationTests class...
|
||||||
|
*
|
||||||
|
* @author John Blum
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@ContextConfiguration
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public class EnableLuceneIndexingConfigurationIntegrationTests {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ProjectingLuceneOperations luceneTemplate;
|
||||||
|
|
||||||
|
@Resource(name = "Books")
|
||||||
|
private Region<Long, Book> books;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
|
||||||
|
long isbn = 1L;
|
||||||
|
|
||||||
|
put(Book.newBook(++isbn, "Lord of the Rings - The Fellowship of the Ring"));
|
||||||
|
put(Book.newBook(++isbn, "Star Wars III - Revenge of the Sith"));
|
||||||
|
put(Book.newBook(++isbn, "Hitch Hikers Guide to the Galaxy"));
|
||||||
|
put(Book.newBook(++isbn, "Star Wars VI - Return of the Jedi"));
|
||||||
|
put(Book.newBook(++isbn, "Lord of the Rings - The Two Towers"));
|
||||||
|
put(Book.newBook(++isbn, "Star Wars VIII - The Last Jedi"));
|
||||||
|
put(Book.newBook(++isbn, "Lord of the Rings - The Return of the King"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void put(Book book) {
|
||||||
|
this.books.put(book.getId(), book);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void searchForAllStarWarsBooksIsSuccessful() {
|
||||||
|
|
||||||
|
Collection<BookTitleView> books =
|
||||||
|
this.luceneTemplate.query("title: Star Wars*", "title", BookTitleView.class);
|
||||||
|
|
||||||
|
assertThat(books).isNotNull();
|
||||||
|
assertThat(books).hasSize(3);
|
||||||
|
assertThat(books.stream().map(BookTitleView::getTitle).collect(Collectors.toList()))
|
||||||
|
.containsOnly("Star Wars III - Revenge of the Sith", "Star Wars VI - Return of the Jedi",
|
||||||
|
"Star Wars VIII - The Last Jedi");
|
||||||
|
}
|
||||||
|
|
||||||
|
@PeerCacheApplication(name = "EnableLuceneIndexingConfigurationIntegrationTests", logLevel = "error")
|
||||||
|
@EnableEntityDefinedRegions(basePackageClasses = Book.class)
|
||||||
|
@EnableIndexing
|
||||||
|
static class TestConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@DependsOn("BookTitleIdx")
|
||||||
|
ProjectingLuceneOperations luceneTemplate() {
|
||||||
|
return new ProjectingLuceneTemplate("BookTitleIdx", "/Books");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface BookTitleView {
|
||||||
|
String getTitle();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed 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.springframework.data.gemfire.test.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import org.springframework.data.annotation.Id;
|
||||||
|
import org.springframework.data.gemfire.mapping.annotation.LuceneIndexed;
|
||||||
|
import org.springframework.data.gemfire.mapping.annotation.Region;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract Data Type (ADT) modeling a {@literal Book} application domain type.
|
||||||
|
*
|
||||||
|
* @author John Blum
|
||||||
|
* @see java.lang.Comparable
|
||||||
|
* @see java.io.Serializable
|
||||||
|
* @see org.springframework.data.gemfire.mapping.annotation.LuceneIndexed
|
||||||
|
* @see org.springframework.data.gemfire.mapping.annotation.Region
|
||||||
|
* @see lombok
|
||||||
|
* @since 2.2.0
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Region("Books")
|
||||||
|
@RequiredArgsConstructor(staticName = "newBook")
|
||||||
|
public class Book implements Comparable<Book>, Serializable {
|
||||||
|
|
||||||
|
@NonNull @Id
|
||||||
|
private final Long id;
|
||||||
|
|
||||||
|
@NonNull @LuceneIndexed(name = "BookTitleIdx")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Book other) {
|
||||||
|
return this.getTitle().compareTo(other.getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.getTitle();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user