copy( this, replacement.next() );
return true;
}
// common case fast-path of first token not matching anything
AttributeSource firstTok = nextTok();
if ( firstTok == null ) {
return false;
}
TermAttribute termAtt = firstTok.addAttribute( TermAttribute.class );
SynonymMap result = map.submap != null ? map.submap
.get( termAtt.termBuffer(), 0, termAtt.termLength() ) : null;
if ( result == null ) {
copy( this, firstTok );
return true;
}
// fast-path failed, clone ourselves if needed
if ( firstTok == this ) {
firstTok = cloneAttributes();
}
// OK, we matched a token, so find the longest match.
matched = new LinkedList<AttributeSource>();
result = match( result );
if ( result == null ) {
// no match, simply return the first token read.
copy( this, firstTok );
return true;
}
// reuse, or create new one each time?
ArrayList<AttributeSource> generated = new ArrayList<AttributeSource>( result.synonyms.length + matched.size() + 1 );
//
// there was a match... let's generate the new tokens, merging
// in the matched tokens (position increments need adjusting)
//
AttributeSource lastTok = matched.isEmpty() ? firstTok : matched.getLast();
boolean includeOrig = result.includeOrig();
AttributeSource origTok = includeOrig ? firstTok : null;
PositionIncrementAttribute firstPosIncAtt = firstTok.addAttribute( PositionIncrementAttribute.class );
int origPos = firstPosIncAtt.getPositionIncrement(); // position of origTok in the original stream
int repPos = 0; // curr position in replacement token stream
int pos = 0; // current position in merged token stream
for ( int i = 0; i < result.synonyms.length; i++ ) {
Token repTok = result.synonyms[i];
AttributeSource newTok = firstTok.cloneAttributes();
TermAttribute newTermAtt = newTok.addAttribute( TermAttribute.class );
OffsetAttribute newOffsetAtt = newTok.addAttribute( OffsetAttribute.class );
PositionIncrementAttribute newPosIncAtt = newTok.addAttribute( PositionIncrementAttribute.class );
OffsetAttribute lastOffsetAtt = lastTok.addAttribute( OffsetAttribute.class );
newOffsetAtt.setOffset( newOffsetAtt.startOffset(), lastOffsetAtt.endOffset() );
newTermAtt.setTermBuffer( repTok.termBuffer(), 0, repTok.termLength() );