blob: d65b4155c878bd5f85d7f4e5192e4607ec777a6a [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.3"/>
<title>Lucene.Net: contrib/Memory/MemoryIndex.cs Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="lucene-net-icon-128x128.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">Lucene.Net
&#160;<span id="projectnumber">3.0.3</span>
</div>
<div id="projectbrief">Lucene.Net is a .NET port of the Java Lucene Indexing Library</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.3 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="Index.html"><span>Main&#160;Page</span></a></li>
<li><a href="namespaces.html"><span>Packages</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>File&#160;Members</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Properties</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_3a8d697be1e2feab9f01acc78e9570fb.html">contrib</a></li><li class="navelem"><a class="el" href="dir_561711aff09ef70608a6591bcd984cfc.html">Memory</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">MemoryIndex.cs</div> </div>
</div><!--header-->
<div class="contents">
<a href="_memory_index_8cs.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * Licensed to the Apache Software Foundation (ASF) under one</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * or more contributor license agreements. See the NOTICE file</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * distributed with this work for additional information</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * regarding copyright ownership. The ASF licenses this file</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * to you under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * &quot;License&quot;); you may not use this file except in compliance</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * with the License. You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> * http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing,</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * software distributed under the License is distributed on an</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> * KIND, either express or implied. See the License for the</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> * specific language governing permissions and limitations</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> * under the License.</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">*/</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">using</span> System;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="keyword">using</span> System.Collections.Generic;</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="keyword">using</span> System.IO;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">using</span> System.Linq;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="keyword">using</span> System.Text;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="keyword">using</span> Lucene.Net.Analysis;</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="keyword">using</span> Lucene.Net.Analysis.Tokenattributes;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">using</span> Lucene.Net.Documents;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="keyword">using</span> Lucene.Net.Search;</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="keyword">using</span> Lucene.Net.Support;</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="keyword">namespace </span>Lucene.Net.Index.Memory</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;{</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; [Serializable]</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">public</span> <span class="keyword">partial class </span>MemoryIndex</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; {</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="comment">/* info for each field: Map&lt;String fieldName, Info field&gt; */</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">private</span> HashMap&lt;String, Info&gt; fields = <span class="keyword">new</span> HashMap&lt;String, Info&gt;();</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="comment">/* fields sorted ascending by fieldName; lazily computed on demand */</span></div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; [NonSerialized] <span class="keyword">private</span> KeyValuePair&lt;String, Info&gt;[] sortedFields;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="comment">/* pos: positions[3*i], startOffset: positions[3*i +1], endOffset: positions[3*i +2] */</span></div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keyword">private</span> <span class="keywordtype">int</span> stride;</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="comment">/* Could be made configurable; See {@link Document#setBoost(float)} */</span></div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> <span class="keywordtype">float</span> docBoost = 1.0f;</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> <span class="keywordtype">long</span> serialVersionUID = 2782195016849084649L;</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> DEBUG = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;<span class="comment"> * Constructs an empty instance.</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#aa243a9af9e886239bd2f83dd6c2ec79c"> 177</a></span>&#160; <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html" title="High-performance single-document main memory Apache Lucene fulltext search index.">MemoryIndex</a>()</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; : this(false)</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; {</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; }</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="comment"> * Constructs an empty instance that can optionally store the start and end</span></div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;<span class="comment"> * character offset of each token term in the text. This can be useful for</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="comment"> * highlighting of hit locations with the Lucene highlighter package.</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="comment"> * Private until the highlighter package matures, so that this can actually</span></div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;<span class="comment"> * be meaningfully integrated.</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;<span class="comment"> * @param storeOffsets</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;<span class="comment"> * whether or not to store the start and end character offset of</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;<span class="comment"> * each token term in the text</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160;</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keyword">private</span> <a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html" title="High-performance single-document main memory Apache Lucene fulltext search index.">MemoryIndex</a>(<span class="keywordtype">bool</span> storeOffsets)</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; {</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; this.stride = storeOffsets ? 3 : 1;</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; }</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;<span class="comment"> * Convenience method; Tokenizes the given field text and adds the resulting</span></div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160;<span class="comment"> * terms to the index; Equivalent to adding an indexed non-keyword Lucene</span></div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;<span class="comment"> * {@link org.apache.lucene.document.Field} that is</span></div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;<span class="comment"> * {@link org.apache.lucene.document.Field.Index#ANALYZED tokenized},</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;<span class="comment"> * {@link org.apache.lucene.document.Field.Store#NO not stored},</span></div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;<span class="comment"> * {@link org.apache.lucene.document.Field.TermVector#WITH_POSITIONS termVectorStored with positions} (or</span></div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;<span class="comment"> * {@link org.apache.lucene.document.Field.TermVector#WITH_POSITIONS termVectorStored with positions and offsets}),</span></div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;<span class="comment"> * @param fieldName</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;<span class="comment"> * a name to be associated with the text</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;<span class="comment"> * @param text</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;<span class="comment"> * the text to tokenize and index.</span></div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;<span class="comment"> * @param analyzer</span></div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;<span class="comment"> * the analyzer to use for tokenization</span></div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div>
<div class="line"><a name="l00216"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#a6c417595cc2e27722bb460f3fb11eea0"> 216</a></span>&#160; <span class="keyword">public</span> <span class="keywordtype">void</span> AddField(String fieldName, String text, <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_analyzer.html" title="An Analyzer builds TokenStreams, which analyze text. It thus represents a policy for extracting index...">Analyzer</a> analyzer)</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; {</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">if</span> (fieldName == null)</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;fieldName must not be null&quot;</span>);</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="keywordflow">if</span> (text == null)</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;text must not be null&quot;</span>);</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">if</span> (analyzer == null)</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;analyzer must not be null&quot;</span>);</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> stream = analyzer.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_analyzer.html#ac031bae47f64e6bbe2117c991996f5fc" title="Creates a TokenStream which tokenizes all the text in the provided Reader. Must be able to handle nul...">TokenStream</a>(fieldName, <span class="keyword">new</span> StringReader(text));</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; AddField(fieldName, stream);</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; }</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;<span class="comment"> * Convenience method; Creates and returns a token stream that generates a</span></div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160;<span class="comment"> * token for each keyword in the given collection, &quot;as is&quot;, without any</span></div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;<span class="comment"> * transforming text analysis. The resulting token stream can be fed into</span></div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;<span class="comment"> * {@link #addField(String, TokenStream)}, perhaps wrapped into another</span></div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;<span class="comment"> * {@link org.apache.lucene.analysis.TokenFilter}, as desired.</span></div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;<span class="comment"> * @param keywords</span></div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160;<span class="comment"> * the keywords to generate tokens for</span></div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;<span class="comment"> * @return the corresponding token stream</span></div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160;</div>
<div class="line"><a name="l00242"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#a240e09c43949d96132533e6edce8643c"> 242</a></span>&#160; <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> CreateKeywordTokenStream&lt;T&gt;(ICollection&lt;T&gt; keywords)</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; {</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="comment">// TODO: deprecate &amp; move this method into AnalyzerUtil?</span></div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordflow">if</span> (keywords == null)</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;keywords must not be null&quot;</span>);</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160;</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <span class="keywordflow">return</span> <span class="keyword">new</span> KeywordTokenStream&lt;T&gt;(keywords);</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; }</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;<span class="comment"> * Equivalent to &lt;c&gt;addField(fieldName, stream, 1.0f)&lt;/c&gt;.</span></div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160;<span class="comment"> * @param fieldName</span></div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;<span class="comment"> * a name to be associated with the text</span></div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160;<span class="comment"> * @param stream</span></div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;<span class="comment"> * the token stream to retrieve tokens from</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00259"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#a972cd0130f17047f459abfcdf6182c96"> 259</a></span>&#160; <span class="keyword">public</span> <span class="keywordtype">void</span> AddField(String fieldName, <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> stream)</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; {</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; AddField(fieldName, stream, 1.0f);</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; }</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160;<span class="comment"> * Iterates over the given token stream and adds the resulting terms to the index;</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;<span class="comment"> * Equivalent to adding a tokenized, indexed, termVectorStored, unstored,</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160;<span class="comment"> * Lucene {@link org.apache.lucene.document.Field}.</span></div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160;<span class="comment"> * Finally closes the token stream. Note that untokenized keywords can be added with this method via </span></div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160;<span class="comment"> * {@link #CreateKeywordTokenStream(Collection)}, the Lucene contrib &lt;c&gt;KeywordTokenizer&lt;/c&gt; or similar utilities.</span></div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;<span class="comment"> * @param fieldName</span></div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160;<span class="comment"> * a name to be associated with the text</span></div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;<span class="comment"> * @param stream</span></div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;<span class="comment"> * the token stream to retrieve tokens from.</span></div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160;<span class="comment"> * @param boost</span></div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;<span class="comment"> * the boost factor for hits for this field</span></div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160;<span class="comment"> * @see org.apache.lucene.document.Field#setBoost(float)</span></div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00279"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#ae99b1c199a9777a9aa0403e694eb2c70"> 279</a></span>&#160; <span class="keyword">public</span> <span class="keywordtype">void</span> AddField(String fieldName, <a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html" title="A TokenStream enumerates the sequence of tokens, either from Fields of a Document or from query text...">TokenStream</a> stream, <span class="keywordtype">float</span> boost)</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; {</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keywordflow">try</span></div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; {</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="keywordflow">if</span> (fieldName == null)</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;fieldName must not be null&quot;</span>);</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">if</span> (stream == null)</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;token stream must not be null&quot;</span>);</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="keywordflow">if</span> (boost &lt;= 0.0f)</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;boost factor must be greater than 0.0&quot;</span>);</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keywordflow">if</span> (fields[fieldName] != null)</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;field must not be added more than once&quot;</span>);</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; var terms = <span class="keyword">new</span> HashMap&lt;String, ArrayIntList&gt;();</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keywordtype">int</span> numTokens = 0;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordtype">int</span> numOverlapTokens = 0;</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keywordtype">int</span> pos = -1;</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160;</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; var termAtt = stream.AddAttribute&lt;<a class="code" href="interface_lucene_1_1_net_1_1_analysis_1_1_tokenattributes_1_1_i_term_attribute.html" title="The term text of a Token.">ITermAttribute</a>&gt;();</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; var posIncrAttribute = stream.AddAttribute&lt;<a class="code" href="interface_lucene_1_1_net_1_1_analysis_1_1_tokenattributes_1_1_i_position_increment_attribute.html" title="The positionIncrement determines the position of this token relative to the previous Token in a Token...">IPositionIncrementAttribute</a>&gt;();</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; var offsetAtt = stream.AddAttribute&lt;<a class="code" href="interface_lucene_1_1_net_1_1_analysis_1_1_tokenattributes_1_1_i_offset_attribute.html" title="The start and end character offset of a Token. ">IOffsetAttribute</a>&gt;();</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; stream.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html#af7c4a3464dc78b1d0451492d9c520965" title="Resets this stream to the beginning. This is an optional operation, so subclasses may or may not impl...">Reset</a>();</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keywordflow">while</span> (stream.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html#a358a544108511440a57b134e722f6027" title="Consumers (i.e., IndexWriter) use this method to advance the stream to the next token. Implementing classes must implement this method and update the appropriate Util.Attributes with the attributes of the next token.">IncrementToken</a>())</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; {</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; String term = termAtt.Term;</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">if</span> (term.Length == 0) <span class="keywordflow">continue</span>; <span class="comment">// nothing to do</span></div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="comment">// if (DEBUG) System.Diagnostics.Debug.WriteLine(&quot;token=&#39;&quot; + term + &quot;&#39;&quot;);</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; numTokens++;</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="keywordtype">int</span> posIncr = posIncrAttribute.PositionIncrement;</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keywordflow">if</span> (posIncr == 0)</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; numOverlapTokens++;</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; pos += posIncr;</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160;</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; ArrayIntList positions = terms[term];</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">if</span> (positions == null)</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; {</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="comment">// term not seen before</span></div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; positions = <span class="keyword">new</span> ArrayIntList(stride);</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; terms[term] = positions;</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; }</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="keywordflow">if</span> (stride == 1)</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; {</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; positions.Add(pos);</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; }</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; {</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; positions.Add(pos, offsetAtt.StartOffset, offsetAtt.EndOffset);</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; }</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; }</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; stream.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html#a92b3c4eab12fbf83daa07b7684cfbcaf" title="This method is called by the consumer after the last token has been consumed, after IncrementToken re...">End</a>();</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="comment">// ensure infos.numTokens &gt; 0 invariant; needed for correct operation of terms()</span></div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordflow">if</span> (numTokens &gt; 0)</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; {</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; boost = boost*docBoost; <span class="comment">// see DocumentWriter.addDocument(...)</span></div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; fields[fieldName] = <span class="keyword">new</span> Info(terms, numTokens, numOverlapTokens, boost);</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; sortedFields = null; <span class="comment">// invalidate sorted view, if any</span></div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; }</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; }</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keywordflow">catch</span> (IOException e)</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; {</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="comment">// can never happen</span></div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> SystemException(<span class="keywordtype">string</span>.Empty, e);</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; }</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">finally</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; {</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">try</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; {</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">if</span> (stream != null) stream.<a class="code" href="class_lucene_1_1_net_1_1_analysis_1_1_token_stream.html#a5f66ac4c37218611b4a13f81f98332cd" title="Releases resources associated with this stream. ">Close</a>();</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; }</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="keywordflow">catch</span> (IOException e2)</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; {</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> SystemException(<span class="keywordtype">string</span>.Empty, e2);</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; }</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; }</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; }</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160;</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;<span class="comment"> * Creates and returns a searcher that can be used to execute arbitrary</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160;<span class="comment"> * Lucene queries and to collect the resulting query results as hits.</span></div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160;<span class="comment"> * @return a searcher</span></div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;</div>
<div class="line"><a name="l00364"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#af30f02d7db003f5cb220ead3cf4a6999"> 364</a></span>&#160; <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_index_searcher.html" title="Implements search over a single IndexReader.">IndexSearcher</a> CreateSearcher()</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; {</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; MemoryIndexReader reader = <span class="keyword">new</span> MemoryIndexReader(<span class="keyword">this</span>);</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_index_searcher.html" title="Implements search over a single IndexReader.">IndexSearcher</a> searcher = <span class="keyword">new</span> <a class="code" href="_more_like_this_8cs.html#a507bc55818dbcde9964f629543370b6f">IndexSearcher</a>(reader); <span class="comment">// ensures no auto-close !!</span></div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; reader.SetSearcher(searcher); <span class="comment">// to later get hold of searcher.getSimilarity()</span></div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keywordflow">return</span> searcher;</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; }</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160;</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160;<span class="comment"> * Convenience method that efficiently returns the relevance score by</span></div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160;<span class="comment"> * matching this index against the given Lucene query expression.</span></div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160;<span class="comment"> * @param query</span></div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160;<span class="comment"> * an arbitrary Lucene query to run against this index</span></div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160;<span class="comment"> * @return the relevance score of the matchmaking; A number in the range</span></div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160;<span class="comment"> * [0.0 .. 1.0], with 0.0 indicating no match. The higher the number</span></div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160;<span class="comment"> * the better the match.</span></div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160;</div>
<div class="line"><a name="l00384"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#a1440735a21037a2db07ae939fb3aed13"> 384</a></span>&#160; <span class="keyword">public</span> <span class="keywordtype">float</span> Search(<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_query.html" title="The abstract base class for queries. Instantiable subclasses are: TermQuery MultiTermQuery BooleanQ...">Query</a> query)</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; {</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="keywordflow">if</span> (query == null)</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> ArgumentException(<span class="stringliteral">&quot;query must not be null&quot;</span>);</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160;</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_searcher.html" title="An abstract base class for search implementations. Implements the main search methods.">Searcher</a> searcher = CreateSearcher();</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="keywordflow">try</span></div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; {</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="keywordtype">float</span>[] scores = <span class="keyword">new</span> <span class="keywordtype">float</span>[1]; <span class="comment">// inits to 0.0f (no match)</span></div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; searcher.<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_searcher.html#a4fa776037fe41a7fccc3c9d32057c258" title="Search implementation with arbitrary sorting. Finds the top n hits for query, applying filter if non-...">Search</a>(query, <span class="keyword">new</span> FillingCollector(scores));</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keywordtype">float</span> score = scores[0];</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">return</span> score;</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; }</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="keywordflow">catch</span> (IOException e)</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; {</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="comment">// can never happen (RAMDirectory)</span></div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> SystemException(<span class="keywordtype">string</span>.Empty, e);</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; }</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keywordflow">finally</span></div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; {</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="comment">// searcher.close();</span></div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;<span class="comment"> * Note that it is harmless and important for good performance to</span></div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160;<span class="comment"> * NOT close the index reader!!! This avoids all sorts of</span></div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;<span class="comment"> * unnecessary baggage and locking in the Lucene IndexReader</span></div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160;<span class="comment"> * superclass, all of which is completely unnecessary for this main</span></div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;<span class="comment"> * memory index data structure without thread-safety claims.</span></div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160;<span class="comment"> * Wishing IndexReader would be an interface...</span></div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160;<span class="comment"> * Actually with the new tight createSearcher() API auto-closing is now</span></div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160;<span class="comment"> * made impossible, hence searcher.close() would be harmless and also </span></div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;<span class="comment"> * would not degrade performance...</span></div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; }</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; }</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160;</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;<span class="comment"> * Returns a reasonable approximation of the main memory [bytes] consumed by</span></div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160;<span class="comment"> * this instance. Useful for smart memory sensititive caches/pools. Assumes</span></div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;<span class="comment"> * fieldNames are interned, whereas tokenized terms are memory-overlaid.</span></div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160;<span class="comment"> * @return the main memory consumption</span></div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00428"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#a1d5a1c6139867353429c2f1a4a2c5906"> 428</a></span>&#160; <span class="keyword">public</span> <span class="keywordtype">int</span> GetMemorySize()</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; {</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="comment">// for example usage in a smart cache see nux.xom.pool.Pool </span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="keywordtype">int</span> PTR = VM.PTR;</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keywordtype">int</span> INT = VM.INT;</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordtype">int</span> size = 0;</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; size += VM.SizeOfObject(2*PTR + INT); <span class="comment">// memory index</span></div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordflow">if</span> (sortedFields != null) size += VM.SizeOfObjectArray(sortedFields.Length);</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160;</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; size += VM.SizeOfHashMap(fields.Count);</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">foreach</span> (var entry <span class="keywordflow">in</span> fields)</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; {</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="comment">// for each Field Info</span></div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; Info info = entry.Value;</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; size += VM.SizeOfObject(2*INT + 3*PTR); <span class="comment">// Info instance vars</span></div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordflow">if</span> (info.SortedTerms != null) size += VM.SizeOfObjectArray(info.SortedTerms.Length);</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160;</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordtype">int</span> len = info.Terms.Count;</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; size += VM.SizeOfHashMap(len);</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160;</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; var iter2 = info.Terms.GetEnumerator();</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">while</span> (--len &gt;= 0)</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; {</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; iter2.MoveNext();</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="comment">// for each term</span></div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; KeyValuePair&lt;String, ArrayIntList&gt; e = iter2.Current;</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; size += VM.SizeOfObject(PTR + 3*INT); <span class="comment">// assumes substring() memory overlay</span></div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;<span class="comment">// size += STR + 2 * ((String) e.getKey()).length();</span></div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; ArrayIntList positions = e.Value;</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; size += VM.SizeOfArrayIntList(positions.Size());</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; }</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; }</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keywordflow">return</span> size;</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; }</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160;</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keyword">private</span> <span class="keywordtype">int</span> NumPositions(ArrayIntList positions)</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; {</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keywordflow">return</span> positions.Size()/stride;</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; }</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160;</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="comment">/* sorts into ascending order (on demand), reusing memory along the way */</span></div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160;</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keyword">private</span> <span class="keywordtype">void</span> SortFields()</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; {</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keywordflow">if</span> (sortedFields == null) sortedFields = <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_sort.html" title="Encapsulates sort criteria for returned hits.">Sort</a>(fields);</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; }</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160;</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="comment">/* returns a view of the given map&#39;s entries, sorted ascending by key */</span></div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160;</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> KeyValuePair&lt;TKey, TValue&gt;[] <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_sort.html" title="Encapsulates sort criteria for returned hits.">Sort&lt;TKey, TValue&gt;</a>(<a class="code" href="class_lucene_1_1_net_1_1_support_1_1_hash_map_3_01_t_key_00_01_t_value_01_4.html" title="A C# emulation of the Java Hashmap">HashMap&lt;TKey, TValue&gt;</a> map)</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; where TKey : <span class="keyword">class</span>, IComparable&lt;TKey&gt;</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; {</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="keywordtype">int</span> size = map.Count;</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160;</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; var entries = map.ToArray();</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160;</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keywordflow">if</span> (size &gt; 1) Array.<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_sort.html#a587d838350e158068bb3b42faf49fb9a" title="Sorts by computed relevance. This is the same sort criteria as calling Searcher.Search(Query,int)without a sort criteria, only with slightly more overhead. ">Sort</a>(entries, TermComparer.KeyComparer);</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">return</span> entries;</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; }</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160;</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160;<span class="comment"> * Returns a String representation of the index data for debugging purposes.</span></div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160;<span class="comment"> * @return the string representation</span></div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160;</div>
<div class="line"><a name="l00494"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_memory_index.html#ab9c72a22b62302785eb2604830f23a97"> 494</a></span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> String ToString()</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; {</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; StringBuilder result = <span class="keyword">new</span> StringBuilder(256);</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; SortFields();</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="keywordtype">int</span> sumChars = 0;</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordtype">int</span> sumPositions = 0;</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keywordtype">int</span> sumTerms = 0;</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; sortedFields.Length; i++)</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; {</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; KeyValuePair&lt;String, Info&gt; entry = sortedFields[i];</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; String fieldName = entry.Key;</div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; Info info = entry.Value;</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; info.SortTerms();</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; result.Append(fieldName + <span class="stringliteral">&quot;:\n&quot;</span>);</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160;</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="keywordtype">int</span> numChars = 0;</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordtype">int</span> numPos = 0;</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; info.SortedTerms.Length; j++)</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; {</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; KeyValuePair&lt;String, ArrayIntList&gt; e = info.SortedTerms[j];</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; String term = e.Key;</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; ArrayIntList positions = e.Value;</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; result.Append(<span class="stringliteral">&quot;\t&#39;&quot;</span> + term + <span class="stringliteral">&quot;&#39;:&quot;</span> + NumPositions(positions) + <span class="stringliteral">&quot;:&quot;</span>);</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; result.Append(positions.ToString(stride)); <span class="comment">// ignore offsets</span></div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; result.Append(<span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; numPos += NumPositions(positions);</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; numChars += term.Length;</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; }</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160;</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; result.Append(<span class="stringliteral">&quot;\tterms=&quot;</span> + info.SortedTerms.Length);</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; result.Append(<span class="stringliteral">&quot;, positions=&quot;</span> + numPos);</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; result.Append(<span class="stringliteral">&quot;, Kchars=&quot;</span> + (numChars/1000.0f));</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; result.Append(<span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; sumPositions += numPos;</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; sumChars += numChars;</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; sumTerms += info.SortedTerms.Length;</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; }</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; result.Append(<span class="stringliteral">&quot;\nfields=&quot;</span> + sortedFields.Length);</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; result.Append(<span class="stringliteral">&quot;, terms=&quot;</span> + sumTerms);</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; result.Append(<span class="stringliteral">&quot;, positions=&quot;</span> + sumPositions);</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; result.Append(<span class="stringliteral">&quot;, Kchars=&quot;</span> + (sumChars/1000.0f));</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keywordflow">return</span> result.ToString();</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; }</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160;</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160;</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="comment">// Nested classes:</span></div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;<span class="comment"></span> <span class="comment">/*</span></div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;<span class="comment"> * Index data structure for a field; Contains the tokenized term texts and</span></div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;<span class="comment"> * their positions.</span></div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160;</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; [Serializable]</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="keyword">private</span> sealed <span class="keyword">class </span>Info</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; {</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly IComparer&lt;KeyValuePair&lt;string, Info&gt;&gt; InfoComparer = <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_term_comparer.html">TermComparer&lt;Info&gt;</a>();</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly IComparer&lt;KeyValuePair&lt;string, ArrayIntList&gt;&gt; ArrayIntListComparer = <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_index_1_1_memory_1_1_term_comparer.html">TermComparer&lt;ArrayIntList&gt;</a>(); </div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160;<span class="comment"> * Term strings and their positions for this field: Map &lt;String</span></div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160;<span class="comment"> * termText, ArrayIntList positions&gt;</span></div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keyword">private</span> HashMap&lt;String, ArrayIntList&gt; terms;</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160;</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="comment">/* Terms sorted ascending by term text; computed on demand */</span></div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; [NonSerialized] <span class="keyword">private</span> KeyValuePair&lt;String, ArrayIntList&gt;[] sortedTerms;</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160;</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="comment">/* Number of added tokens for this field */</span></div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="keyword">private</span> <span class="keywordtype">int</span> numTokens;</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160;</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="comment">/* Number of overlapping tokens for this field */</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="keyword">private</span> <span class="keywordtype">int</span> numOverlapTokens;</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160;</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="comment">/* Boost factor for hits for this field */</span></div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keyword">private</span> <span class="keywordtype">float</span> boost;</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160;</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <span class="comment">/* Term for this field&#39;s fieldName, lazily computed on demand */</span></div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; [NonSerialized] <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_index_1_1_term.html" title="A Term represents a word from text. This is the unit of search. It is composed of two elements...">Term</a> <span class="keyword">template</span>;</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160;</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> <span class="keywordtype">long</span> serialVersionUID = 2882195016849084649L;</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160;</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keyword">public</span> Info(HashMap&lt;String, ArrayIntList&gt; terms, <span class="keywordtype">int</span> numTokens, <span class="keywordtype">int</span> numOverlapTokens, <span class="keywordtype">float</span> boost)</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; {</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; this.terms = terms;</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; this.numTokens = numTokens;</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; this.NumOverlapTokens = numOverlapTokens;</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; this.boost = boost;</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; }</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160;</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keyword">public</span> HashMap&lt;string, ArrayIntList&gt; Terms</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; {</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> terms; }</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; }</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="keyword">public</span> <span class="keywordtype">int</span> NumTokens</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; {</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> numTokens; }</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; }</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160;</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keyword">public</span> <span class="keywordtype">int</span> NumOverlapTokens</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; {</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> numOverlapTokens; }</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <span class="keyword">set</span> { numOverlapTokens = value; }</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; }</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160;</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keyword">public</span> <span class="keywordtype">float</span> Boost</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; {</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> boost; }</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; }</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160;</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="keyword">public</span> KeyValuePair&lt;string, ArrayIntList&gt;[] SortedTerms</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; {</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <span class="keyword">get</span> { <span class="keywordflow">return</span> sortedTerms; }</div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; }</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;<span class="comment"> * Sorts hashed terms into ascending order, reusing memory along the</span></div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;<span class="comment"> * way. Note that sorting is lazily delayed until required (often it&#39;s</span></div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;<span class="comment"> * not required at all). If a sorted view is required then hashing +</span></div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;<span class="comment"> * sort + binary search is still faster and smaller than TreeMap usage</span></div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;<span class="comment"> * (which would be an alternative and somewhat more elegant approach,</span></div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160;<span class="comment"> * apart from more sophisticated Tries / prefix trees).</span></div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160;</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; <span class="keyword">public</span> <span class="keywordtype">void</span> SortTerms()</div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; {</div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <span class="keywordflow">if</span> (SortedTerms == null) sortedTerms = <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_sort.html" title="Encapsulates sort criteria for returned hits.">Sort</a>(Terms);</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; }</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="comment">/* note that the frequency can be calculated as numPosition(getPositions(x)) */</span></div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160;</div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="keyword">public</span> ArrayIntList GetPositions(String term)</div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; {</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <span class="keywordflow">return</span> Terms[term];</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; }</div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160;</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="comment">/* note that the frequency can be calculated as numPosition(getPositions(x)) */</span></div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160;</div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keyword">public</span> ArrayIntList GetPositions(<span class="keywordtype">int</span> pos)</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; {</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <span class="keywordflow">return</span> SortedTerms[pos].Value;</div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; }</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; }</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160;</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160;</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; <span class="comment">// Nested classes:</span></div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160;<span class="comment"></span> <span class="comment">/*</span></div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160;<span class="comment"> * Efficient resizable auto-expanding list holding &lt;c&gt;int&lt;/c&gt; elements;</span></div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160;<span class="comment"> * implemented with arrays.</span></div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160;</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; [Serializable]</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <span class="keyword">private</span> sealed <span class="keyword">class </span>ArrayIntList</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; {</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;</div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keyword">private</span> <span class="keywordtype">int</span>[] elements;</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <span class="keyword">private</span> <span class="keywordtype">int</span> size = 0;</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160;</div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> <span class="keywordtype">long</span> serialVersionUID = 2282195016849084649L;</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160;</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="keyword">private</span> ArrayIntList()</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; : this(10)</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; {</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160;</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; }</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160;</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="keyword">public</span> ArrayIntList(<span class="keywordtype">int</span> initialCapacity)</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; {</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; elements = <span class="keyword">new</span> <span class="keywordtype">int</span>[initialCapacity];</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; }</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160;</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keyword">public</span> <span class="keywordtype">void</span> Add(<span class="keywordtype">int</span> elem)</div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; {</div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; <span class="keywordflow">if</span> (size == elements.Length) EnsureCapacity(size + 1);</div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; elements[size++] = elem;</div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; }</div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160;</div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; <span class="keyword">public</span> <span class="keywordtype">void</span> Add(<span class="keywordtype">int</span> pos, <span class="keywordtype">int</span> start, <span class="keywordtype">int</span> end)</div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; {</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">if</span> (size + 3 &gt; elements.Length) EnsureCapacity(size + 3);</div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; elements[size] = pos;</div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; elements[size + 1] = start;</div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; elements[size + 2] = end;</div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; size += 3;</div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; }</div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160;</div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="keyword">public</span> <span class="keywordtype">int</span> Get(<span class="keywordtype">int</span> index)</div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; {</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="keywordflow">if</span> (index &gt;= size) ThrowIndex(index);</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <span class="keywordflow">return</span> elements[index];</div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; }</div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;</div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="keyword">public</span> <span class="keywordtype">int</span> Size()</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; {</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; <span class="keywordflow">return</span> size;</div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; }</div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160;</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; <span class="keyword">public</span> <span class="keywordtype">int</span>[] ToArray(<span class="keywordtype">int</span> stride)</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; {</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="keywordtype">int</span>[] arr = <span class="keyword">new</span> <span class="keywordtype">int</span>[Size()/stride];</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keywordflow">if</span> (stride == 1)</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; {</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; Array.Copy(elements, 0, arr, 0, size);</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; }</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; {</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0, j = 0; j &lt; size; i++, j += stride) arr[i] = elements[j];</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; }</div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keywordflow">return</span> arr;</div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; }</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160;</div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="keyword">private</span> <span class="keywordtype">void</span> EnsureCapacity(<span class="keywordtype">int</span> minCapacity)</div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; {</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordtype">int</span> newCapacity = Math.Max(minCapacity, (elements.Length*3)/2 + 1);</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keywordtype">int</span>[] newElements = <span class="keyword">new</span> <span class="keywordtype">int</span>[newCapacity];</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; Array.Copy(elements, 0, newElements, 0, size);</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; elements = newElements;</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; }</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160;</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="keyword">private</span> <span class="keywordtype">void</span> ThrowIndex(<span class="keywordtype">int</span> index)</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; {</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> IndexOutOfRangeException(<span class="stringliteral">&quot;index: &quot;</span> + index</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; + <span class="stringliteral">&quot;, size: &quot;</span> + size);</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; }</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160;</div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="comment">/* returns the first few positions (without offsets); debug only */</span></div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160;</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; <span class="keyword">public</span> <span class="keywordtype">string</span> ToString(<span class="keywordtype">int</span> stride)</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; {</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="keywordtype">int</span> s = Size()/stride;</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <span class="keywordtype">int</span> len = Math.Min(10, s); <span class="comment">// avoid printing huge lists</span></div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; StringBuilder buf = <span class="keyword">new</span> StringBuilder(4*len);</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; buf.Append(<span class="stringliteral">&quot;[&quot;</span>);</div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; len; i++)</div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; {</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; buf.Append(Get(i*stride));</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keywordflow">if</span> (i &lt; len - 1) buf.Append(<span class="stringliteral">&quot;, &quot;</span>);</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; }</div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keywordflow">if</span> (len != s) buf.Append(<span class="stringliteral">&quot;, ...&quot;</span>); <span class="comment">// and some more...</span></div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; buf.Append(<span class="stringliteral">&quot;]&quot;</span>);</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <span class="keywordflow">return</span> buf.ToString();</div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; }</div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; }</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160;</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160;</div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; <span class="comment">// Nested classes:</span></div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160;<span class="comment"></span> <span class="keyword">private</span> <span class="keyword">static</span> readonly <a class="code" href="_more_like_this_8cs.html#a8797eb30ce21b31829d3e3a43a20e3b9">Term</a> MATCH_ALL_TERM = <span class="keyword">new</span> <a class="code" href="_more_like_this_8cs.html#a8797eb30ce21b31829d3e3a43a20e3b9">Term</a>(<span class="stringliteral">&quot;&quot;</span>);</div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160;</div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160;<span class="comment"> * Search support for Lucene framework integration; implements all methods</span></div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160;<span class="comment"> * required by the Lucene IndexReader contracts.</span></div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160;</div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <span class="keyword">private</span> sealed <span class="keyword">partial class </span>MemoryIndexReader : <a class="code" href="_more_like_this_8cs.html#a2a6914ea10bbe06764856e29e5674e66">IndexReader</a></div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; {</div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="keyword">private</span> readonly MemoryIndex _index;</div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160;</div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; <span class="keyword">private</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_searcher.html" title="An abstract base class for search implementations. Implements the main search methods.">Searcher</a> searcher; <span class="comment">// needed to find searcher.getSimilarity() </span></div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160;</div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; <span class="keyword">internal</span> MemoryIndexReader(MemoryIndex index)</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; {</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; _index = index;</div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; }</div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160;</div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <span class="keyword">private</span> Info GetInfo(String fieldName)</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; {</div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; <span class="keywordflow">return</span> _index.fields[fieldName];</div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; }</div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160;</div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; <span class="keyword">private</span> Info GetInfo(<span class="keywordtype">int</span> pos)</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; {</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <span class="keywordflow">return</span> _index.sortedFields[pos].Value;</div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; }</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160;</div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">int</span> DocFreq(<a class="code" href="_more_like_this_8cs.html#a8797eb30ce21b31829d3e3a43a20e3b9">Term</a> term)</div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; {</div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; Info info = GetInfo(term.Field);</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; <span class="keywordtype">int</span> freq = 0;</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; <span class="keywordflow">if</span> (info != null) freq = info.GetPositions(term.Text) != null ? 1 : 0;</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.docFreq: &quot;</span> + term + <span class="stringliteral">&quot;, freq:&quot;</span> + freq);</div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; <span class="keywordflow">return</span> freq;</div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; }</div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160;</div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <a class="code" href="_field_cache_impl_8cs.html#a9ad914d1fb876bdbb16a70f17895b145">TermEnum</a> Terms()</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; {</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.terms()&quot;</span>);</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; <span class="keywordflow">return</span> Terms(MATCH_ALL_TERM);</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; }</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160;</div>
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <a class="code" href="_field_cache_impl_8cs.html#a9ad914d1fb876bdbb16a70f17895b145">TermEnum</a> Terms(<a class="code" href="_more_like_this_8cs.html#a8797eb30ce21b31829d3e3a43a20e3b9">Term</a> term)</div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; {</div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.terms: &quot;</span> + term);</div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160;</div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; <span class="keywordtype">int</span> i; <span class="comment">// index into info.sortedTerms</span></div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; <span class="keywordtype">int</span> j; <span class="comment">// index into sortedFields</span></div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160;</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; _index.SortFields();</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <span class="keywordflow">if</span> (_index.sortedFields.Length == 1 &amp;&amp; _index.sortedFields[0].Key == term.Field)</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; {</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; j = 0; <span class="comment">// fast path</span></div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; }</div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; {</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; j = Array.BinarySearch(_index.sortedFields, <span class="keyword">new</span> KeyValuePair&lt;string, Info&gt;(term.Field, null), Info.InfoComparer);</div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; }</div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160;</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <span class="keywordflow">if</span> (j &lt; 0)</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; {</div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; <span class="comment">// not found; choose successor</span></div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; j = -j - 1;</div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; i = 0;</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; <span class="keywordflow">if</span> (j &lt; _index.sortedFields.Length) GetInfo(j).SortTerms();</div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; }</div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; {</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; <span class="comment">// found</span></div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; Info info = GetInfo(j);</div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; info.SortTerms();</div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; i = Array.BinarySearch(info.SortedTerms, <span class="keyword">new</span> KeyValuePair&lt;string, ArrayIntList&gt;(term.Text, null), Info.ArrayIntListComparer);</div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="keywordflow">if</span> (i &lt; 0)</div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; {</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <span class="comment">// not found; choose successor</span></div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; i = -i - 1;</div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <span class="keywordflow">if</span> (i &gt;= info.SortedTerms.Length)</div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; {</div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; <span class="comment">// move to next successor</span></div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; j++;</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; i = 0;</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">if</span> (j &lt; _index.sortedFields.Length) GetInfo(j).SortTerms();</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; }</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; }</div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; }</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <span class="keywordtype">int</span> ix = i;</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; <span class="keywordtype">int</span> jx = j;</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160;</div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; <span class="keywordflow">return</span> <span class="keyword">new</span> MemoryTermEnum(_index, <span class="keyword">this</span>, ix, jx);</div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; }</div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160;</div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <a class="code" href="core_2_analysis_2_token_8cs.html#a17a77b770c87cb0e7153982c4171bfcc">TermPositions</a> <a class="code" href="core_2_analysis_2_token_8cs.html#a17a77b770c87cb0e7153982c4171bfcc">TermPositions</a>()</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; {</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.termPositions&quot;</span>);</div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160;</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keywordflow">return</span> <span class="keyword">new</span> MemoryTermPositions(_index, <span class="keyword">this</span>);</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; }</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160;</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160;</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <a class="code" href="_field_cache_impl_8cs.html#a058de2d1c801e53325f35357f213391f">TermDocs</a> <a class="code" href="_field_cache_impl_8cs.html#a058de2d1c801e53325f35357f213391f">TermDocs</a>()</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; {</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.termDocs&quot;</span>);</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <span class="keywordflow">return</span> <a class="code" href="core_2_analysis_2_token_8cs.html#a17a77b770c87cb0e7153982c4171bfcc">TermPositions</a>();</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; }</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160;</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> ITermFreqVector[] GetTermFreqVectors(<span class="keywordtype">int</span> docNumber)</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; {</div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.getTermFreqVectors&quot;</span>);</div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="comment">// This is okay, ToArray() is as optimized as writing it by hand</span></div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <span class="keywordflow">return</span> _index.fields.Keys.Select(k =&gt; GetTermFreqVector(docNumber, k)).ToArray();</div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; }</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160;</div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">void</span> GetTermFreqVector(<span class="keywordtype">int</span> docNumber, TermVectorMapper mapper)</div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; {</div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.getTermFreqVectors&quot;</span>);</div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160;</div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; <span class="comment">// if (vectors.length == 0) return null;</span></div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <span class="keywordflow">foreach</span> (String fieldName <span class="keywordflow">in</span> _index.fields.Keys)</div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; {</div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; GetTermFreqVector(docNumber, fieldName, mapper);</div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; }</div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; }</div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160;</div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">void</span> GetTermFreqVector(<span class="keywordtype">int</span> docNumber, String field, TermVectorMapper mapper)</div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; {</div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.getTermFreqVector&quot;</span>);</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; Info info = GetInfo(field);</div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="keywordflow">if</span> (info == null)</div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; {</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; }</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; info.SortTerms();</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; mapper.SetExpectations(field, info.SortedTerms.Length, _index.stride != 1, <span class="keyword">true</span>);</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = info.SortedTerms.Length; --i &gt;= 0;)</div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; {</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160;</div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; ArrayIntList positions = info.SortedTerms[i].Value;</div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; <span class="keywordtype">int</span> size = positions.Size();</div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; var offsets = <span class="keyword">new</span> TermVectorOffsetInfo[size/_index.stride];</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160;</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0, j = 1; j &lt; size; k++, j += _index.stride)</div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; {</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; <span class="keywordtype">int</span> start = positions.Get(j);</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; <span class="keywordtype">int</span> end = positions.Get(j + 1);</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; offsets[k] = <span class="keyword">new</span> TermVectorOffsetInfo(start, end);</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; }</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; mapper.Map(info.SortedTerms[i].Key, _index.NumPositions(info.SortedTerms[i].Value), offsets,</div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; (info.SortedTerms[i].Value).ToArray(_index.stride));</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; }</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; }</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160;</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> ITermFreqVector GetTermFreqVector(<span class="keywordtype">int</span> docNumber, String fieldName)</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; {</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.getTermFreqVector&quot;</span>);</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; Info info = GetInfo(fieldName);</div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <span class="keywordflow">if</span> (info == null) <span class="keywordflow">return</span> null; <span class="comment">// TODO: or return empty vector impl???</span></div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; info.SortTerms();</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160;</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; <span class="keywordflow">return</span> <span class="keyword">new</span> MemoryTermPositionVector(_index, info, fieldName);</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; }</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160;</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; <span class="keyword">private</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_similarity.html" title="Expert: Scoring API. Subclasses implement search scoring.">Similarity</a> GetSimilarity()</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; {</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; <span class="keywordflow">if</span> (searcher != null) <span class="keywordflow">return</span> searcher.<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_searcher.html#a55a253cf1562ad7f1779d6f76f84c2de" title="Expert: Gets or Sets the Similarity implementation used by this Searcher.">Similarity</a>;</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; <span class="keywordflow">return</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_similarity.html" title="Expert: Scoring API. Subclasses implement search scoring.">Similarity</a>.<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_similarity.html#a374d891e671bbaca17d776be505bc944" title="Gets or sets the default Similarity implementation used by indexing and search code. This is initially an instance of DefaultSimilarity. ">Default</a>;</div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; }</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160;</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="keyword">internal</span> <span class="keywordtype">void</span> SetSearcher(<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_searcher.html" title="An abstract base class for search implementations. Implements the main search methods.">Searcher</a> searcher)</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; {</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; this.searcher = searcher;</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; }</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160;</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <span class="comment">/* performance hack: cache norms to avoid repeated expensive calculations */</span></div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; <span class="keyword">private</span> byte[] cachedNorms;</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <span class="keyword">private</span> String cachedFieldName;</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="keyword">private</span> <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_similarity.html" title="Expert: Scoring API. Subclasses implement search scoring.">Similarity</a> cachedSimilarity;</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160;</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> byte[] Norms(String fieldName)</div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; {</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; byte[] norms = cachedNorms;</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_similarity.html" title="Expert: Scoring API. Subclasses implement search scoring.">Similarity</a> sim = GetSimilarity();</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; <span class="keywordflow">if</span> (fieldName != cachedFieldName || sim != cachedSimilarity)</div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; {</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; <span class="comment">// not cached?</span></div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; Info info = GetInfo(fieldName);</div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; <span class="keywordtype">int</span> numTokens = info != null ? info.NumTokens : 0;</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; <span class="keywordtype">int</span> numOverlapTokens = info != null ? info.NumOverlapTokens : 0;</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <span class="keywordtype">float</span> boost = info != null ? info.Boost : 1.0f;</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; <a class="code" href="_fieldable_8cs.html#a7e48939924d26d58803de390e852a01c">FieldInvertState</a> invertState = <span class="keyword">new</span> <a class="code" href="_fieldable_8cs.html#a7e48939924d26d58803de390e852a01c">FieldInvertState</a>(0, numTokens, numOverlapTokens, 0, boost);</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; <span class="keywordtype">float</span> n = sim.<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_similarity.html#accbd724f439b07b64379b590bcd2ba81" title="Compute the normalization value for a field, given the accumulated state of term processing for this ...">ComputeNorm</a>(fieldName, invertState);</div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; byte norm = <a class="code" href="class_lucene_1_1_net_1_1_search_1_1_similarity.html" title="Expert: Scoring API. Subclasses implement search scoring.">Similarity</a>.<a class="code" href="class_lucene_1_1_net_1_1_search_1_1_similarity.html#abb8c94a5e3079a47004af1bf117af1de" title="Encodes a normalization factor for storage in an index.">EncodeNorm</a>(n);</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; norms = <span class="keyword">new</span> byte[] {norm};</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160;</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="comment">// cache it for future reuse</span></div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; cachedNorms = norms;</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; cachedFieldName = fieldName;</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; cachedSimilarity = sim;</div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <span class="keywordflow">if</span> (DEBUG)</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.norms: &quot;</span> + fieldName + <span class="stringliteral">&quot;:&quot;</span> + n + <span class="stringliteral">&quot;:&quot;</span> +</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; norm + <span class="stringliteral">&quot;:&quot;</span> + numTokens);</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; }</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; <span class="keywordflow">return</span> norms;</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; }</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160;</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">void</span> Norms(String fieldName, byte[] bytes, <span class="keywordtype">int</span> offset)</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; {</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.norms*: &quot;</span> + fieldName);</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; byte[] norms = Norms(fieldName);</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; Buffer.BlockCopy(norms, 0, bytes, offset, norms.Length);</div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; }</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160;</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> DoSetNorm(<span class="keywordtype">int</span> doc, String fieldName, byte value)</div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; {</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> NotSupportedException();</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; }</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160;</div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">int</span> NumDocs()</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; {</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.numDocs&quot;</span>);</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; <span class="keywordflow">return</span> _index.fields.Count &gt; 0 ? 1 : 0;</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; }</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160;</div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">int</span> MaxDoc</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; {</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; <span class="keyword">get</span></div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; {</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.maxDoc&quot;</span>);</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; }</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; }</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160;</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <a class="code" href="class_lucene_1_1_net_1_1_documents_1_1_document.html" title="Documents are the unit of indexing and search.">Document</a> <a class="code" href="_more_like_this_8cs.html#a2ad6aef8641c7b7a6cf9277f7d54b2cd">Document</a>(<span class="keywordtype">int</span> n)</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; {</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.document&quot;</span>);</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="_more_like_this_8cs.html#a2ad6aef8641c7b7a6cf9277f7d54b2cd">Document</a>(); <span class="comment">// there are no stored fields</span></div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; }</div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160;</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; <span class="comment">//When we convert to JDK 1.5 make this Set&lt;String&gt;</span></div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <a class="code" href="class_lucene_1_1_net_1_1_documents_1_1_document.html" title="Documents are the unit of indexing and search.">Document</a> <a class="code" href="_more_like_this_8cs.html#a2ad6aef8641c7b7a6cf9277f7d54b2cd">Document</a>(<span class="keywordtype">int</span> n, <a class="code" href="interface_lucene_1_1_net_1_1_documents_1_1_field_selector.html" title="Similar to a java.io.FileFilter, the FieldSelector allows one to make decisions about what Fields get...">FieldSelector</a> fieldSelector)</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; {</div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.document&quot;</span>);</div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="_more_like_this_8cs.html#a2ad6aef8641c7b7a6cf9277f7d54b2cd">Document</a>(); <span class="comment">// there are no stored fields</span></div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; }</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160;</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">bool</span> IsDeleted(<span class="keywordtype">int</span> n)</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; {</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.isDeleted&quot;</span>);</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; }</div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160;</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">bool</span> HasDeletions</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; {</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keyword">get</span></div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; {</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.hasDeletions&quot;</span>);</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; }</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; }</div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> DoDelete(<span class="keywordtype">int</span> docNum)</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; {</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> NotSupportedException();</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; }</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> DoUndeleteAll()</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; {</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> NotSupportedException();</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; }</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> DoCommit(IDictionary&lt;String, String&gt; commitUserData)</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; {</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.doCommit&quot;</span>);</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; }</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> DoClose()</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; {</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.doClose&quot;</span>);</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; }</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; <span class="comment">// lucene &gt;= 1.9 (remove this method for lucene-1.4.3)</span></div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; <span class="keyword">public</span> <span class="keyword">override</span> ICollection&lt;String&gt; GetFieldNames(<a class="code" href="_segment_merger_8cs.html#a55267fd2a5afc41fc5c0adfa315f3694">FieldOption</a> fieldOption)</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; {</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; <span class="keywordflow">if</span> (DEBUG) System.Diagnostics.Debug.WriteLine(<span class="stringliteral">&quot;MemoryIndexReader.getFieldNamesOption&quot;</span>);</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; <span class="keywordflow">if</span> (fieldOption == <a class="code" href="_segment_merger_8cs.html#a55267fd2a5afc41fc5c0adfa315f3694">FieldOption</a>.UNINDEXED)</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; <span class="keywordflow">return</span> <a class="code" href="class_lucene_1_1_net_1_1_support_1_1_collections_helper.html" title="Support class used to handle Hashtable addition, which does a check first to make sure the added item...">CollectionsHelper&lt;string&gt;</a>.EmptyList();</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; <span class="keywordflow">if</span> (fieldOption == <a class="code" href="_segment_merger_8cs.html#a55267fd2a5afc41fc5c0adfa315f3694">FieldOption</a>.INDEXED_NO_TERMVECTOR)</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; <span class="keywordflow">return</span> <a class="code" href="class_lucene_1_1_net_1_1_support_1_1_collections_helper.html" title="Support class used to handle Hashtable addition, which does a check first to make sure the added item...">CollectionsHelper&lt;string&gt;</a>.EmptyList();</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; <span class="keywordflow">if</span> (fieldOption == <a class="code" href="_segment_merger_8cs.html#a55267fd2a5afc41fc5c0adfa315f3694">FieldOption</a>.TERMVECTOR_WITH_OFFSET &amp;&amp; _index.stride == 1)</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; <span class="keywordflow">return</span> <a class="code" href="class_lucene_1_1_net_1_1_support_1_1_collections_helper.html" title="Support class used to handle Hashtable addition, which does a check first to make sure the added item...">CollectionsHelper&lt;string&gt;</a>.EmptyList();</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; <span class="keywordflow">if</span> (fieldOption == <a class="code" href="_segment_merger_8cs.html#a55267fd2a5afc41fc5c0adfa315f3694">FieldOption</a>.TERMVECTOR_WITH_POSITION_OFFSET &amp;&amp; _index.stride == 1)</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; <span class="keywordflow">return</span> <a class="code" href="class_lucene_1_1_net_1_1_support_1_1_collections_helper.html" title="Support class used to handle Hashtable addition, which does a check first to make sure the added item...">CollectionsHelper&lt;string&gt;</a>.EmptyList();</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="keywordflow">return</span> _index.fields.Keys.AsReadOnly();</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; }</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; }</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; <span class="comment">// Nested classes:</span></div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;<span class="comment"></span> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class </span>VM</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; {</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> PTR = Is64BitVM() ? 8 : 4;</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; <span class="comment">// bytes occupied by primitive data types</span></div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> BOOLEAN = 1;</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> BYTE = 1;</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> CHAR = 2;</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> SHORT = 2;</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> INT = 4;</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> LONG = 8;</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> FLOAT = 4;</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> DOUBLE = 8;</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> LOG_PTR = (int) Math.Round(Log2(PTR));</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;<span class="comment"> * Object header of any heap allocated Java object. </span></div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;<span class="comment"> * ptr to class, info for monitor, gc, hash, etc.</span></div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> readonly <span class="keywordtype">int</span> OBJECT_HEADER = 2*PTR;</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; <span class="comment">// assumes n &gt; 0</span></div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; <span class="comment">// 64 bit VM:</span></div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; <span class="comment">// 0 --&gt; 0*PTR</span></div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; <span class="comment">// 1..8 --&gt; 1*PTR</span></div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; <span class="comment">// 9..16 --&gt; 2*PTR</span></div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOf(<span class="keywordtype">int</span> n)</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; {</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; <span class="keywordflow">return</span> (((n - 1) &gt;&gt; LOG_PTR) + 1) &lt;&lt; LOG_PTR;</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; }</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOfObject(<span class="keywordtype">int</span> n)</div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; {</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; <span class="keywordflow">return</span> SizeOf(OBJECT_HEADER + n);</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; }</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOfObjectArray(<span class="keywordtype">int</span> len)</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; {</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; <span class="keywordflow">return</span> SizeOfObject(INT + PTR*len);</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; }</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOfCharArray(<span class="keywordtype">int</span> len)</div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; {</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; <span class="keywordflow">return</span> SizeOfObject(INT + CHAR*len);</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; }</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOfIntArray(<span class="keywordtype">int</span> len)</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; {</div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="keywordflow">return</span> SizeOfObject(INT + INT*len);</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; }</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOfString(<span class="keywordtype">int</span> len)</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; {</div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; <span class="keywordflow">return</span> SizeOfObject(3*INT + PTR) + SizeOfCharArray(len);</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; }</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOfHashMap(<span class="keywordtype">int</span> len)</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; {</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; <span class="keywordflow">return</span> SizeOfObject(4*PTR + 4*INT) + SizeOfObjectArray(len)</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; + len*SizeOfObject(3*PTR + INT); <span class="comment">// entries</span></div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; }</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="comment">// note: does not include referenced objects</span></div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOfArrayList(<span class="keywordtype">int</span> len)</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; {</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; <span class="keywordflow">return</span> SizeOfObject(PTR + 2*INT) + SizeOfObjectArray(len);</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; }</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">int</span> SizeOfArrayIntList(<span class="keywordtype">int</span> len)</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; {</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; <span class="keywordflow">return</span> SizeOfObject(PTR + INT) + SizeOfIntArray(len);</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; }</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;</div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> Is64BitVM()</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; {</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; <span class="keywordflow">return</span> IntPtr.Size == 8;</div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; }</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; <span class="comment">/* logarithm to the base 2. Example: log2(4) == 2, log2(8) == 3 */</span></div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; <span class="keyword">private</span> <span class="keyword">static</span> <span class="keywordtype">double</span> Log2(<span class="keywordtype">double</span> value)</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; {</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; <span class="keywordflow">return</span> Math.Log(value, 2);</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; <span class="comment">//return Math.Log(value) / Math.Log(2);</span></div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; }</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; }</div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; }</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu Jan 3 2013 02:12:43 for Lucene.Net by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.3
</small></address>
</body>
</html>