Skip to content

Commit

Permalink
HSEARCH-4000 Test more IndexingDependency/AssociationInverseSide
Browse files Browse the repository at this point in the history
  • Loading branch information
fax4ever authored and yrodiere committed Oct 15, 2020
1 parent 7b96bb5 commit 65df3f2
Showing 1 changed file with 207 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.integrationtest.mapper.pojo.mapping.definition;

import java.lang.invoke.MethodHandles;
import java.util.LinkedHashMap;
import java.util.Map;

import org.hibernate.search.integrationtest.mapper.pojo.testsupport.util.rule.JavaBeanMappingSetupHelper;
import org.hibernate.search.mapper.javabean.mapping.SearchMapping;
import org.hibernate.search.mapper.javabean.session.SearchSession;
import org.hibernate.search.mapper.pojo.automaticindexing.ReindexOnUpdate;
import org.hibernate.search.mapper.pojo.extractor.builtin.BuiltinContainerExtractors;
import org.hibernate.search.mapper.pojo.extractor.mapping.annotation.ContainerExtraction;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AssociationInverseSide;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.DocumentId;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexingDependency;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.ObjectPath;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.PropertyValue;
import org.hibernate.search.util.impl.integrationtest.common.rule.BackendMock;
import org.hibernate.search.util.impl.test.annotation.TestForIssue;

import org.junit.Rule;
import org.junit.Test;

public class DependencyRepeatableIT {

private static final String INDEX_NAME = "IndexName";

@Rule
public BackendMock backendMock = new BackendMock();

@Rule
public JavaBeanMappingSetupHelper setupHelper = JavaBeanMappingSetupHelper
.withBackendMock( MethodHandles.lookup(), backendMock );

@Test
@TestForIssue( jiraKey = "HSEARCH-4000" )
public void associationInverseSide() {
backendMock.expectSchema( INDEX_NAME, b -> b
.objectField( "keys", b2 -> b2
.multiValued( true )
.field( "text", String.class )
)
.objectField( "values", b2 -> b2
.multiValued( true )
.field( "text", String.class )
)
);

SearchMapping mapping = setupHelper.start().setup( AssociationInverseSideRootEntity.class );
backendMock.verifyExpectationsMet();

try ( SearchSession session = mapping.createSession() ) {
AssociationInverseSideRootEntity entity = new AssociationInverseSideRootEntity();
entity.id = 1;
entity.priceByEdition.put( new AssociationInverseSideKeyEntity( "bla", entity ), new AssociationInverseSideValueEntity( "blabla", entity ) );

session.indexingPlan().add( entity );

backendMock.expectWorks( INDEX_NAME )
.add( "1", b -> b
.objectField( "keys", b2 -> b2.field( "text", "bla" ) )
.objectField( "values", b2 -> b2.field( "text", "blabla" ) )
)
.processedThenExecuted();
}
backendMock.verifyExpectationsMet();
}

@Test
@TestForIssue( jiraKey = "HSEARCH-4000" )
public void indexingDependency() {
backendMock.expectSchema( INDEX_NAME, b -> b
.objectField( "keys", b2 -> b2
.multiValued( true )
.field( "text", String.class )
)
.objectField( "values", b2 -> b2
.multiValued( true )
.field( "text", String.class )
)
);

SearchMapping mapping = setupHelper.start().setup( IndexingDependencyRootEntity.class );
backendMock.verifyExpectationsMet();

try ( SearchSession session = mapping.createSession() ) {
IndexingDependencyRootEntity entity = new IndexingDependencyRootEntity();
entity.id = 1;
entity.priceByEdition.put( new IndexingDependencyKeyEntity( "bla", entity ), new IndexingDependencyValueEntity( "blabla", entity ) );

session.indexingPlan().add( entity );

backendMock.expectWorks( INDEX_NAME )
.add( "1", b -> b
.objectField( "keys", b2 -> b2.field( "text", "bla" ) )
.objectField( "values", b2 -> b2.field( "text", "blabla" ) )
)
.processedThenExecuted();
}
backendMock.verifyExpectationsMet();
}

@Indexed(index = INDEX_NAME)
private static class AssociationInverseSideRootEntity {
@DocumentId
private Integer id;

@AssociationInverseSide(
extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_KEY),
inversePath = @ObjectPath( @PropertyValue( propertyName = "rootEntity" ) )
)
@IndexedEmbedded(
name = "keys",
extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_KEY)
)
@AssociationInverseSide(
extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE),
inversePath = @ObjectPath( @PropertyValue( propertyName = "rootEntity" ) )
)
@IndexedEmbedded(
name = "values",
extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE)
)
private Map<AssociationInverseSideKeyEntity, AssociationInverseSideValueEntity> priceByEdition = new LinkedHashMap<>();
}

private static class AssociationInverseSideKeyEntity {
@GenericField
private String text;

private AssociationInverseSideRootEntity rootEntity;

public AssociationInverseSideKeyEntity(String text, AssociationInverseSideRootEntity rootEntity) {
this.text = text;
this.rootEntity = rootEntity;
}
}

private static class AssociationInverseSideValueEntity {
@GenericField
private String text;

private AssociationInverseSideRootEntity rootEntity;

public AssociationInverseSideValueEntity(String text, AssociationInverseSideRootEntity rootEntity) {
this.text = text;
this.rootEntity = rootEntity;
}
}

@Indexed(index = INDEX_NAME)
private static class IndexingDependencyRootEntity {
@DocumentId
private Integer id;

@IndexingDependency(
reindexOnUpdate = ReindexOnUpdate.NO,
extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_KEY)
)
@IndexedEmbedded(
name = "keys",
extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_KEY)
)
@IndexingDependency(
reindexOnUpdate = ReindexOnUpdate.NO,
extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE)
)
@IndexedEmbedded(
name = "values",
extraction = @ContainerExtraction(BuiltinContainerExtractors.MAP_VALUE)
)
private Map<IndexingDependencyKeyEntity, IndexingDependencyValueEntity> priceByEdition = new LinkedHashMap<>();
}

private static class IndexingDependencyKeyEntity {
@GenericField
private String text;

private IndexingDependencyRootEntity rootEntity;

public IndexingDependencyKeyEntity(String text, IndexingDependencyRootEntity rootEntity) {
this.text = text;
this.rootEntity = rootEntity;
}
}

private static class IndexingDependencyValueEntity {
@GenericField
private String text;

private IndexingDependencyRootEntity rootEntity;

public IndexingDependencyValueEntity(String text, IndexingDependencyRootEntity rootEntity) {
this.text = text;
this.rootEntity = rootEntity;
}
}
}

0 comments on commit 65df3f2

Please sign in to comment.