Skip to content

Commit e41e13c

Browse files
small cleanup and sonar complaint
1 parent 87cab59 commit e41e13c

File tree

2 files changed

+70
-49
lines changed

2 files changed

+70
-49
lines changed

Px.Search.Lucene/LuceneIndex.cs

Lines changed: 68 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
namespace 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)

Px.Search/Indexer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,9 @@ private void UpdateTable(string id, TableLink tblLink, string language, IIndex i
263263
builder.BuildForSelection();
264264
var model = builder.Model;
265265
TableInformation tbl = GetTableInformation(id, tblLink, model.Meta);
266-
if (_breadcrumbs.ContainsKey(id))
266+
if (_breadcrumbs.TryGetValue(id, out var paths))
267267
{
268-
tbl.Paths = _breadcrumbs[id];
268+
tbl.Paths = paths;
269269
}
270270

271271
tbl.Languages = _tableLanguages.TryGetValue(id, out List<string>? value) ? [.. value] : [language];

0 commit comments

Comments
 (0)