-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathJsonIndexWriter.cs
111 lines (92 loc) · 3.6 KB
/
JsonIndexWriter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System;
using System.Collections.Generic;
using System.Linq;
using DotJEM.Json.Index2.Documents;
using DotJEM.Json.Index2.Util;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Newtonsoft.Json.Linq;
namespace DotJEM.Json.Index2.IO
{
public interface IJsonIndexWriter : IDisposable
{
void Create(JObject doc);
void Create(IEnumerable<JObject> docs);
void Update(JObject doc);
void Update(IEnumerable<JObject> docs);
void Delete(JObject doc);
void Delete(IEnumerable<JObject> docs);
void Commit();
void Flush(bool triggerMerge, bool applyDeletes);
}
public class JsonIndexWriter : Disposable, IJsonIndexWriter
{
private readonly IIndexWriterManager manager;
private readonly ILuceneDocumentFactory factory;
public IJsonIndex Index { get; }
//public IndexWriter UnderlyingWriter => manager.Writer;
public JsonIndexWriter(IJsonIndex index, ILuceneDocumentFactory factory, IIndexWriterManager manager)
{
Index = index;
this.factory = factory;
this.manager = manager;
}
public void Create(JObject doc) => Create(new[] { doc });
public void Create(IEnumerable<JObject> docs)
{
IEnumerable<Document> documents = factory
.Create(docs)
.Select(tuple => tuple.Document);
WithLease(writer => writer.AddDocuments(documents));
}
public void Update(JObject doc) => Update(new[] { doc });
public void Update(IEnumerable<JObject> docs)
{
IEnumerable<LuceneDocumentEntry> documents = factory.Create(docs);
WithLease(writer => {
foreach ((Term key, Document doc) in documents)
writer.UpdateDocument(key, doc);
});
}
public void Delete(JObject doc) => Delete(new[] { doc });
public void Delete(IEnumerable<JObject> docs)
{
IEnumerable<LuceneDocumentEntry> documents = factory.Create(docs);
WithLease(writer => {
foreach ((Term key, Document _) in documents)
writer.DeleteDocuments(key);
});
}
public void ForceMerge(int maxSegments)
=> WithLease(writer => writer.ForceMerge(maxSegments));
public void ForceMerge(int maxSegments, bool wait)
=> WithLease(writer => writer.ForceMerge(maxSegments, wait));
public void ForceMergeDeletes()
=> WithLease(writer => writer.ForceMergeDeletes());
public void ForceMergeDeletes(bool wait)
=> WithLease(writer => writer.ForceMergeDeletes(wait));
public void Rollback()
=> WithLease(writer => writer.Rollback());
public void Flush(bool triggerMerge, bool applyDeletes)
=> WithLease(writer => writer.Flush(triggerMerge, applyDeletes));
public void Commit()
=> WithLease(writer => writer.Commit());
public void PrepareCommit()
=> WithLease(writer => writer.PrepareCommit());
public void SetCommitData(IDictionary<string, string> commitUserData)
=> WithLease(writer => writer.SetCommitData(commitUserData));
private void WithLease(Action<IndexWriter> action)
{
using ILease<IndexWriter> lease =manager.Lease();
action(lease.Value);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
Commit();
}
base.Dispose(disposing);
}
}
}