pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / highlighter / src / java / org / apache / lucene / search / vectorhighlight / SimpleFragListBuilder.java
1 package org.apache.lucene.search.vectorhighlight;
2
3 /**
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.
7  * The ASF licenses this file to You under the Apache License, Version 2.0
8  * (the "License"); you may not use this file except in compliance with
9  * the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 import java.util.ArrayList;
21 import java.util.Iterator;
22 import java.util.List;
23
24 import org.apache.lucene.search.vectorhighlight.FieldPhraseList.WeightedPhraseInfo;
25
26 /**
27  * A simple implementation of {@link FragListBuilder}.
28  */
29 public class SimpleFragListBuilder implements FragListBuilder {
30   
31   public static final int MARGIN_DEFAULT = 6;
32   public static final int MIN_FRAG_CHAR_SIZE_FACTOR = 3;
33
34   final int margin;
35   final int minFragCharSize;
36
37   public SimpleFragListBuilder( int margin ){
38     if( margin < 0 )
39       throw new IllegalArgumentException( "margin(" + margin + ") is too small. It must be 0 or higher." );
40
41     this.margin = margin;
42     this.minFragCharSize = Math.max( 1, margin * MIN_FRAG_CHAR_SIZE_FACTOR );
43   }
44
45   public SimpleFragListBuilder(){
46     this( MARGIN_DEFAULT );
47   }
48
49   public FieldFragList createFieldFragList(FieldPhraseList fieldPhraseList, int fragCharSize) {
50     if( fragCharSize < minFragCharSize )
51       throw new IllegalArgumentException( "fragCharSize(" + fragCharSize + ") is too small. It must be " +
52           minFragCharSize + " or higher." );
53
54     FieldFragList ffl = new FieldFragList( fragCharSize );
55
56     List<WeightedPhraseInfo> wpil = new ArrayList<WeightedPhraseInfo>();
57     Iterator<WeightedPhraseInfo> ite = fieldPhraseList.phraseList.iterator();
58     WeightedPhraseInfo phraseInfo = null;
59     int startOffset = 0;
60     boolean taken = false;
61     while( true ){
62       if( !taken ){
63         if( !ite.hasNext() ) break;
64         phraseInfo = ite.next();
65       }
66       taken = false;
67       if( phraseInfo == null ) break;
68
69       // if the phrase violates the border of previous fragment, discard it and try next phrase
70       if( phraseInfo.getStartOffset() < startOffset ) continue;
71
72       wpil.clear();
73       wpil.add( phraseInfo );
74       int st = phraseInfo.getStartOffset() - margin < startOffset ?
75           startOffset : phraseInfo.getStartOffset() - margin;
76       int en = st + fragCharSize;
77       if( phraseInfo.getEndOffset() > en )
78         en = phraseInfo.getEndOffset();
79       startOffset = en;
80
81       while( true ){
82         if( ite.hasNext() ){
83           phraseInfo = ite.next();
84           taken = true;
85           if( phraseInfo == null ) break;
86         }
87         else
88           break;
89         if( phraseInfo.getEndOffset() <= en )
90           wpil.add( phraseInfo );
91         else
92           break;
93       }
94       ffl.add( st, en, wpil );
95     }
96     return ffl;
97   }
98
99 }