DATAGEODE-163 - Add dependency between Lucene Index bean definition and the GemFireCache instance.

This commit is contained in:
John Blum
2018-12-13 10:05:10 -08:00
parent 5525147457
commit ce5e4e183a
3 changed files with 183 additions and 22 deletions

View File

@@ -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();
}
}

View File

@@ -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();
}
}