CachingWrapperFilter.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:2k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. using System.Runtime.InteropServices;
  18. using IndexReader = Lucene.Net.Index.IndexReader;
  19. namespace Lucene.Net.Search
  20. {
  21. /// <summary> Wraps another filter's result and caches it.  The caching
  22. /// behavior is like {@link QueryFilter}.  The purpose is to allow
  23. /// filters to simply filter, and then wrap with this class to add
  24. /// caching, keeping the two concerns decoupled yet composable.
  25. /// </summary>
  26. [Serializable]
  27. public class CachingWrapperFilter:Filter
  28. {
  29. private Filter filter;
  30. /// <todo>  What about serialization in RemoteSearchable?  Caching won't work. </todo>
  31. /// <summary>       Should transient be removed?
  32. /// </summary>
  33. [NonSerialized]
  34. private System.Collections.IDictionary cache;
  35. /// <param name="filter">Filter to cache results of
  36. /// </param>
  37. public CachingWrapperFilter(Filter filter)
  38. {
  39. this.filter = filter;
  40. }
  41. public override System.Collections.BitArray Bits(IndexReader reader)
  42. {
  43. if (cache == null)
  44. {
  45. cache = new System.Collections.Hashtable();
  46. }
  47. lock (cache.SyncRoot)
  48. {
  49. // check cache
  50. System.Collections.BitArray cached = (System.Collections.BitArray) cache[reader];
  51. if (cached != null)
  52. {
  53. return cached;
  54. }
  55. }
  56. System.Collections.BitArray bits = filter.Bits(reader);
  57. lock (cache.SyncRoot)
  58. {
  59. // update cache
  60. cache[reader] = bits;
  61. }
  62. return bits;
  63. }
  64. public override System.String ToString()
  65. {
  66. return "CachingWrapperFilter(" + filter + ")";
  67. }
  68. public  override bool Equals(System.Object o)
  69. {
  70. if (!(o is CachingWrapperFilter))
  71. return false;
  72. return this.filter.Equals(((CachingWrapperFilter) o).filter);
  73. }
  74. public override int GetHashCode()
  75. {
  76. return filter.GetHashCode() ^ 0x1117BF25;
  77. }
  78. }
  79. }