add --shared
[pylucene.git] / lucene-java-3.4.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 = 6;
32   public static final int MIN_FRAG_CHAR_SIZE = MARGIN * 3;
33
34   public FieldFragList createFieldFragList(FieldPhraseList fieldPhraseList, int fragCharSize) {
35     if( fragCharSize < MIN_FRAG_CHAR_SIZE )
36       throw new IllegalArgumentException( "fragCharSize(" + fragCharSize + ") is too small. It must be " +
37           MIN_FRAG_CHAR_SIZE + " or higher." );
38
39     FieldFragList ffl = new FieldFragList( fragCharSize );
40
41     List<WeightedPhraseInfo> wpil = new ArrayList<WeightedPhraseInfo>();
42     Iterator<WeightedPhraseInfo> ite = fieldPhraseList.phraseList.iterator();
43     WeightedPhraseInfo phraseInfo = null;
44     int startOffset = 0;
45     boolean taken = false;
46     while( true ){
47       if( !taken ){
48         if( !ite.hasNext() ) break;
49         phraseInfo = ite.next();
50       }
51       taken = false;
52       if( phraseInfo == null ) break;
53
54       // if the phrase violates the border of previous fragment, discard it and try next phrase
55       if( phraseInfo.getStartOffset() < startOffset ) continue;
56
57       wpil.clear();
58       wpil.add( phraseInfo );
59       int st = phraseInfo.getStartOffset() - MARGIN < startOffset ?
60           startOffset : phraseInfo.getStartOffset() - MARGIN;
61       int en = st + fragCharSize;
62       if( phraseInfo.getEndOffset() > en )
63         en = phraseInfo.getEndOffset();
64       startOffset = en;
65
66       while( true ){
67         if( ite.hasNext() ){
68           phraseInfo = ite.next();
69           taken = true;
70           if( phraseInfo == null ) break;
71         }
72         else
73           break;
74         if( phraseInfo.getEndOffset() <= en )
75           wpil.add( phraseInfo );
76         else
77           break;
78       }
79       ffl.add( st, en, wpil );
80     }
81     return ffl;
82   }
83
84 }