You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by sy...@apache.org on 2014/09/19 16:19:52 UTC

[19/21] More work on Lucene.Net.Queries

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ba0f3c7d/src/Lucene.Net.Queries/CustomScoreProvider.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Queries/CustomScoreProvider.cs b/src/Lucene.Net.Queries/CustomScoreProvider.cs
index 5491c86..d365695 100644
--- a/src/Lucene.Net.Queries/CustomScoreProvider.cs
+++ b/src/Lucene.Net.Queries/CustomScoreProvider.cs
@@ -1,192 +1,177 @@
-namespace org.apache.lucene.queries
-{
-
-	/*
-	 * Licensed to the Apache Software Foundation (ASF) under one or more
-	 * contributor license agreements.  See the NOTICE file distributed with
-	 * this work for additional information regarding copyright ownership.
-	 * The ASF licenses this file to You under the Apache License, Version 2.0
-	 * (the "License"); you may not use this file except in compliance with
-	 * the License.  You may obtain a copy of the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS,
-	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-	 * See the License for the specific language governing permissions and
-	 * limitations under the License.
-	 */
+using System.Linq;
+using Lucene.Net.Index;
+using Lucene.Net.Queries.Function;
+using Lucene.Net.Search;
+using org.apache.lucene.queries;
 
-	using AtomicReaderContext = org.apache.lucene.index.AtomicReaderContext;
-	using IndexReader = org.apache.lucene.index.IndexReader; // for javadocs
-	using FunctionQuery = org.apache.lucene.queries.function.FunctionQuery;
-	using Explanation = org.apache.lucene.search.Explanation;
-	using FieldCache = org.apache.lucene.search.FieldCache; // for javadocs
-
-	/// <summary>
-	/// An instance of this subclass should be returned by
-	/// <seealso cref="CustomScoreQuery#getCustomScoreProvider"/>, if you want
-	/// to modify the custom score calculation of a <seealso cref="CustomScoreQuery"/>.
-	/// <para>Since Lucene 2.9, queries operate on each segment of an index separately,
-	/// so the protected <seealso cref="#context"/> field can be used to resolve doc IDs,
-	/// as the supplied <code>doc</code> ID is per-segment and without knowledge
-	/// of the IndexReader you cannot access the document or <seealso cref="FieldCache"/>.
-	/// 
-	/// @lucene.experimental
-	/// @since 2.9.2
-	/// </para>
-	/// </summary>
-	public class CustomScoreProvider
-	{
+namespace Lucene.Net.Queries
+{
 
-	  protected internal readonly AtomicReaderContext context;
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
 
-	  /// <summary>
-	  /// Creates a new instance of the provider class for the given <seealso cref="IndexReader"/>.
-	  /// </summary>
-	  public CustomScoreProvider(AtomicReaderContext context)
-	  {
-		this.context = context;
-	  }
+    /// <summary>
+    /// An instance of this subclass should be returned by
+    /// <seealso cref="CustomScoreQuery#getCustomScoreProvider"/>, if you want
+    /// to modify the custom score calculation of a <seealso cref="CustomScoreQuery"/>.
+    /// <para>Since Lucene 2.9, queries operate on each segment of an index separately,
+    /// so the protected <seealso cref="#context"/> field can be used to resolve doc IDs,
+    /// as the supplied <code>doc</code> ID is per-segment and without knowledge
+    /// of the IndexReader you cannot access the document or <seealso cref="FieldCache"/>.
+    /// 
+    /// @lucene.experimental
+    /// @since 2.9.2
+    /// </para>
+    /// </summary>
+    public class CustomScoreProvider
+    {
 
-	  /// <summary>
-	  /// Compute a custom score by the subQuery score and a number of 
-	  /// <seealso cref="org.apache.lucene.queries.function.FunctionQuery"/> scores.
-	  /// <para> 
-	  /// Subclasses can override this method to modify the custom score.  
-	  /// </para>
-	  /// <para>
-	  /// If your custom scoring is different than the default herein you 
-	  /// should override at least one of the two customScore() methods.
-	  /// If the number of <seealso cref="FunctionQuery function queries"/> is always &lt; 2 it is 
-	  /// sufficient to override the other 
-	  /// <seealso cref="#customScore(int, float, float) customScore()"/> 
-	  /// method, which is simpler. 
-	  /// </para>
-	  /// <para>
-	  /// The default computation herein is a multiplication of given scores:
-	  /// <pre>
-	  ///     ModifiedScore = valSrcScore * valSrcScores[0] * valSrcScores[1] * ...
-	  /// </pre>
-	  /// 
-	  /// </para>
-	  /// </summary>
-	  /// <param name="doc"> id of scored doc. </param>
-	  /// <param name="subQueryScore"> score of that doc by the subQuery. </param>
-	  /// <param name="valSrcScores"> scores of that doc by the <seealso cref="FunctionQuery"/>. </param>
-	  /// <returns> custom score. </returns>
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: public float customScore(int doc, float subQueryScore, float valSrcScores[]) throws java.io.IOException
-	  public virtual float customScore(int doc, float subQueryScore, float[] valSrcScores)
-	  {
-		if (valSrcScores.Length == 1)
-		{
-		  return customScore(doc, subQueryScore, valSrcScores[0]);
-		}
-		if (valSrcScores.Length == 0)
-		{
-		  return customScore(doc, subQueryScore, 1);
-		}
-		float score = subQueryScore;
-		foreach (float valSrcScore in valSrcScores)
-		{
-		  score *= valSrcScore;
-		}
-		return score;
-	  }
+        protected internal readonly AtomicReaderContext context;
 
-	  /// <summary>
-	  /// Compute a custom score by the subQuery score and the <seealso cref="FunctionQuery"/> score.
-	  /// <para> 
-	  /// Subclasses can override this method to modify the custom score.
-	  /// </para>
-	  /// <para>
-	  /// If your custom scoring is different than the default herein you 
-	  /// should override at least one of the two customScore() methods.
-	  /// If the number of <seealso cref="FunctionQuery function queries"/> is always &lt; 2 it is 
-	  /// sufficient to override this customScore() method, which is simpler. 
-	  /// </para>
-	  /// <para>
-	  /// The default computation herein is a multiplication of the two scores:
-	  /// <pre>
-	  ///     ModifiedScore = subQueryScore * valSrcScore
-	  /// </pre>
-	  /// 
-	  /// </para>
-	  /// </summary>
-	  /// <param name="doc"> id of scored doc. </param>
-	  /// <param name="subQueryScore"> score of that doc by the subQuery. </param>
-	  /// <param name="valSrcScore"> score of that doc by the <seealso cref="FunctionQuery"/>. </param>
-	  /// <returns> custom score. </returns>
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: public float customScore(int doc, float subQueryScore, float valSrcScore) throws java.io.IOException
-	  public virtual float customScore(int doc, float subQueryScore, float valSrcScore)
-	  {
-		return subQueryScore * valSrcScore;
-	  }
+        /// <summary>
+        /// Creates a new instance of the provider class for the given <seealso cref="IndexReader"/>.
+        /// </summary>
+        public CustomScoreProvider(AtomicReaderContext context)
+        {
+            this.context = context;
+        }
 
-	  /// <summary>
-	  /// Explain the custom score.
-	  /// Whenever overriding <seealso cref="#customScore(int, float, float[])"/>, 
-	  /// this method should also be overridden to provide the correct explanation
-	  /// for the part of the custom scoring.
-	  /// </summary>
-	  /// <param name="doc"> doc being explained. </param>
-	  /// <param name="subQueryExpl"> explanation for the sub-query part. </param>
-	  /// <param name="valSrcExpls"> explanation for the value source part. </param>
-	  /// <returns> an explanation for the custom score </returns>
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: public org.apache.lucene.search.Explanation customExplain(int doc, org.apache.lucene.search.Explanation subQueryExpl, org.apache.lucene.search.Explanation valSrcExpls[]) throws java.io.IOException
-	  public virtual Explanation customExplain(int doc, Explanation subQueryExpl, Explanation[] valSrcExpls)
-	  {
-		if (valSrcExpls.Length == 1)
-		{
-		  return customExplain(doc, subQueryExpl, valSrcExpls[0]);
-		}
-		if (valSrcExpls.Length == 0)
-		{
-		  return subQueryExpl;
-		}
-		float valSrcScore = 1;
-		foreach (Explanation valSrcExpl in valSrcExpls)
-		{
-		  valSrcScore *= valSrcExpl.Value;
-		}
-		Explanation exp = new Explanation(valSrcScore * subQueryExpl.Value, "custom score: product of:");
-		exp.addDetail(subQueryExpl);
-		foreach (Explanation valSrcExpl in valSrcExpls)
-		{
-		  exp.addDetail(valSrcExpl);
-		}
-		return exp;
-	  }
+        /// <summary>
+        /// Compute a custom score by the subQuery score and a number of 
+        /// <seealso cref="FunctionQuery"/> scores.
+        /// <para> 
+        /// Subclasses can override this method to modify the custom score.  
+        /// </para>
+        /// <para>
+        /// If your custom scoring is different than the default herein you 
+        /// should override at least one of the two customScore() methods.
+        /// If the number of <seealso cref="FunctionQuery function queries"/> is always &lt; 2 it is 
+        /// sufficient to override the other 
+        /// <seealso cref="#customScore(int, float, float) customScore()"/> 
+        /// method, which is simpler. 
+        /// </para>
+        /// <para>
+        /// The default computation herein is a multiplication of given scores:
+        /// <pre>
+        ///     ModifiedScore = valSrcScore * valSrcScores[0] * valSrcScores[1] * ...
+        /// </pre>
+        /// 
+        /// </para>
+        /// </summary>
+        /// <param name="doc"> id of scored doc. </param>
+        /// <param name="subQueryScore"> score of that doc by the subQuery. </param>
+        /// <param name="valSrcScores"> scores of that doc by the <seealso cref="FunctionQuery"/>. </param>
+        /// <returns> custom score. </returns>
+        public virtual float CustomScore(int doc, float subQueryScore, float[] valSrcScores)
+        {
+            if (valSrcScores.Length == 1)
+            {
+                return CustomScore(doc, subQueryScore, valSrcScores[0]);
+            }
+            if (valSrcScores.Length == 0)
+            {
+                return CustomScore(doc, subQueryScore, 1);
+            }
+            return valSrcScores.Aggregate(subQueryScore, (current, valSrcScore) => current*valSrcScore);
+        }
 
-	  /// <summary>
-	  /// Explain the custom score.
-	  /// Whenever overriding <seealso cref="#customScore(int, float, float)"/>, 
-	  /// this method should also be overridden to provide the correct explanation
-	  /// for the part of the custom scoring.
-	  /// </summary>
-	  /// <param name="doc"> doc being explained. </param>
-	  /// <param name="subQueryExpl"> explanation for the sub-query part. </param>
-	  /// <param name="valSrcExpl"> explanation for the value source part. </param>
-	  /// <returns> an explanation for the custom score </returns>
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: public org.apache.lucene.search.Explanation customExplain(int doc, org.apache.lucene.search.Explanation subQueryExpl, org.apache.lucene.search.Explanation valSrcExpl) throws java.io.IOException
-	  public virtual Explanation customExplain(int doc, Explanation subQueryExpl, Explanation valSrcExpl)
-	  {
-		float valSrcScore = 1;
-		if (valSrcExpl != null)
-		{
-		  valSrcScore *= valSrcExpl.Value;
-		}
-		Explanation exp = new Explanation(valSrcScore * subQueryExpl.Value, "custom score: product of:");
-		exp.addDetail(subQueryExpl);
-		exp.addDetail(valSrcExpl);
-		return exp;
-	  }
+        /// <summary>
+        /// Compute a custom score by the subQuery score and the <seealso cref="FunctionQuery"/> score.
+        /// <para> 
+        /// Subclasses can override this method to modify the custom score.
+        /// </para>
+        /// <para>
+        /// If your custom scoring is different than the default herein you 
+        /// should override at least one of the two customScore() methods.
+        /// If the number of <seealso cref="FunctionQuery function queries"/> is always &lt; 2 it is 
+        /// sufficient to override this customScore() method, which is simpler. 
+        /// </para>
+        /// <para>
+        /// The default computation herein is a multiplication of the two scores:
+        /// <pre>
+        ///     ModifiedScore = subQueryScore * valSrcScore
+        /// </pre>
+        /// 
+        /// </para>
+        /// </summary>
+        /// <param name="doc"> id of scored doc. </param>
+        /// <param name="subQueryScore"> score of that doc by the subQuery. </param>
+        /// <param name="valSrcScore"> score of that doc by the <seealso cref="FunctionQuery"/>. </param>
+        /// <returns> custom score. </returns>
+        public virtual float CustomScore(int doc, float subQueryScore, float valSrcScore)
+        {
+            return subQueryScore * valSrcScore;
+        }
 
-	}
+        /// <summary>
+        /// Explain the custom score.
+        /// Whenever overriding <seealso cref="#customScore(int, float, float[])"/>, 
+        /// this method should also be overridden to provide the correct explanation
+        /// for the part of the custom scoring.
+        /// </summary>
+        /// <param name="doc"> doc being explained. </param>
+        /// <param name="subQueryExpl"> explanation for the sub-query part. </param>
+        /// <param name="valSrcExpls"> explanation for the value source part. </param>
+        /// <returns> an explanation for the custom score </returns>
+        public virtual Explanation CustomExplain(int doc, Explanation subQueryExpl, Explanation[] valSrcExpls)
+        {
+            if (valSrcExpls.Length == 1)
+            {
+                return CustomExplain(doc, subQueryExpl, valSrcExpls[0]);
+            }
+            if (valSrcExpls.Length == 0)
+            {
+                return subQueryExpl;
+            }
+            float valSrcScore = 1;
+            foreach (Explanation valSrcExpl in valSrcExpls)
+            {
+                valSrcScore *= valSrcExpl.Value;
+            }
+            Explanation exp = new Explanation(valSrcScore * subQueryExpl.Value, "custom score: product of:");
+            exp.AddDetail(subQueryExpl);
+            foreach (Explanation valSrcExpl in valSrcExpls)
+            {
+                exp.AddDetail(valSrcExpl);
+            }
+            return exp;
+        }
 
+        /// <summary>
+        /// Explain the custom score.
+        /// Whenever overriding <seealso cref="#customScore(int, float, float)"/>, 
+        /// this method should also be overridden to provide the correct explanation
+        /// for the part of the custom scoring.
+        /// </summary>
+        /// <param name="doc"> doc being explained. </param>
+        /// <param name="subQueryExpl"> explanation for the sub-query part. </param>
+        /// <param name="valSrcExpl"> explanation for the value source part. </param>
+        /// <returns> an explanation for the custom score </returns>
+        public virtual Explanation CustomExplain(int doc, Explanation subQueryExpl, Explanation valSrcExpl)
+        {
+            float valSrcScore = 1;
+            if (valSrcExpl != null)
+            {
+                valSrcScore *= valSrcExpl.Value;
+            }
+            Explanation exp = new Explanation(valSrcScore * subQueryExpl.Value, "custom score: product of:");
+            exp.AddDetail(subQueryExpl);
+            exp.AddDetail(valSrcExpl);
+            return exp;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ba0f3c7d/src/Lucene.Net.Queries/CustomScoreQuery.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Queries/CustomScoreQuery.cs b/src/Lucene.Net.Queries/CustomScoreQuery.cs
index 91c2597..016b87c 100644
--- a/src/Lucene.Net.Queries/CustomScoreQuery.cs
+++ b/src/Lucene.Net.Queries/CustomScoreQuery.cs
@@ -1,7 +1,12 @@
 using System.Collections.Generic;
 using System.Text;
+using Lucene.Net.Index;
+using Lucene.Net.Queries.Function;
+using Lucene.Net.Search;
+using Lucene.Net.Support;
+using Lucene.Net.Util;
 
-namespace org.apache.lucene.queries
+namespace Lucene.Net.Queries
 {
 
 	/*
@@ -20,23 +25,7 @@ namespace org.apache.lucene.queries
 	 * See the License for the specific language governing permissions and
 	 * limitations under the License.
 	 */
-
-
-	using AtomicReaderContext = org.apache.lucene.index.AtomicReaderContext;
-	using IndexReader = org.apache.lucene.index.IndexReader;
-	using Term = org.apache.lucene.index.Term;
-	using FunctionQuery = org.apache.lucene.queries.function.FunctionQuery;
-	using ValueSource = org.apache.lucene.queries.function.ValueSource;
-	using ComplexExplanation = org.apache.lucene.search.ComplexExplanation;
-	using Explanation = org.apache.lucene.search.Explanation;
-	using Query = org.apache.lucene.search.Query;
-	using Weight = org.apache.lucene.search.Weight;
-	using Scorer = org.apache.lucene.search.Scorer;
-	using IndexSearcher = org.apache.lucene.search.IndexSearcher;
-	using Bits = org.apache.lucene.util.Bits;
-	using ToStringUtils = org.apache.lucene.util.ToStringUtils;
-
-	/// <summary>
+    /// <summary>
 	/// Query that sets document score as a programmatic function of several (sub) scores:
 	/// <ol>
 	///    <li>the score of its subQuery (any query)</li>
@@ -61,16 +50,16 @@ namespace org.apache.lucene.queries
 	  }
 
 	  /// <summary>
-	  /// Create a CustomScoreQuery over input subQuery and a <seealso cref="org.apache.lucene.queries.function.FunctionQuery"/>. </summary>
+	  /// Create a CustomScoreQuery over input subQuery and a <seealso cref="FunctionQuery"/>. </summary>
 	  /// <param name="subQuery"> the sub query whose score is being customized. Must not be null. </param>
 	  /// <param name="scoringQuery"> a value source query whose scores are used in the custom score
 	  /// computation.  This parameter is optional - it can be null. </param>
-	  public CustomScoreQuery(Query subQuery, FunctionQuery scoringQuery) : this(subQuery, scoringQuery != null ? new FunctionQuery[] {scoringQuery} : new FunctionQuery[0]); / / don't want an array that contains a single null..
+	  public CustomScoreQuery(Query subQuery, FunctionQuery scoringQuery) : this(subQuery, scoringQuery != null ? new FunctionQuery[] {scoringQuery} : new FunctionQuery[0]) // don't want an array that contains a single null..
 	  {
 	  }
 
 	  /// <summary>
-	  /// Create a CustomScoreQuery over input subQuery and a <seealso cref="org.apache.lucene.queries.function.FunctionQuery"/>. </summary>
+	  /// Create a CustomScoreQuery over input subQuery and a <seealso cref="FunctionQuery"/>. </summary>
 	  /// <param name="subQuery"> the sub query whose score is being customized. Must not be null. </param>
 	  /// <param name="scoringQueries"> value source queries whose scores are used in the custom score
 	  /// computation.  This parameter is optional - it can be null or even an empty array. </param>
@@ -85,58 +74,52 @@ namespace org.apache.lucene.queries
 	  }
 
 	  /*(non-Javadoc) @see org.apache.lucene.search.Query#rewrite(org.apache.lucene.index.IndexReader) */
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public org.apache.lucene.search.Query rewrite(org.apache.lucene.index.IndexReader reader) throws java.io.IOException
-	  public override Query rewrite(IndexReader reader)
+	  public override Query Rewrite(IndexReader reader)
 	  {
 		CustomScoreQuery clone = null;
 
-//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
-//ORIGINAL LINE: final org.apache.lucene.search.Query sq = subQuery.rewrite(reader);
-		Query sq = subQuery.rewrite(reader);
+		Query sq = subQuery.Rewrite(reader);
 		if (sq != subQuery)
 		{
-		  clone = clone();
+		  clone = Clone();
 		  clone.subQuery = sq;
 		}
 
 		for (int i = 0; i < scoringQueries.Length; i++)
 		{
-//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
-//ORIGINAL LINE: final org.apache.lucene.search.Query v = scoringQueries[i].rewrite(reader);
-		  Query v = scoringQueries[i].rewrite(reader);
+		  Query v = scoringQueries[i].Rewrite(reader);
 		  if (v != scoringQueries[i])
 		  {
 			if (clone == null)
 			{
-				clone = clone();
+				clone = Clone();
 			}
 			clone.scoringQueries[i] = v;
 		  }
 		}
 
-		return (clone == null) ? this : clone;
+		return clone ?? this;
 	  }
 
 	  /*(non-Javadoc) @see org.apache.lucene.search.Query#extractTerms(java.util.Set) */
-	  public override void extractTerms(HashSet<Term> terms)
+	  public override void ExtractTerms(HashSet<Term> terms)
 	  {
-		subQuery.extractTerms(terms);
+		subQuery.ExtractTerms(terms);
 		foreach (Query scoringQuery in scoringQueries)
 		{
-		  scoringQuery.extractTerms(terms);
+		  scoringQuery.ExtractTerms(terms);
 		}
 	  }
 
 	  /*(non-Javadoc) @see org.apache.lucene.search.Query#clone() */
-	  public override CustomScoreQuery clone()
+	  public override CustomScoreQuery Clone()
 	  {
-		CustomScoreQuery clone = (CustomScoreQuery)base.clone();
-		clone.subQuery = subQuery.clone();
+		CustomScoreQuery clone = (CustomScoreQuery)base.Clone();
+		clone.subQuery = subQuery.Clone();
 		clone.scoringQueries = new Query[scoringQueries.Length];
 		for (int i = 0; i < scoringQueries.Length; i++)
 		{
-		  clone.scoringQueries[i] = scoringQueries[i].clone();
+		  clone.scoringQueries[i] = scoringQueries[i].Clone();
 		}
 		return clone;
 	  }
@@ -152,7 +135,7 @@ namespace org.apache.lucene.queries
 		}
 		sb.Append(")");
 		sb.Append(strict?" STRICT" : "");
-		return sb.ToString() + ToStringUtils.boost(Boost);
+		return sb.ToString() + ToStringUtils.Boost(Boost);
 	  }
 
 	  /// <summary>
@@ -183,7 +166,7 @@ namespace org.apache.lucene.queries
 	  /// Returns a hash code value for this object. </summary>
 	  public override int GetHashCode()
 	  {
-		return (this.GetType().GetHashCode() + subQuery.GetHashCode() + Arrays.GetHashCode(scoringQueries)) ^ float.floatToIntBits(Boost) ^ (strict ? 1234 : 4321);
+		return (this.GetType().GetHashCode() + subQuery.GetHashCode() + Arrays.GetHashCode(scoringQueries)) ^ Number.FloatToIntBits(Boost) ^ (strict ? 1234 : 4321);
 	  }
 
 	  /// <summary>
@@ -192,9 +175,7 @@ namespace org.apache.lucene.queries
 	  /// implementation as specified in the docs of <seealso cref="CustomScoreProvider"/>.
 	  /// @since 2.9.2
 	  /// </summary>
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: protected CustomScoreProvider getCustomScoreProvider(org.apache.lucene.index.AtomicReaderContext context) throws java.io.IOException
-	  protected internal virtual CustomScoreProvider getCustomScoreProvider(AtomicReaderContext context)
+	  protected internal virtual CustomScoreProvider GetCustomScoreProvider(AtomicReaderContext context)
 	  {
 		return new CustomScoreProvider(context);
 	  }
@@ -210,16 +191,14 @@ namespace org.apache.lucene.queries
 		internal bool qStrict;
 		internal float queryWeight;
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: public CustomWeight(org.apache.lucene.search.IndexSearcher searcher) throws java.io.IOException
 		public CustomWeight(CustomScoreQuery outerInstance, IndexSearcher searcher)
 		{
 			this.outerInstance = outerInstance;
-		  this.subQueryWeight = outerInstance.subQuery.createWeight(searcher);
+		  this.subQueryWeight = outerInstance.subQuery.CreateWeight(searcher);
 		  this.valSrcWeights = new Weight[outerInstance.scoringQueries.Length];
 		  for (int i = 0; i < outerInstance.scoringQueries.Length; i++)
 		  {
-			this.valSrcWeights[i] = outerInstance.scoringQueries[i].createWeight(searcher);
+			this.valSrcWeights[i] = outerInstance.scoringQueries[i].CreateWeight(searcher);
 		  }
 		  this.qStrict = outerInstance.strict;
 		}
@@ -233,8 +212,6 @@ namespace org.apache.lucene.queries
 			}
 		}
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public float getValueForNormalization() throws java.io.IOException
 		public override float ValueForNormalization
 		{
 			get
@@ -256,33 +233,31 @@ namespace org.apache.lucene.queries
 		}
 
 		/*(non-Javadoc) @see org.apache.lucene.search.Weight#normalize(float) */
-		public override void normalize(float norm, float topLevelBoost)
+		public override void Normalize(float norm, float topLevelBoost)
 		{
 		  // note we DONT incorporate our boost, nor pass down any topLevelBoost 
 		  // (e.g. from outer BQ), as there is no guarantee that the CustomScoreProvider's 
 		  // function obeys the distributive law... it might call sqrt() on the subQuery score
 		  // or some other arbitrary function other than multiplication.
 		  // so, instead boosts are applied directly in score()
-		  subQueryWeight.normalize(norm, 1f);
+		  subQueryWeight.Normalize(norm, 1f);
 		  foreach (Weight valSrcWeight in valSrcWeights)
 		  {
 			if (qStrict)
 			{
-			  valSrcWeight.normalize(1, 1); // do not normalize the ValueSource part
+			  valSrcWeight.Normalize(1, 1); // do not normalize the ValueSource part
 			}
 			else
 			{
-			  valSrcWeight.normalize(norm, 1f);
+			  valSrcWeight.Normalize(norm, 1f);
 			}
 		  }
 		  queryWeight = topLevelBoost * Boost;
 		}
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public org.apache.lucene.search.Scorer scorer(org.apache.lucene.index.AtomicReaderContext context, org.apache.lucene.util.Bits acceptDocs) throws java.io.IOException
-		public override Scorer scorer(AtomicReaderContext context, Bits acceptDocs)
+		public override Scorer Scorer(AtomicReaderContext context, Bits acceptDocs)
 		{
-		  Scorer subQueryScorer = subQueryWeight.scorer(context, acceptDocs);
+		  Scorer subQueryScorer = subQueryWeight.Scorer(context, acceptDocs);
 		  if (subQueryScorer == null)
 		  {
 			return null;
@@ -290,24 +265,20 @@ namespace org.apache.lucene.queries
 		  Scorer[] valSrcScorers = new Scorer[valSrcWeights.Length];
 		  for (int i = 0; i < valSrcScorers.Length; i++)
 		  {
-			 valSrcScorers[i] = valSrcWeights[i].scorer(context, acceptDocs);
+			 valSrcScorers[i] = valSrcWeights[i].Scorer(context, acceptDocs);
 		  }
-		  return new CustomScorer(outerInstance, outerInstance.getCustomScoreProvider(context), this, queryWeight, subQueryScorer, valSrcScorers);
+		  return new CustomScorer(outerInstance, outerInstance.GetCustomScoreProvider(context), this, queryWeight, subQueryScorer, valSrcScorers);
 		}
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public org.apache.lucene.search.Explanation explain(org.apache.lucene.index.AtomicReaderContext context, int doc) throws java.io.IOException
-		public override Explanation explain(AtomicReaderContext context, int doc)
-		{
-		  Explanation explain = doExplain(context, doc);
-		  return explain == null ? new Explanation(0.0f, "no matching docs") : explain;
-		}
+	      public override Explanation Explain(AtomicReaderContext context, int doc)
+	      {
+	          Explanation explain = DoExplain(context, doc);
+	          return explain ?? new Explanation(0.0f, "no matching docs");
+	      }
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: private org.apache.lucene.search.Explanation doExplain(org.apache.lucene.index.AtomicReaderContext info, int doc) throws java.io.IOException
-		internal virtual Explanation doExplain(AtomicReaderContext info, int doc)
+		internal virtual Explanation DoExplain(AtomicReaderContext info, int doc)
 		{
-		  Explanation subQueryExpl = subQueryWeight.explain(info, doc);
+		  Explanation subQueryExpl = subQueryWeight.Explain(info, doc);
 		  if (!subQueryExpl.Match)
 		  {
 			return subQueryExpl;
@@ -316,22 +287,21 @@ namespace org.apache.lucene.queries
 		  Explanation[] valSrcExpls = new Explanation[valSrcWeights.Length];
 		  for (int i = 0; i < valSrcWeights.Length; i++)
 		  {
-			valSrcExpls[i] = valSrcWeights[i].explain(info, doc);
+			valSrcExpls[i] = valSrcWeights[i].Explain(info, doc);
 		  }
-		  Explanation customExp = outerInstance.getCustomScoreProvider(info).customExplain(doc,subQueryExpl,valSrcExpls);
+		  Explanation customExp = outerInstance.GetCustomScoreProvider(info).CustomExplain(doc,subQueryExpl,valSrcExpls);
 		  float sc = Boost * customExp.Value;
 		  Explanation res = new ComplexExplanation(true, sc, outerInstance.ToString() + ", product of:");
-		  res.addDetail(customExp);
-		  res.addDetail(new Explanation(Boost, "queryBoost")); // actually using the q boost as q weight (== weight value)
+		  res.AddDetail(customExp);
+		  res.AddDetail(new Explanation(Boost, "queryBoost")); // actually using the q boost as q weight (== weight value)
 		  return res;
 		}
 
-		public override bool scoresDocsOutOfOrder()
+		public override bool ScoresDocsOutOfOrder()
 		{
 		  return false;
 		}
-
-	  }
+	  
 
 
 	  //=========================== S C O R E R ============================
@@ -360,77 +330,67 @@ namespace org.apache.lucene.queries
 		  this.provider = provider;
 		}
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public int nextDoc() throws java.io.IOException
-		public override int nextDoc()
+		public override int NextDoc()
 		{
-		  int doc = subQueryScorer.nextDoc();
+		  int doc = subQueryScorer.NextDoc();
 		  if (doc != NO_MORE_DOCS)
 		  {
 			foreach (Scorer valSrcScorer in valSrcScorers)
 			{
-			  valSrcScorer.advance(doc);
+			  valSrcScorer.Advance(doc);
 			}
 		  }
 		  return doc;
 		}
 
-		public override int docID()
+		public override int DocID()
 		{
-		  return subQueryScorer.docID();
+		  return subQueryScorer.DocID();
 		}
 
 		/*(non-Javadoc) @see org.apache.lucene.search.Scorer#score() */
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public float score() throws java.io.IOException
-		public override float score()
+		public override float Score()
 		{
 		  for (int i = 0; i < valSrcScorers.Length; i++)
 		  {
-			vScores[i] = valSrcScorers[i].score();
+			vScores[i] = valSrcScorers[i].Score();
 		  }
 		  return qWeight * provider.customScore(subQueryScorer.docID(), subQueryScorer.score(), vScores);
 		}
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public int freq() throws java.io.IOException
-		public override int freq()
+		public override int Freq()
 		{
-		  return subQueryScorer.freq();
+		  return subQueryScorer.Freq();
 		}
 
 		public override ICollection<ChildScorer> Children
 		{
 			get
 			{
-			  return Collections.singleton(new ChildScorer(subQueryScorer, "CUSTOM"));
+			  return Collections.Singleton(new ChildScorer(subQueryScorer, "CUSTOM"));
 			}
 		}
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public int advance(int target) throws java.io.IOException
-		public override int advance(int target)
+		public override int Advance(int target)
 		{
-		  int doc = subQueryScorer.advance(target);
+		  int doc = subQueryScorer.Advance(target);
 		  if (doc != NO_MORE_DOCS)
 		  {
 			foreach (Scorer valSrcScorer in valSrcScorers)
 			{
-			  valSrcScorer.advance(doc);
+			  valSrcScorer.Advance(doc);
 			}
 		  }
 		  return doc;
 		}
 
-		public override long cost()
+		public override long Cost()
 		{
-		  return subQueryScorer.cost();
+		  return subQueryScorer.Cost();
 		}
 	  }
 
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public org.apache.lucene.search.Weight createWeight(org.apache.lucene.search.IndexSearcher searcher) throws java.io.IOException
-	  public override Weight createWeight(IndexSearcher searcher)
+	  public override Weight CreateWeight(IndexSearcher searcher)
 	  {
 		return new CustomWeight(this, searcher);
 	  }
@@ -444,17 +404,7 @@ namespace org.apache.lucene.queries
 	  /// <P>
 	  /// Note: only has effect when the <seealso cref="ValueSource"/> part is not null.
 	  /// </summary>
-	  public virtual bool Strict
-	  {
-		  get
-		  {
-			return strict;
-		  }
-		  set
-		  {
-			this.strict = value;
-		  }
-	  }
+	  public virtual bool Strict { get; set; }
 
 
 	  /// <summary>
@@ -477,14 +427,13 @@ namespace org.apache.lucene.queries
 		  }
 	  }
 
-	  /// <summary>
-	  /// A short name of this query, used in <seealso cref="#toString(String)"/>.
-	  /// </summary>
-	  public virtual string name()
-	  {
-		return "custom";
+	      /// <summary>
+	      /// A short name of this query, used in <seealso cref="#toString(String)"/>.
+	      /// </summary>
+	      public virtual string Name
+	      {
+	          get { return "custom"; }
+	      }
 	  }
 
-	}
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ba0f3c7d/src/Lucene.Net.Queries/FilterClause.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Queries/FilterClause.cs b/src/Lucene.Net.Queries/FilterClause.cs
index cbfe284..3794102 100644
--- a/src/Lucene.Net.Queries/FilterClause.cs
+++ b/src/Lucene.Net.Queries/FilterClause.cs
@@ -1,97 +1,91 @@
-namespace org.apache.lucene.queries
-{
-
-	/*
-	 * Licensed to the Apache Software Foundation (ASF) under one or more
-	 * contributor license agreements.  See the NOTICE file distributed with
-	 * this work for additional information regarding copyright ownership.
-	 * The ASF licenses this file to You under the Apache License, Version 2.0
-	 * (the "License"); you may not use this file except in compliance with
-	 * the License.  You may obtain a copy of the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS,
-	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-	 * See the License for the specific language governing permissions and
-	 * limitations under the License.
-	 */
-
-	using Occur = org.apache.lucene.search.BooleanClause.Occur;
-	using Filter = org.apache.lucene.search.Filter;
+using Lucene.Net.Search;
 
-	/// <summary>
-	/// A Filter that wrapped with an indication of how that filter
-	/// is used when composed with another filter.
-	/// (Follows the boolean logic in BooleanClause for composition 
-	/// of queries.)
-	/// </summary>
-	public sealed class FilterClause
-	{
-
-	  private readonly Occur occur;
-	  private readonly Filter filter;
+namespace Lucene.Net.Queries
+{
 
-	  /// <summary>
-	  /// Create a new FilterClause </summary>
-	  /// <param name="filter"> A Filter object containing a BitSet </param>
-	  /// <param name="occur"> A parameter implementation indicating SHOULD, MUST or MUST NOT </param>
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    /// <summary>
+    /// A Filter that wrapped with an indication of how that filter
+    /// is used when composed with another filter.
+    /// (Follows the boolean logic in BooleanClause for composition 
+    /// of queries.)
+    /// </summary>
+    public sealed class FilterClause
+    {
 
-	  public FilterClause(Filter filter, Occur occur)
-	  {
-		this.occur = occur;
-		this.filter = filter;
-	  }
+        private readonly BooleanClause.Occur occur;
+        private readonly Filter filter;
 
-	  /// <summary>
-	  /// Returns this FilterClause's filter </summary>
-	  /// <returns> A Filter object </returns>
-	  public Filter Filter
-	  {
-		  get
-		  {
-			return filter;
-		  }
-	  }
+        /// <summary>
+        /// Create a new FilterClause </summary>
+        /// <param name="filter"> A Filter object containing a BitSet </param>
+        /// <param name="occur"> A parameter implementation indicating SHOULD, MUST or MUST NOT </param>
+        public FilterClause(Filter filter, BooleanClause.Occur occur)
+        {
+            this.occur = occur;
+            this.filter = filter;
+        }
 
-	  /// <summary>
-	  /// Returns this FilterClause's occur parameter </summary>
-	  /// <returns> An Occur object </returns>
-	  public Occur Occur
-	  {
-		  get
-		  {
-			return occur;
-		  }
-	  }
+        /// <summary>
+        /// Returns this FilterClause's filter </summary>
+        /// <returns> A Filter object </returns>
+        public Filter Filter
+        {
+            get
+            {
+                return filter;
+            }
+        }
 
-	  public override bool Equals(object o)
-	  {
-		if (o == this)
-		{
-		  return true;
-		}
-		if (o == null || !(o is FilterClause))
-		{
-		  return false;
-		}
-//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
-//ORIGINAL LINE: final FilterClause other = (FilterClause)o;
-		FilterClause other = (FilterClause)o;
-		return this.filter.Equals(other.filter) && this.occur == other.occur;
-	  }
+        /// <summary>
+        /// Returns this FilterClause's occur parameter </summary>
+        /// <returns> An Occur object </returns>
+        public BooleanClause.Occur Occur
+        {
+            get
+            {
+                return occur;
+            }
+        }
 
-	  public override int GetHashCode()
-	  {
-		return filter.GetHashCode() ^ occur.GetHashCode();
-	  }
+        public override bool Equals(object o)
+        {
+            if (o == this)
+            {
+                return true;
+            }
 
-	  public override string ToString()
-	  {
-		return occur.ToString() + filter.ToString();
-	  }
+            var other = o as FilterClause;
+            if (other == null)
+            {
+                return false;
+            }
+            return this.filter.Equals(other.filter) && this.occur == other.occur;
+        }
 
-	}
+        public override int GetHashCode()
+        {
+            return filter.GetHashCode() ^ occur.GetHashCode();
+        }
 
+        public override string ToString()
+        {
+            return occur.ToString() + filter.ToString();
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ba0f3c7d/src/Lucene.Net.Queries/Function/BoostedQuery.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Queries/Function/BoostedQuery.cs b/src/Lucene.Net.Queries/Function/BoostedQuery.cs
index 928db91..369617c 100644
--- a/src/Lucene.Net.Queries/Function/BoostedQuery.cs
+++ b/src/Lucene.Net.Queries/Function/BoostedQuery.cs
@@ -1,287 +1,272 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.Text;
+using Lucene.Net.Index;
+using Lucene.Net.Search;
+using Lucene.Net.Support;
+using Lucene.Net.Util;
+using org.apache.lucene.queries.function;
 
-namespace org.apache.lucene.queries.function
+namespace Lucene.Net.Queries.Function
 {
 
-	/*
-	 * Licensed to the Apache Software Foundation (ASF) under one or more
-	 * contributor license agreements.  See the NOTICE file distributed with
-	 * this work for additional information regarding copyright ownership.
-	 * The ASF licenses this file to You under the Apache License, Version 2.0
-	 * (the "License"); you may not use this file except in compliance with
-	 * the License.  You may obtain a copy of the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS,
-	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-	 * See the License for the specific language governing permissions and
-	 * limitations under the License.
-	 */
-
-	using org.apache.lucene.search;
-	using AtomicReaderContext = org.apache.lucene.index.AtomicReaderContext;
-	using IndexReader = org.apache.lucene.index.IndexReader;
-	using Term = org.apache.lucene.index.Term;
-	using Bits = org.apache.lucene.util.Bits;
-	using ToStringUtils = org.apache.lucene.util.ToStringUtils;
-
-
-	/// <summary>
-	/// Query that is boosted by a ValueSource
-	/// </summary>
-	// TODO: BoostedQuery and BoostingQuery in the same module? 
-	// something has to give
-	public class BoostedQuery : Query
-	{
-	  private Query q;
-	  private readonly ValueSource boostVal; // optional, can be null
-
-	  public BoostedQuery(Query subQuery, ValueSource boostVal)
-	  {
-		this.q = subQuery;
-		this.boostVal = boostVal;
-	  }
-
-	  public virtual Query Query
-	  {
-		  get
-		  {
-			  return q;
-		  }
-	  }
-	  public virtual ValueSource ValueSource
-	  {
-		  get
-		  {
-			  return boostVal;
-		  }
-	  }
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public Query rewrite(org.apache.lucene.index.IndexReader reader) throws java.io.IOException
-	  public override Query rewrite(IndexReader reader)
-	  {
-		Query newQ = q.rewrite(reader);
-		if (newQ == q)
-		{
-			return this;
-		}
-		BoostedQuery bq = (BoostedQuery)this.MemberwiseClone();
-		bq.q = newQ;
-		return bq;
-	  }
-
-	  public override void extractTerms(HashSet<Term> terms)
-	  {
-		q.extractTerms(terms);
-	  }
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public Weight createWeight(IndexSearcher searcher) throws java.io.IOException
-	  public override Weight createWeight(IndexSearcher searcher)
-	  {
-		return new BoostedQuery.BoostedWeight(this, searcher);
-	  }
-
-	  private class BoostedWeight : Weight
-	  {
-		  private readonly BoostedQuery outerInstance;
-
-		internal readonly IndexSearcher searcher;
-		internal Weight qWeight;
-		internal IDictionary fcontext;
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: public BoostedWeight(IndexSearcher searcher) throws java.io.IOException
-		public BoostedWeight(BoostedQuery outerInstance, IndexSearcher searcher)
-		{
-			this.outerInstance = outerInstance;
-		  this.searcher = searcher;
-		  this.qWeight = outerInstance.q.createWeight(searcher);
-		  this.fcontext = ValueSource.newContext(searcher);
-		  outerInstance.boostVal.createWeight(fcontext,searcher);
-		}
-
-		public override Query Query
-		{
-			get
-			{
-			  return outerInstance;
-			}
-		}
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public float getValueForNormalization() throws java.io.IOException
-		public override float ValueForNormalization
-		{
-			get
-			{
-			  float sum = qWeight.ValueForNormalization;
-			  sum *= Boost * Boost;
-			  return sum;
-			}
-		}
-
-		public override void normalize(float norm, float topLevelBoost)
-		{
-		  topLevelBoost *= Boost;
-		  qWeight.normalize(norm, topLevelBoost);
-		}
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public Scorer scorer(org.apache.lucene.index.AtomicReaderContext context, org.apache.lucene.util.Bits acceptDocs) throws java.io.IOException
-		public override Scorer scorer(AtomicReaderContext context, Bits acceptDocs)
-		{
-		  Scorer subQueryScorer = qWeight.scorer(context, acceptDocs);
-		  if (subQueryScorer == null)
-		  {
-			return null;
-		  }
-		  return new BoostedQuery.CustomScorer(outerInstance, context, this, Boost, subQueryScorer, outerInstance.boostVal);
-		}
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public Explanation explain(org.apache.lucene.index.AtomicReaderContext readerContext, int doc) throws java.io.IOException
-		public override Explanation explain(AtomicReaderContext readerContext, int doc)
-		{
-		  Explanation subQueryExpl = qWeight.explain(readerContext,doc);
-		  if (!subQueryExpl.Match)
-		  {
-			return subQueryExpl;
-		  }
-		  FunctionValues vals = outerInstance.boostVal.getValues(fcontext, readerContext);
-		  float sc = subQueryExpl.Value * vals.floatVal(doc);
-		  Explanation res = new ComplexExplanation(true, sc, outerInstance.ToString() + ", product of:");
-		  res.addDetail(subQueryExpl);
-		  res.addDetail(vals.explain(doc));
-		  return res;
-		}
-	  }
-
-
-	  private class CustomScorer : Scorer
-	  {
-		  private readonly BoostedQuery outerInstance;
-
-		internal readonly BoostedQuery.BoostedWeight weight;
-		internal readonly float qWeight;
-		internal readonly Scorer scorer;
-		internal readonly FunctionValues vals;
-		internal readonly AtomicReaderContext readerContext;
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: private CustomScorer(org.apache.lucene.index.AtomicReaderContext readerContext, BoostedQuery.BoostedWeight w, float qWeight, Scorer scorer, ValueSource vs) throws java.io.IOException
-		internal CustomScorer(BoostedQuery outerInstance, AtomicReaderContext readerContext, BoostedQuery.BoostedWeight w, float qWeight, Scorer scorer, ValueSource vs) : base(w)
-		{
-			this.outerInstance = outerInstance;
-		  this.weight = w;
-		  this.qWeight = qWeight;
-		  this.scorer = scorer;
-		  this.readerContext = readerContext;
-		  this.vals = vs.getValues(weight.fcontext, readerContext);
-		}
-
-		public override int docID()
-		{
-		  return scorer.docID();
-		}
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public int advance(int target) throws java.io.IOException
-		public override int advance(int target)
-		{
-		  return scorer.advance(target);
-		}
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public int nextDoc() throws java.io.IOException
-		public override int nextDoc()
-		{
-		  return scorer.nextDoc();
-		}
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public float score() throws java.io.IOException
-		public override float score()
-		{
-		  float score = qWeight * scorer.score() * vals.floatVal(scorer.docID());
-
-		  // Current Lucene priority queues can't handle NaN and -Infinity, so
-		  // map to -Float.MAX_VALUE. This conditional handles both -infinity
-		  // and NaN since comparisons with NaN are always false.
-		  return score > float.NegativeInfinity ? score : -float.MaxValue;
-		}
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: @Override public int freq() throws java.io.IOException
-		public override int freq()
-		{
-		  return scorer.freq();
-		}
-
-		public override ICollection<ChildScorer> Children
-		{
-			get
-			{
-			  return Collections.singleton(new ChildScorer(scorer, "CUSTOM"));
-			}
-		}
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: public Explanation explain(int doc) throws java.io.IOException
-		public virtual Explanation explain(int doc)
-		{
-		  Explanation subQueryExpl = weight.qWeight.explain(readerContext,doc);
-		  if (!subQueryExpl.Match)
-		  {
-			return subQueryExpl;
-		  }
-		  float sc = subQueryExpl.Value * vals.floatVal(doc);
-		  Explanation res = new ComplexExplanation(true, sc, outerInstance.ToString() + ", product of:");
-		  res.addDetail(subQueryExpl);
-		  res.addDetail(vals.explain(doc));
-		  return res;
-		}
-
-		public override long cost()
-		{
-		  return scorer.cost();
-		}
-	  }
-
-
-	  public override string ToString(string field)
-	  {
-		StringBuilder sb = new StringBuilder();
-		sb.Append("boost(").Append(q.ToString(field)).Append(',').Append(boostVal).Append(')');
-		sb.Append(ToStringUtils.boost(Boost));
-		return sb.ToString();
-	  }
-
-	  public override bool Equals(object o)
-	  {
-	  if (!base.Equals(o))
-	  {
-		  return false;
-	  }
-		BoostedQuery other = (BoostedQuery)o;
-		return this.q.Equals(other.q) && this.boostVal.Equals(other.boostVal);
-	  }
-
-	  public override int GetHashCode()
-	  {
-		int h = q.GetHashCode();
-		h ^= (h << 17) | ((int)((uint)h >> 16));
-		h += boostVal.GetHashCode();
-		h ^= (h << 8) | ((int)((uint)h >> 25));
-		h += float.floatToIntBits(Boost);
-		return h;
-	  }
-
-	}
-
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    /// <summary>
+    /// Query that is boosted by a ValueSource
+    /// </summary>
+    // TODO: BoostedQuery and BoostingQuery in the same module? 
+    // something has to give
+    public class BoostedQuery : Query
+    {
+        private Query q;
+        private readonly ValueSource boostVal; // optional, can be null
+
+        public BoostedQuery(Query subQuery, ValueSource boostVal)
+        {
+            this.q = subQuery;
+            this.boostVal = boostVal;
+        }
+
+        public virtual Query Query
+        {
+            get
+            {
+                return q;
+            }
+        }
+        public virtual ValueSource ValueSource
+        {
+            get
+            {
+                return boostVal;
+            }
+        }
+    
+        public override Query Rewrite(IndexReader reader)
+        {
+            Query newQ = q.Rewrite(reader);
+            if (newQ == q)
+            {
+                return this;
+            }
+            BoostedQuery bq = (BoostedQuery)this.MemberwiseClone();
+            bq.q = newQ;
+            return bq;
+        }
+
+        public override void ExtractTerms(HashSet<Term> terms)
+        {
+            q.ExtractTerms(terms);
+        }
+
+        public override Weight CreateWeight(IndexSearcher searcher)
+        {
+            return new BoostedQuery.BoostedWeight(this, searcher);
+        }
+
+        private class BoostedWeight : Weight
+        {
+            private readonly BoostedQuery outerInstance;
+
+            internal readonly IndexSearcher searcher;
+            internal Weight qWeight;
+            internal IDictionary fcontext;
+
+            //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
+            //ORIGINAL LINE: public BoostedWeight(IndexSearcher searcher) throws java.io.IOException
+            public BoostedWeight(BoostedQuery outerInstance, IndexSearcher searcher)
+            {
+                this.outerInstance = outerInstance;
+                this.searcher = searcher;
+                this.qWeight = outerInstance.q.CreateWeight(searcher);
+                this.fcontext = ValueSource.newContext(searcher);
+                outerInstance.boostVal.CreateWeight(fcontext, searcher);
+            }
+
+            public override Query Query
+            {
+                get
+                {
+                    return outerInstance;
+                }
+            }
+
+            //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
+            //ORIGINAL LINE: @Override public float getValueForNormalization() throws java.io.IOException
+            public override float ValueForNormalization
+            {
+                get
+                {
+                    float sum = qWeight.ValueForNormalization;
+                    sum *= Boost * Boost;
+                    return sum;
+                }
+            }
+
+            public override void normalize(float norm, float topLevelBoost)
+            {
+                topLevelBoost *= Boost;
+                qWeight.Normalize(norm, topLevelBoost);
+            }
+
+            public override Scorer Scorer(AtomicReaderContext context, Bits acceptDocs)
+            {
+                Scorer subQueryScorer = qWeight.Scorer(context, acceptDocs);
+                if (subQueryScorer == null)
+                {
+                    return null;
+                }
+                return new BoostedQuery.CustomScorer(outerInstance, context, this, Boost, subQueryScorer, outerInstance.boostVal);
+            }
+
+            public override Explanation Explain(AtomicReaderContext readerContext, int doc)
+            {
+                Explanation subQueryExpl = qWeight.Explain(readerContext, doc);
+                if (!subQueryExpl.Match)
+                {
+                    return subQueryExpl;
+                }
+                FunctionValues vals = outerInstance.boostVal.GetValues(fcontext, readerContext);
+                float sc = subQueryExpl.Value * vals.FloatVal(doc);
+                Explanation res = new ComplexExplanation(true, sc, outerInstance.ToString() + ", product of:");
+                res.AddDetail(subQueryExpl);
+                res.AddDetail(vals.explain(doc));
+                return res;
+            }
+        }
+
+
+        private class CustomScorer : Scorer
+        {
+            private readonly BoostedQuery outerInstance;
+
+            internal readonly BoostedQuery.BoostedWeight weight;
+            internal readonly float qWeight;
+            internal readonly Scorer scorer;
+            internal readonly FunctionValues vals;
+            internal readonly AtomicReaderContext readerContext;
+
+            //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
+            //ORIGINAL LINE: private CustomScorer(org.apache.lucene.index.AtomicReaderContext readerContext, BoostedQuery.BoostedWeight w, float qWeight, Scorer scorer, ValueSource vs) throws java.io.IOException
+            internal CustomScorer(BoostedQuery outerInstance, AtomicReaderContext readerContext, BoostedQuery.BoostedWeight w, float qWeight, Scorer scorer, ValueSource vs)
+                : base(w)
+            {
+                this.outerInstance = outerInstance;
+                this.weight = w;
+                this.qWeight = qWeight;
+                this.scorer = scorer;
+                this.readerContext = readerContext;
+                this.vals = vs.GetValues(weight.fcontext, readerContext);
+            }
+
+            public override int DocID()
+            {
+                return scorer.DocID();
+            }
+
+            //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
+            //ORIGINAL LINE: @Override public int advance(int target) throws java.io.IOException
+            public override int Advance(int target)
+            {
+                return scorer.Advance(target);
+            }
+
+            //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
+            //ORIGINAL LINE: @Override public int nextDoc() throws java.io.IOException
+            public override int NextDoc()
+            {
+                return scorer.NextDoc();
+            }
+
+            //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
+            //ORIGINAL LINE: @Override public float score() throws java.io.IOException
+            public override float Score()
+            {
+                float score = qWeight * scorer.Score() * vals.FloatVal(scorer.DocID());
+
+                // Current Lucene priority queues can't handle NaN and -Infinity, so
+                // map to -Float.MAX_VALUE. This conditional handles both -infinity
+                // and NaN since comparisons with NaN are always false.
+                return score > float.NegativeInfinity ? score : -float.MaxValue;
+            }
+
+            public override int Freq()
+            {
+                return scorer.Freq();
+            }
+
+            public override ICollection<ChildScorer> Children
+            {
+                get
+                {
+                    return Collections.Singleton(new ChildScorer(scorer, "CUSTOM"));
+                }
+            }
+
+            //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
+            //ORIGINAL LINE: public Explanation explain(int doc) throws java.io.IOException
+            public virtual Explanation explain(int doc)
+            {
+                Explanation subQueryExpl = weight.qWeight.Explain(readerContext, doc);
+                if (!subQueryExpl.Match)
+                {
+                    return subQueryExpl;
+                }
+                float sc = subQueryExpl.Value * vals.FloatVal(doc);
+                Explanation res = new ComplexExplanation(true, sc, outerInstance.ToString() + ", product of:");
+                res.AddDetail(subQueryExpl);
+                res.AddDetail(vals.explain(doc));
+                return res;
+            }
+
+            public override long Cost()
+            {
+                return scorer.Cost();
+            }
+        }
+
+
+        public override string ToString(string field)
+        {
+            StringBuilder sb = new StringBuilder();
+            sb.Append("boost(").Append(q.ToString(field)).Append(',').Append(boostVal).Append(')');
+            sb.Append(ToStringUtils.Boost(Boost));
+            return sb.ToString();
+        }
+
+        public override bool Equals(object o)
+        {
+            if (!base.Equals(o))
+            {
+                return false;
+            }
+            BoostedQuery other = (BoostedQuery)o;
+            return this.q.Equals(other.q) && this.boostVal.Equals(other.boostVal);
+        }
+
+        public override int GetHashCode()
+        {
+            int h = q.GetHashCode();
+            h ^= (h << 17) | ((int)((uint)h >> 16));
+            h += boostVal.GetHashCode();
+            h ^= (h << 8) | ((int)((uint)h >> 25));
+            h += Number.FloatToIntBits(Boost);
+            return h;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ba0f3c7d/src/Lucene.Net.Queries/Function/DocValues/BoolDocValues.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Queries/Function/DocValues/BoolDocValues.cs b/src/Lucene.Net.Queries/Function/DocValues/BoolDocValues.cs
index 1ad0517..c27ef4b 100644
--- a/src/Lucene.Net.Queries/Function/DocValues/BoolDocValues.cs
+++ b/src/Lucene.Net.Queries/Function/DocValues/BoolDocValues.cs
@@ -1,122 +1,118 @@
 using System;
+using Lucene.Net.Util.Mutable;
 
-namespace org.apache.lucene.queries.function.docvalues
+namespace Lucene.Net.Queries.Function.DocValues
 {
 
-	/*
-	 * Licensed to the Apache Software Foundation (ASF) under one or more
-	 * contributor license agreements.  See the NOTICE file distributed with
-	 * this work for additional information regarding copyright ownership.
-	 * The ASF licenses this file to You under the Apache License, Version 2.0
-	 * (the "License"); you may not use this file except in compliance with
-	 * the License.  You may obtain a copy of the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS,
-	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-	 * See the License for the specific language governing permissions and
-	 * limitations under the License.
-	 */
-
-	using MutableValue = org.apache.lucene.util.mutable.MutableValue;
-	using MutableValueBool = org.apache.lucene.util.mutable.MutableValueBool;
-
-	/// <summary>
-	/// Abstract <seealso cref="FunctionValues"/> implementation which supports retrieving boolean values.
-	/// Implementations can control how the boolean values are loaded through <seealso cref="#boolVal(int)"/>}
-	/// </summary>
-	public abstract class BoolDocValues : FunctionValues
-	{
-	  protected internal readonly ValueSource vs;
-
-	  public BoolDocValues(ValueSource vs)
-	  {
-		this.vs = vs;
-	  }
-
-	  public override abstract bool boolVal(int doc);
-
-	  public override sbyte byteVal(int doc)
-	  {
-		return boolVal(doc) ? (sbyte)1 : (sbyte)0;
-	  }
-
-	  public override short shortVal(int doc)
-	  {
-		return boolVal(doc) ? (short)1 : (short)0;
-	  }
-
-	  public override float floatVal(int doc)
-	  {
-		return boolVal(doc) ? (float)1 : (float)0;
-	  }
-
-	  public override int intVal(int doc)
-	  {
-		return boolVal(doc) ? 1 : 0;
-	  }
-
-	  public override long longVal(int doc)
-	  {
-		return boolVal(doc) ? (long)1 : (long)0;
-	  }
-
-	  public override double doubleVal(int doc)
-	  {
-		return boolVal(doc) ? (double)1 : (double)0;
-	  }
-
-	  public override string strVal(int doc)
-	  {
-		return Convert.ToString(boolVal(doc));
-	  }
-
-	  public override object objectVal(int doc)
-	  {
-		return exists(doc) ? boolVal(doc) : null;
-	  }
-
-	  public override string ToString(int doc)
-	  {
-		return vs.description() + '=' + strVal(doc);
-	  }
-
-	  public override ValueFiller ValueFiller
-	  {
-		  get
-		  {
-			return new ValueFillerAnonymousInnerClassHelper(this);
-		  }
-	  }
-
-	  private class ValueFillerAnonymousInnerClassHelper : ValueFiller
-	  {
-		  private readonly BoolDocValues outerInstance;
-
-		  public ValueFillerAnonymousInnerClassHelper(BoolDocValues outerInstance)
-		  {
-			  this.outerInstance = outerInstance;
-			  mval = new MutableValueBool();
-		  }
-
-		  private readonly MutableValueBool mval;
-
-		  public override MutableValue Value
-		  {
-			  get
-			  {
-				return mval;
-			  }
-		  }
-
-		  public override void fillValue(int doc)
-		  {
-			mval.value = outerInstance.boolVal(doc);
-			mval.exists = outerInstance.exists(doc);
-		  }
-	  }
-	}
-
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    /// <summary>
+    /// Abstract <seealso cref="FunctionValues"/> implementation which supports retrieving boolean values.
+    /// Implementations can control how the boolean values are loaded through <seealso cref="#BoolVal(int)"/>}
+    /// </summary>
+    public abstract class BoolDocValues : FunctionValues
+    {
+        protected internal readonly ValueSource vs;
+
+        protected BoolDocValues(ValueSource vs)
+        {
+            this.vs = vs;
+        }
+
+        public override abstract bool BoolVal(int doc);
+
+        public override sbyte ByteVal(int doc)
+        {
+            return BoolVal(doc) ? (sbyte)1 : (sbyte)0;
+        }
+
+        public override short ShortVal(int doc)
+        {
+            return BoolVal(doc) ? (short)1 : (short)0;
+        }
+
+        public override float FloatVal(int doc)
+        {
+            return BoolVal(doc) ? 1f : 0f;
+        }
+
+        public override int IntVal(int doc)
+        {
+            return BoolVal(doc) ? 1 : 0;
+        }
+
+        public override long LongVal(int doc)
+        {
+            return BoolVal(doc) ? 1 : 0;
+        }
+
+        public override double DoubleVal(int doc)
+        {
+            return BoolVal(doc) ? 1d : 0d;
+        }
+
+        public override string StrVal(int doc)
+        {
+            return Convert.ToString(BoolVal(doc));
+        }
+
+        public override object ObjectVal(int doc)
+        {
+            return Exists(doc) ? BoolVal(doc) : (bool?)null;
+        }
+
+        public override string ToString(int doc)
+        {
+            return vs.Description + '=' + StrVal(doc);
+        }
+
+        public override AbstractValueFiller ValueFiller
+        {
+            get
+            {
+                return new ValueFillerAnonymousInnerClassHelper(this);
+            }
+        }
+
+        private class ValueFillerAnonymousInnerClassHelper : AbstractValueFiller
+        {
+            private readonly BoolDocValues outerInstance;
+
+            public ValueFillerAnonymousInnerClassHelper(BoolDocValues outerInstance)
+            {
+                this.outerInstance = outerInstance;
+                mval = new MutableValueBool();
+            }
+
+            private readonly MutableValueBool mval;
+
+            public override MutableValue Value
+            {
+                get
+                {
+                    return mval;
+                }
+            }
+
+            public override void FillValue(int doc)
+            {
+                mval.Value = outerInstance.BoolVal(doc);
+                mval.Exists = outerInstance.Exists(doc);
+            }
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ba0f3c7d/src/Lucene.Net.Queries/Function/DocValues/DocTermsIndexDocValues.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Queries/Function/DocValues/DocTermsIndexDocValues.cs b/src/Lucene.Net.Queries/Function/DocValues/DocTermsIndexDocValues.cs
index 79f490c..832e921 100644
--- a/src/Lucene.Net.Queries/Function/DocValues/DocTermsIndexDocValues.cs
+++ b/src/Lucene.Net.Queries/Function/DocValues/DocTermsIndexDocValues.cs
@@ -1,6 +1,4 @@
-using System;
-
-/*
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -16,219 +14,202 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+using System;
+using Lucene.Net.Index;
+using Lucene.Net.Search;
+using Lucene.Net.Util;
+using Lucene.Net.Util.Mutable;
 
-namespace org.apache.lucene.queries.function.docvalues
+namespace Lucene.Net.Queries.Function.DocValues
 {
-
-	using AtomicReaderContext = org.apache.lucene.index.AtomicReaderContext;
-	using IndexReader = org.apache.lucene.index.IndexReader;
-	using SortedDocValues = org.apache.lucene.index.SortedDocValues;
-	using FieldCache = org.apache.lucene.search.FieldCache;
-	using BytesRef = org.apache.lucene.util.BytesRef;
-	using CharsRef = org.apache.lucene.util.CharsRef;
-	using UnicodeUtil = org.apache.lucene.util.UnicodeUtil;
-	using MutableValue = org.apache.lucene.util.mutable.MutableValue;
-	using MutableValueStr = org.apache.lucene.util.mutable.MutableValueStr;
-
-	/// <summary>
-	/// Serves as base class for FunctionValues based on DocTermsIndex.
-	/// @lucene.internal
-	/// </summary>
-	public abstract class DocTermsIndexDocValues : FunctionValues
-	{
-	  protected internal readonly SortedDocValues termsIndex;
-	  protected internal readonly ValueSource vs;
-	  protected internal readonly MutableValueStr val = new MutableValueStr();
-	  protected internal readonly BytesRef spare = new BytesRef();
-	  protected internal readonly CharsRef spareChars = new CharsRef();
-
-//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
-//ORIGINAL LINE: public DocTermsIndexDocValues(org.apache.lucene.queries.function.ValueSource vs, org.apache.lucene.index.AtomicReaderContext context, String field) throws java.io.IOException
-	  public DocTermsIndexDocValues(ValueSource vs, AtomicReaderContext context, string field)
-	  {
-		try
-		{
-		  termsIndex = FieldCache.DEFAULT.getTermsIndex(context.reader(), field);
-		}
-		catch (Exception e)
-		{
-		  throw new DocTermsIndexException(field, e);
-		}
-		this.vs = vs;
-	  }
-
-	  protected internal abstract string toTerm(string readableValue);
-
-	  public override bool exists(int doc)
-	  {
-		return ordVal(doc) >= 0;
-	  }
-
-	  public override int ordVal(int doc)
-	  {
-		return termsIndex.getOrd(doc);
-	  }
-
-	  public override int numOrd()
-	  {
-		return termsIndex.ValueCount;
-	  }
-
-	  public override bool bytesVal(int doc, BytesRef target)
-	  {
-		termsIndex.get(doc, target);
-		return target.length > 0;
-	  }
-
-	  public override string strVal(int doc)
-	  {
-		termsIndex.get(doc, spare);
-		if (spare.length == 0)
-		{
-		  return null;
-		}
-		UnicodeUtil.UTF8toUTF16(spare, spareChars);
-		return spareChars.ToString();
-	  }
-
-	  public override bool boolVal(int doc)
-	  {
-		return exists(doc);
-	  }
-
-	  public override abstract object objectVal(int doc); // force subclasses to override
-
-	  public override ValueSourceScorer getRangeScorer(IndexReader reader, string lowerVal, string upperVal, bool includeLower, bool includeUpper)
-	  {
-		// TODO: are lowerVal and upperVal in indexed form or not?
-		lowerVal = lowerVal == null ? null : toTerm(lowerVal);
-		upperVal = upperVal == null ? null : toTerm(upperVal);
-
-		int lower = int.MinValue;
-		if (lowerVal != null)
-		{
-		  lower = termsIndex.lookupTerm(new BytesRef(lowerVal));
-		  if (lower < 0)
-		  {
-			lower = -lower - 1;
-		  }
-		  else if (!includeLower)
-		  {
-			lower++;
-		  }
-		}
-
-		int upper = int.MaxValue;
-		if (upperVal != null)
-		{
-		  upper = termsIndex.lookupTerm(new BytesRef(upperVal));
-		  if (upper < 0)
-		  {
-			upper = -upper - 2;
-		  }
-		  else if (!includeUpper)
-		  {
-			upper--;
-		  }
-		}
-
-//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
-//ORIGINAL LINE: final int ll = lower;
-		int ll = lower;
-//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
-//ORIGINAL LINE: final int uu = upper;
-		int uu = upper;
-
-		return new ValueSourceScorerAnonymousInnerClassHelper(this, reader, this, ll, uu);
-	  }
-
-	  private class ValueSourceScorerAnonymousInnerClassHelper : ValueSourceScorer
-	  {
-		  private readonly DocTermsIndexDocValues outerInstance;
-
-		  private int ll;
-		  private int uu;
-
-		  public ValueSourceScorerAnonymousInnerClassHelper(DocTermsIndexDocValues outerInstance, IndexReader reader, org.apache.lucene.queries.function.docvalues.DocTermsIndexDocValues this, int ll, int uu) : base(reader, this)
-		  {
-			  this.outerInstance = outerInstance;
-			  this.ll = ll;
-			  this.uu = uu;
-		  }
-
-		  public override bool matchesValue(int doc)
-		  {
-			int ord = outerInstance.termsIndex.getOrd(doc);
-			return ord >= ll && ord <= uu;
-		  }
-	  }
-
-	  public override string ToString(int doc)
-	  {
-		return vs.description() + '=' + strVal(doc);
-	  }
-
-	  public override ValueFiller ValueFiller
-	  {
-		  get
-		  {
-			return new ValueFillerAnonymousInnerClassHelper(this);
-		  }
-	  }
-
-	  private class ValueFillerAnonymousInnerClassHelper : ValueFiller
-	  {
-		  private readonly DocTermsIndexDocValues outerInstance;
-
-		  public ValueFillerAnonymousInnerClassHelper(DocTermsIndexDocValues outerInstance)
-		  {
-			  this.outerInstance = outerInstance;
-			  mval = new MutableValueStr();
-		  }
-
-		  private readonly MutableValueStr mval;
-
-		  public override MutableValue Value
-		  {
-			  get
-			  {
-				return mval;
-			  }
-		  }
-
-		  public override void fillValue(int doc)
-		  {
-			int ord = outerInstance.termsIndex.getOrd(doc);
-			if (ord == -1)
-			{
-			  mval.value.bytes = BytesRef.EMPTY_BYTES;
-			  mval.value.offset = 0;
-			  mval.value.length = 0;
-			  mval.exists = false;
-			}
-			else
-			{
-			  outerInstance.termsIndex.lookupOrd(ord, mval.value);
-			  mval.exists = true;
-			}
-		  }
-	  }
-
-	  /// <summary>
-	  /// Custom Exception to be thrown when the DocTermsIndex for a field cannot be generated
-	  /// </summary>
-	  public sealed class DocTermsIndexException : Exception
-	  {
-
-//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
-//ORIGINAL LINE: public DocTermsIndexException(final String fieldName, final RuntimeException cause)
-		public DocTermsIndexException(string fieldName, Exception cause) : base("Can't initialize DocTermsIndex to generate (function) FunctionValues for field: " + fieldName, cause)
-		{
-		}
-
-	  }
-
-
-	}
-
+    /// <summary>
+    /// Serves as base class for FunctionValues based on DocTermsIndex.
+    /// @lucene.internal
+    /// </summary>
+    public abstract class DocTermsIndexDocValues : FunctionValues
+    {
+        protected internal readonly SortedDocValues termsIndex;
+        protected internal readonly ValueSource vs;
+        protected internal readonly MutableValueStr val = new MutableValueStr();
+        protected internal readonly BytesRef spare = new BytesRef();
+        protected internal readonly CharsRef spareChars = new CharsRef();
+
+        protected DocTermsIndexDocValues(ValueSource vs, AtomicReaderContext context, string field)
+        {
+            try
+            {
+                termsIndex = FieldCache_Fields.DEFAULT.GetTermsIndex(context.AtomicReader, field);
+            }
+            catch (Exception e)
+            {
+                throw new DocTermsIndexException(field, e);
+            }
+            this.vs = vs;
+        }
+
+        protected internal abstract string toTerm(string readableValue);
+
+        public override bool Exists(int doc)
+        {
+            return OrdVal(doc) >= 0;
+        }
+
+        public override int OrdVal(int doc)
+        {
+            return termsIndex.GetOrd(doc);
+        }
+
+        public override int NumOrd()
+        {
+            return termsIndex.ValueCount;
+        }
+
+        public override bool BytesVal(int doc, BytesRef target)
+        {
+            termsIndex.Get(doc, target);
+            return target.Length > 0;
+        }
+
+        public override string StrVal(int doc)
+        {
+            termsIndex.Get(doc, spare);
+            if (spare.Length == 0)
+            {
+                return null;
+            }
+            UnicodeUtil.UTF8toUTF16(spare, spareChars);
+            return spareChars.ToString();
+        }
+
+        public override bool BoolVal(int doc)
+        {
+            return Exists(doc);
+        }
+
+        public override abstract object ObjectVal(int doc); // force subclasses to override
+
+        public override ValueSourceScorer GetRangeScorer(IndexReader reader, string lowerVal, string upperVal, bool includeLower, bool includeUpper)
+        {
+            // TODO: are lowerVal and upperVal in indexed form or not?
+            lowerVal = lowerVal == null ? null : toTerm(lowerVal);
+            upperVal = upperVal == null ? null : toTerm(upperVal);
+
+            int lower = int.MinValue;
+            if (lowerVal != null)
+            {
+                lower = termsIndex.LookupTerm(new BytesRef(lowerVal));
+                if (lower < 0)
+                {
+                    lower = -lower - 1;
+                }
+                else if (!includeLower)
+                {
+                    lower++;
+                }
+            }
+
+            int upper = int.MaxValue;
+            if (upperVal != null)
+            {
+                upper = termsIndex.LookupTerm(new BytesRef(upperVal));
+                if (upper < 0)
+                {
+                    upper = -upper - 2;
+                }
+                else if (!includeUpper)
+                {
+                    upper--;
+                }
+            }
+            int ll = lower;
+            int uu = upper;
+
+            return new ValueSourceScorerAnonymousInnerClassHelper(this, reader, this, ll, uu);
+        }
+
+        private class ValueSourceScorerAnonymousInnerClassHelper : ValueSourceScorer
+        {
+            private readonly DocTermsIndexDocValues outerInstance;
+
+            private int ll;
+            private int uu;
+
+            public ValueSourceScorerAnonymousInnerClassHelper(DocTermsIndexDocValues outerInstance, IndexReader reader,
+                DocTermsIndexDocValues @this, int ll, int uu)
+                : base(reader, @this)
+            {
+                this.outerInstance = outerInstance;
+                this.ll = ll;
+                this.uu = uu;
+            }
+
+            public override bool MatchesValue(int doc)
+            {
+                int ord = outerInstance.termsIndex.GetOrd(doc);
+                return ord >= ll && ord <= uu;
+            }
+        }
+
+        public override string ToString(int doc)
+        {
+            return vs.Description + '=' + StrVal(doc);
+        }
+
+        public override AbstractValueFiller ValueFiller
+        {
+            get
+            {
+                return new ValueFillerAnonymousInnerClassHelper(this);
+            }
+        }
+
+        private class ValueFillerAnonymousInnerClassHelper : AbstractValueFiller
+        {
+            private readonly DocTermsIndexDocValues outerInstance;
+
+            public ValueFillerAnonymousInnerClassHelper(DocTermsIndexDocValues outerInstance)
+            {
+                this.outerInstance = outerInstance;
+                mval = new MutableValueStr();
+            }
+
+            private readonly MutableValueStr mval;
+
+            public override MutableValue Value
+            {
+                get
+                {
+                    return mval;
+                }
+            }
+
+            public override void FillValue(int doc)
+            {
+                int ord = outerInstance.termsIndex.GetOrd(doc);
+                if (ord == -1)
+                {
+                    mval.Value.Bytes = BytesRef.EMPTY_BYTES;
+                    mval.Value.Offset = 0;
+                    mval.Value.Length = 0;
+                    mval.Exists = false;
+                }
+                else
+                {
+                    outerInstance.termsIndex.LookupOrd(ord, mval.Value);
+                    mval.Exists = true;
+                }
+            }
+        }
+
+        /// <summary>
+        /// Custom Exception to be thrown when the DocTermsIndex for a field cannot be generated
+        /// </summary>
+        public sealed class DocTermsIndexException : Exception
+        {
+            public DocTermsIndexException(string fieldName, Exception cause)
+                : base("Can't initialize DocTermsIndex to generate (function) FunctionValues for field: " + fieldName, cause)
+            {
+            }
+        }
+    }
 }
\ No newline at end of file