33namespace Px . Search . Lucene
44{
55
6- public class LuceneIndex : IIndex
6+ public sealed class LuceneIndex : IIndex
77 {
8+ private bool _disposed ;
9+
810 private readonly string _indexDirectoryBase = "" ;
911 private string _indexDirectoryCurrent = "" ;
1012 private IndexWriter ? _writer ;
@@ -125,10 +127,12 @@ public void EndWrite(string language)
125127 public void AddEntry ( TableInformation tbl , PXMeta meta )
126128 {
127129 Document doc = GetDocument ( tbl , meta ) ;
128- if ( _writer ! = null )
130+ if ( _writer = = null )
129131 {
130- _writer . AddDocument ( doc ) ;
132+ throw new InvalidOperationException (
133+ "IndexWriter is not initialized. Call BeginWrite or BeginUpdate before modifying the index." ) ;
131134 }
135+ _writer . AddDocument ( doc ) ;
132136 }
133137
134138 public void UpdateEntry ( TableInformation tbl , PXMeta meta )
@@ -140,10 +144,14 @@ public void UpdateEntry(TableInformation tbl, PXMeta meta)
140144 //then the new doc will not have paths set (it uses tbl.Paths), so we use the old.
141145 RestorePathFromOld ( tbl , doc ) ;
142146 }
143- if ( _writer ! = null )
147+ if ( _writer = = null )
144148 {
145- _writer . UpdateDocument ( new Term ( SearchConstants . SEARCH_FIELD_DOCID , doc . Get ( SearchConstants . SEARCH_FIELD_DOCID ) ) , doc ) ;
149+ throw new InvalidOperationException (
150+ "IndexWriter is not initialized. Call BeginWrite or BeginUpdate before modifying the index." ) ;
146151 }
152+
153+ _writer . UpdateDocument ( new Term ( SearchConstants . SEARCH_FIELD_DOCID , doc . Get ( SearchConstants . SEARCH_FIELD_DOCID ) ) , doc ) ;
154+
147155 }
148156
149157 private void RestorePathFromOld ( TableInformation tbl , Document doc )
@@ -165,10 +173,12 @@ public void RemoveEntry(string id)
165173 {
166174 //check if document exists, if true deletes existing
167175 var searchQuery = new TermQuery ( new Term ( SearchConstants . SEARCH_FIELD_DOCID , id ) ) ;
168- if ( _writer ! = null )
176+ if ( _writer = = null )
169177 {
170- _writer . DeleteDocuments ( searchQuery ) ;
178+ throw new InvalidOperationException (
179+ "IndexWriter is not initialized. Call BeginWrite or BeginUpdate before modifying the index." ) ;
171180 }
181+ _writer . DeleteDocuments ( searchQuery ) ;
172182 }
173183
174184
@@ -178,54 +188,52 @@ public void RemoveEntry(string id)
178188 /// <param name="tbl">TableInformation object</param>
179189 /// <param name="meta">PxMeta object</param>
180190 /// <returns>Document object representing the table</returns>
181- private Document GetDocument ( TableInformation tbl , PXMeta meta )
191+ private static Document GetDocument ( TableInformation tbl , PXMeta meta )
182192 {
183193 Document doc = new Document ( ) ;
184194 DateTime updated2 ;
185195 string strUpdated = "" ;
186196
187- if ( tbl != null && meta != null )
197+ if ( string . IsNullOrEmpty ( tbl . Label ) || string . IsNullOrEmpty ( meta . Matrix ) || meta . Variables . Count == 0 )
188198 {
189- if ( string . IsNullOrEmpty ( tbl . Label ) || string . IsNullOrEmpty ( meta . Matrix ) || meta . Variables . Count == 0 )
190- {
191- return doc ;
192- }
199+ throw new InvalidOperationException (
200+ "Call to GetDocument must suppy data for Label, Matrix and meta.Variables." ) ;
201+ }
193202
194- if ( tbl . Updated != null )
195- {
196- updated2 = tbl . Updated . Value ;
197- strUpdated = DateTools . DateToString ( updated2 , DateResolution . SECOND ) ;
198- }
203+ if ( tbl . Updated != null )
204+ {
205+ updated2 = tbl . Updated . Value ;
206+ strUpdated = DateTools . DateToString ( updated2 , DateResolution . SECOND ) ;
207+ }
199208
200- doc . Add ( new StringField ( SearchConstants . SEARCH_FIELD_DOCID , tbl . Id , Field . Store . YES ) ) ; // Used as id when updating a document - NOT searchable!!!
201- doc . Add ( new StringField ( SearchConstants . SEARCH_FIELD_SEARCHID , tbl . Id . ToLower ( ) , Field . Store . NO ) ) ; // Used for finding a document by id - will be used for generating URL from just the tableid - Searchable!!!
202- doc . Add ( new StringField ( SearchConstants . SEARCH_FIELD_UPDATED , strUpdated , Field . Store . YES ) ) ;
203- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_MATRIX , meta . Matrix , Field . Store . YES ) ) ;
204- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_TITLE , tbl . Label , Field . Store . YES ) ) ;
205- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_DESCRIPTION , tbl . Description , Field . Store . YES ) ) ;
206- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_SORTCODE , tbl . SortCode , Field . Store . YES ) ) ;
207- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_CATEGORY , tbl . Category , Field . Store . YES ) ) ;
208- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_FIRSTPERIOD , tbl . FirstPeriod , Field . Store . YES ) ) ;
209- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_LASTPERIOD , tbl . LastPeriod , Field . Store . YES ) ) ;
210- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_VARIABLES , string . Join ( "|" , tbl . VariableNames ) , Field . Store . YES ) ) ;
211- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_PERIOD , meta . GetTimeValues ( ) , Field . Store . NO ) ) ;
212- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_VALUES , meta . GetAllValues ( ) , Field . Store . NO ) ) ;
213- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_CODES , meta . GetAllCodes ( ) , Field . Store . NO ) ) ;
214- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_GROUPINGS , meta . GetAllGroupings ( ) , Field . Store . NO ) ) ;
215- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_GROUPINGCODES , meta . GetAllGroupingCodes ( ) , Field . Store . NO ) ) ;
216- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_VALUESETS , meta . GetAllValuesets ( ) , Field . Store . NO ) ) ;
217- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_VALUESETCODES , meta . GetAllValuesetCodes ( ) , Field . Store . NO ) ) ;
218- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_DISCONTINUED , tbl . Discontinued == null ? "Unknown" : tbl . Discontinued . ToString ( ) , Field . Store . YES ) ) ;
219- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_TAGS , GetAllTags ( tbl . Tags ) , Field . Store . YES ) ) ;
220- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_SOURCE , tbl . Source , Field . Store . YES ) ) ;
221- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_TIME_UNIT , tbl . TimeUnit , Field . Store . YES ) ) ;
222- doc . Add ( new TextField ( SearchConstants . SEARCH_SUBJECT_CODE , tbl . SubjectCode , Field . Store . YES ) ) ;
223- doc . Add ( new StoredField ( SearchConstants . SEARCH_FIELD_PATHS , GetBytes ( tbl . Paths ) ) ) ;
224- doc . Add ( new StoredField ( SearchConstants . SEARCH_AVAILABLE_LANGUAGES , string . Join ( "|" , tbl . Languages ) ) ) ;
225- if ( ! string . IsNullOrEmpty ( meta . Synonyms ) )
226- {
227- doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_SYNONYMS , meta . Synonyms , Field . Store . NO ) ) ;
228- }
209+ doc . Add ( new StringField ( SearchConstants . SEARCH_FIELD_DOCID , tbl . Id , Field . Store . YES ) ) ; // Used as id when updating a document - NOT searchable!!!
210+ doc . Add ( new StringField ( SearchConstants . SEARCH_FIELD_SEARCHID , tbl . Id . ToLower ( ) , Field . Store . NO ) ) ; // Used for finding a document by id - will be used for generating URL from just the tableid - Searchable!!!
211+ doc . Add ( new StringField ( SearchConstants . SEARCH_FIELD_UPDATED , strUpdated , Field . Store . YES ) ) ;
212+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_MATRIX , meta . Matrix , Field . Store . YES ) ) ;
213+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_TITLE , tbl . Label , Field . Store . YES ) ) ;
214+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_DESCRIPTION , tbl . Description , Field . Store . YES ) ) ;
215+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_SORTCODE , tbl . SortCode , Field . Store . YES ) ) ;
216+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_CATEGORY , tbl . Category , Field . Store . YES ) ) ;
217+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_FIRSTPERIOD , tbl . FirstPeriod , Field . Store . YES ) ) ;
218+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_LASTPERIOD , tbl . LastPeriod , Field . Store . YES ) ) ;
219+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_VARIABLES , string . Join ( "|" , tbl . VariableNames ) , Field . Store . YES ) ) ;
220+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_PERIOD , meta . GetTimeValues ( ) , Field . Store . NO ) ) ;
221+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_VALUES , meta . GetAllValues ( ) , Field . Store . NO ) ) ;
222+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_CODES , meta . GetAllCodes ( ) , Field . Store . NO ) ) ;
223+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_GROUPINGS , meta . GetAllGroupings ( ) , Field . Store . NO ) ) ;
224+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_GROUPINGCODES , meta . GetAllGroupingCodes ( ) , Field . Store . NO ) ) ;
225+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_VALUESETS , meta . GetAllValuesets ( ) , Field . Store . NO ) ) ;
226+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_VALUESETCODES , meta . GetAllValuesetCodes ( ) , Field . Store . NO ) ) ;
227+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_DISCONTINUED , tbl . Discontinued == null ? "Unknown" : tbl . Discontinued . ToString ( ) , Field . Store . YES ) ) ;
228+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_TAGS , GetAllTags ( tbl . Tags ) , Field . Store . YES ) ) ;
229+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_SOURCE , tbl . Source , Field . Store . YES ) ) ;
230+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_TIME_UNIT , tbl . TimeUnit , Field . Store . YES ) ) ;
231+ doc . Add ( new TextField ( SearchConstants . SEARCH_SUBJECT_CODE , tbl . SubjectCode , Field . Store . YES ) ) ;
232+ doc . Add ( new StoredField ( SearchConstants . SEARCH_FIELD_PATHS , GetBytes ( tbl . Paths ) ) ) ;
233+ doc . Add ( new StoredField ( SearchConstants . SEARCH_AVAILABLE_LANGUAGES , string . Join ( "|" , tbl . Languages ) ) ) ;
234+ if ( ! string . IsNullOrEmpty ( meta . Synonyms ) )
235+ {
236+ doc . Add ( new TextField ( SearchConstants . SEARCH_FIELD_SYNONYMS , meta . Synonyms , Field . Store . NO ) ) ;
229237 }
230238
231239 return doc ;
@@ -257,11 +265,24 @@ private Document GetDocument(TableInformation tbl, PXMeta meta)
257265
258266 public void Dispose ( )
259267 {
268+ if ( _disposed )
269+ return ;
270+
260271 if ( _writer != null )
261272 {
262273 _writer . Rollback ( ) ;
274+ _writer . Dispose ( ) ;
263275 _writer = null ;
264276 }
277+
278+ _reader ? . Dispose ( ) ;
279+ _reader = null ;
280+ _indexSearcher = null ;
281+
282+ _disposed = true ;
283+
284+ GC . SuppressFinalize ( this ) ;
285+
265286 }
266287
267288 public static string GetAllTags ( string [ ] tags )
0 commit comments