Skip to content

Commit

Permalink
HSEARCH-2219 Remove Lazy*Analyzers and replace them with lazy references
Browse files Browse the repository at this point in the history
This is required in order to enable indexing services to define their
own analyzer type, with custom data.
  • Loading branch information
yrodiere authored and Sanne committed Dec 19, 2016
1 parent 26409af commit 11577f7
Show file tree
Hide file tree
Showing 14 changed files with 218 additions and 246 deletions.
Expand Up @@ -6,13 +6,12 @@
*/
package org.hibernate.search.elasticsearch.analyzer.impl;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.hibernate.search.analyzer.impl.LazyRemoteAnalyzer;
import org.hibernate.search.analyzer.impl.RemoteAnalyzer;
import org.hibernate.search.analyzer.impl.RemoteAnalyzerImpl;
import org.hibernate.search.analyzer.impl.RemoteAnalyzerReference;
import org.hibernate.search.analyzer.impl.ScopedRemoteAnalyzer;
import org.hibernate.search.analyzer.spi.AnalyzerStrategy;
Expand All @@ -26,17 +25,17 @@ public class ElasticsearchAnalyzerStrategy implements AnalyzerStrategy<RemoteAna

@Override
public RemoteAnalyzerReference createDefaultAnalyzerReference() {
return new RemoteAnalyzerReference( new RemoteAnalyzer( "default" ) );
return new RemoteAnalyzerReference( new RemoteAnalyzerImpl( "default" ) );
}

@Override
public RemoteAnalyzerReference createPassThroughAnalyzerReference() {
return new RemoteAnalyzerReference( new RemoteAnalyzer( "keyword" ) );
return new RemoteAnalyzerReference( new RemoteAnalyzerImpl( "keyword" ) );
}

@Override
public RemoteAnalyzerReference createAnalyzerReference(String name) {
return new RemoteAnalyzerReference( new LazyRemoteAnalyzer( name ) );
public RemoteAnalyzerReference createNamedAnalyzerReference(String name) {
return new RemoteAnalyzerReference( name );
}

@Override
Expand All @@ -45,36 +44,32 @@ public RemoteAnalyzerReference createAnalyzerReference(Class<?> analyzerClass) {
}

@Override
public void initializeNamedAnalyzerReferences(Collection<RemoteAnalyzerReference> references, Map<String, AnalyzerDef> analyzerDefinitions) {
public void initializeNamedAnalyzerReferences(Map<String, RemoteAnalyzerReference> references, Map<String, AnalyzerDef> analyzerDefinitions) {
Map<String, RemoteAnalyzer> initializedAnalyzers = new HashMap<>();
for ( RemoteAnalyzerReference reference : references ) {
initializeReference( initializedAnalyzers, reference, analyzerDefinitions );
for ( Map.Entry<String, RemoteAnalyzerReference> entry : references.entrySet() ) {
initializeReference( initializedAnalyzers, entry.getKey(), entry.getValue(), analyzerDefinitions );
}
}

private void initializeReference(Map<String, RemoteAnalyzer> initializedAnalyzers, String name,
RemoteAnalyzerReference analyzerReference, Map<String, AnalyzerDef> analyzerDefinitions) {
RemoteAnalyzer analyzer = initializedAnalyzers.get( name );

private void initializeReference(Map<String, RemoteAnalyzer> initializedAnalyzers, RemoteAnalyzerReference analyzerReference,
Map<String, AnalyzerDef> analyzerDefinitions) {
LazyRemoteAnalyzer lazyAnalyzer = (LazyRemoteAnalyzer) analyzerReference.getAnalyzer();

String name = lazyAnalyzer.getName();
RemoteAnalyzer delegate = initializedAnalyzers.get( name );

if ( delegate == null ) {
if ( analyzer == null ) {
// TODO HSEARCH-2219 Actually use the definition
delegate = buildAnalyzer( name );
initializedAnalyzers.put( name, delegate );
analyzer = buildAnalyzer( name );
initializedAnalyzers.put( name, analyzer );
}

lazyAnalyzer.setDelegate( delegate );
analyzerReference.initialize( analyzer );
}

private RemoteAnalyzer buildAnalyzer(String name) {
return new RemoteAnalyzer( name );
return new RemoteAnalyzerImpl( name );
}

@Override
public ScopedRemoteAnalyzer.Builder buildScopedAnalyzer(RemoteAnalyzerReference initialGlobalAnalyzerReference) {
return new ScopedRemoteAnalyzer.Builder( initialGlobalAnalyzerReference, Collections.<String, RemoteAnalyzer>emptyMap() );
return new ScopedRemoteAnalyzer.Builder( initialGlobalAnalyzerReference, Collections.<String, RemoteAnalyzerReference>emptyMap() );
}
}

This file was deleted.

This file was deleted.

Expand Up @@ -8,6 +8,9 @@

import org.apache.lucene.analysis.Analyzer;
import org.hibernate.search.analyzer.spi.AnalyzerReference;
import org.hibernate.search.exception.AssertionFailure;
import org.hibernate.search.util.logging.impl.Log;
import org.hibernate.search.util.logging.impl.LoggerFactory;

/**
* A reference to an {@link Analyzer}.
Expand All @@ -16,20 +19,51 @@
*/
public class LuceneAnalyzerReference implements AnalyzerReference {

private final Analyzer analyzer;
private static final Log LOG = LoggerFactory.make();

private String name;

private Analyzer analyzer;

public LuceneAnalyzerReference(String name) {
this.name = name;
this.analyzer = null; // Not initialized
}

public LuceneAnalyzerReference(Analyzer analyzer) {
this.name = null;
this.analyzer = analyzer;
}

@Override
public String getAnalyzerName() {
return name;
}

@Override
public Analyzer getAnalyzer() {
if ( analyzer == null ) {
throw LOG.lazyLuceneAnalyzerReferenceNotInitialized( this );
}
return analyzer;
}

public boolean isInitialized() {
return analyzer != null;
}

public void initialize(Analyzer analyzer) {
if ( this.analyzer != null ) {
throw new AssertionFailure( "An analyzer reference has been initialized more than once:" + this );
}
this.analyzer = analyzer;
}

@Override
public void close() {
analyzer.close();
if ( analyzer != null ) {
analyzer.close();
}
}

@Override
Expand All @@ -47,7 +81,12 @@ public String toString() {
StringBuilder sb = new StringBuilder();
sb.append( getClass().getSimpleName() );
sb.append( "<" );
sb.append( analyzer );
if ( analyzer != null ) {
sb.append( analyzer );
}
else {
sb.append( name );
}
sb.append( ">" );
return sb.toString();
}
Expand Down
Expand Up @@ -8,7 +8,6 @@

import java.io.IOException;
import java.text.ParseException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -83,7 +82,7 @@ public LuceneAnalyzerReference createDefaultAnalyzerReference() {
}
catch (Exception e) {
// Maybe the string refers to an analyzer definition instead?
return createAnalyzerReference( analyzerClassName );
return createNamedAnalyzerReference( analyzerClassName );
}
}
else {
Expand Down Expand Up @@ -112,35 +111,32 @@ public LuceneAnalyzerReference createAnalyzerReference(Class<?> analyzerClass) {
}

@Override
public LuceneAnalyzerReference createAnalyzerReference(String name) {
return new LuceneAnalyzerReference( new LazyLuceneAnalyzer( name ) );
public LuceneAnalyzerReference createNamedAnalyzerReference(String name) {
return new LuceneAnalyzerReference( name );
}

@Override
public void initializeNamedAnalyzerReferences(Collection<LuceneAnalyzerReference> references, Map<String, AnalyzerDef> analyzerDefinitions) {
public void initializeNamedAnalyzerReferences(Map<String, LuceneAnalyzerReference> references, Map<String, AnalyzerDef> analyzerDefinitions) {
Map<String, Analyzer> initializedAnalyzers = new HashMap<>();
for ( LuceneAnalyzerReference reference : references ) {
initializeReference( initializedAnalyzers, reference, analyzerDefinitions );
for ( Map.Entry<String, LuceneAnalyzerReference> entry : references.entrySet() ) {
initializeReference( initializedAnalyzers, entry.getKey(), entry.getValue(), analyzerDefinitions );
}
}

private void initializeReference(Map<String, Analyzer> initializedAnalyzers, LuceneAnalyzerReference analyzerReference,
private void initializeReference(Map<String, Analyzer> initializedAnalyzers, String name, LuceneAnalyzerReference analyzerReference,
Map<String, AnalyzerDef> analyzerDefinitions) {
LazyLuceneAnalyzer lazyAnalyzer = (LazyLuceneAnalyzer) analyzerReference.getAnalyzer();
Analyzer analyzer = initializedAnalyzers.get( name );

String name = lazyAnalyzer.getName();
Analyzer delegate = initializedAnalyzers.get( name );

if ( delegate == null ) {
if ( analyzer == null ) {
AnalyzerDef analyzerDefinition = analyzerDefinitions.get( name );
if ( analyzerDefinition == null ) {
throw new SearchException( "Lucene analyzer found with an unknown definition: " + name );
}
delegate = buildAnalyzer( analyzerDefinition );
initializedAnalyzers.put( name, delegate );
analyzer = buildAnalyzer( analyzerDefinition );
initializedAnalyzers.put( name, analyzer );
}

lazyAnalyzer.setDelegate( delegate );
analyzerReference.initialize( analyzer );
}

private Analyzer buildAnalyzer(AnalyzerDef analyzerDefinition) {
Expand All @@ -154,6 +150,6 @@ private Analyzer buildAnalyzer(AnalyzerDef analyzerDefinition) {

@Override
public ScopedLuceneAnalyzer.Builder buildScopedAnalyzer(LuceneAnalyzerReference initialGlobalAnalyzerReference) {
return new ScopedLuceneAnalyzer.Builder( initialGlobalAnalyzerReference, Collections.<String, Analyzer>emptyMap() );
return new ScopedLuceneAnalyzer.Builder( initialGlobalAnalyzerReference, Collections.<String, LuceneAnalyzerReference>emptyMap() );
}
}

0 comments on commit 11577f7

Please sign in to comment.