Skip to content

Commit c9706e8

Browse files
jmdjmd
jmd
authored and
jmd
committedFeb 21, 2024·
boolean should be indexed as text instead of string
1 parent c33bafe commit c9706e8

File tree

3 files changed

+66
-30
lines changed

3 files changed

+66
-30
lines changed
 

‎src/DotJEM.Json.Index2.Management/Tracking/IIngestProgressTracker.cs

+41-29
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
using System.Diagnostics;
44
using System.IO;
55
using System.Linq;
6+
using System.Reactive.Subjects;
7+
using System.Runtime.Serialization;
68
using System.Threading.Tasks;
79
using DotJEM.Json.Index2.Management.Info;
10+
using DotJEM.Json.Index2.Management.Observables;
811
using DotJEM.Json.Index2.Management.Source;
912
using DotJEM.ObservableExtensions;
1013
using DotJEM.ObservableExtensions.InfoStreams;
@@ -22,9 +25,11 @@ public enum IngestInitializationState
2225
// ReSharper disable once PossibleInterfaceMemberAmbiguity -> Just dictates implementation must be explicit which is OK.
2326
public interface IIngestProgressTracker :
2427
IObserver<IJsonDocumentChange>,
25-
IObserver<IInfoStreamEvent>, IObservable<ITrackerState>
28+
IObserver<IInfoStreamEvent>,
29+
IObservable<ITrackerState>
2630
{
27-
IngestInitializationState InitializationState { get; }
31+
IObservableValue<IngestInitializationState> InitializationState { get; }
32+
2833
IInfoStream InfoStream { get; }
2934
StorageIngestState IngestState { get; }
3035
SnapshotRestoreState RestoreState { get; }
@@ -41,35 +46,42 @@ public class IngestProgressTracker : BasicSubject<ITrackerState>, IIngestProgres
4146
private readonly ConcurrentDictionary<string, StorageAreaIngestStateTracker> observerTrackers = new();
4247
private readonly ConcurrentDictionary<string, IndexFileRestoreStateTracker> restoreTrackers = new();
4348
private readonly IInfoStream<JsonIndexManager> infoStream = new InfoStream<JsonIndexManager>();
44-
private IngestInitializationState initializationState;
49+
public IObservableValue<IngestInitializationState> InitializationState { get; } = new ObservableValue<IngestInitializationState>();
4550

4651
public IInfoStream InfoStream => infoStream;
4752

48-
public IngestInitializationState InitializationState
49-
{
50-
get => initializationState;
51-
private set
52-
{
53-
if(initializationState == value) return;
54-
55-
initializationState = value;
56-
TaskCompletionSource<bool> target = value switch
57-
{
58-
IngestInitializationState.Started => startedEntered,
59-
IngestInitializationState.Restoring => restoringEntered,
60-
IngestInitializationState.Ingesting => ingestingEntered,
61-
IngestInitializationState.Initialized => initializedEntered,
62-
_ => null
63-
};
64-
target?.TrySetResult(true);
65-
}
66-
}
67-
6853
private readonly TaskCompletionSource<bool> startedEntered = new ();
6954
private readonly TaskCompletionSource<bool> restoringEntered = new ();
7055
private readonly TaskCompletionSource<bool> ingestingEntered = new ();
7156
private readonly TaskCompletionSource<bool> initializedEntered = new ();
7257

58+
private void UpdateState(IngestInitializationState newState)
59+
{
60+
switch (newState)
61+
{
62+
case IngestInitializationState.Started:
63+
startedEntered.TrySetResult(true);
64+
break;
65+
case IngestInitializationState.Restoring:
66+
startedEntered.TrySetResult(true);
67+
restoringEntered.TrySetResult(true);
68+
break;
69+
case IngestInitializationState.Ingesting:
70+
startedEntered.TrySetResult(true);
71+
restoringEntered.TrySetResult(true);
72+
ingestingEntered.TrySetResult(true);
73+
break;
74+
case IngestInitializationState.Initialized:
75+
startedEntered.TrySetResult(true);
76+
restoringEntered.TrySetResult(true);
77+
ingestingEntered.TrySetResult(true);
78+
initializedEntered.TrySetResult(true);
79+
break;
80+
default:
81+
throw new ArgumentOutOfRangeException(nameof(newState), newState, null);
82+
}
83+
}
84+
7385

7486
// TODO: We are adding a number of computational cycles here on each single update, this should be improved as well.
7587
// So we don't have to do a loop on each turn, but later with that.
@@ -78,7 +90,7 @@ private set
7890

7991
public IngestProgressTracker()
8092
{
81-
InitializationState = IngestInitializationState.Started;
93+
UpdateState(IngestInitializationState.Started);
8294
}
8395

8496
public void OnNext(IJsonDocumentChange value)
@@ -98,7 +110,7 @@ public void UpdateState(StorageAreaIngestState state)
98110

99111
public void SetInitialized(bool initialized)
100112
{
101-
if (initialized) this.InitializationState = IngestInitializationState.Initialized;
113+
if (initialized) UpdateState(IngestInitializationState.Initialized);
102114
}
103115

104116
public void OnNext(IInfoStreamEvent value)
@@ -182,7 +194,7 @@ private void OnStorageObserverInfoStreamEvent(StorageObserverInfoStreamEvent soe
182194

183195
private void InternalPublish(ITrackerState state)
184196
{
185-
if (InitializationState == IngestInitializationState.Initialized)
197+
if (InitializationState.Value == IngestInitializationState.Initialized)
186198
{
187199
Publish(state);
188200
return;
@@ -191,16 +203,16 @@ private void InternalPublish(ITrackerState state)
191203
switch (state)
192204
{
193205
case SnapshotRestoreState:
194-
InitializationState = IngestInitializationState.Restoring;
206+
UpdateState(IngestInitializationState.Restoring);
195207
break;
196208

197209
case StorageIngestState storageIngestState:
198210
JsonSourceEventType[] states = storageIngestState.Areas
199211
.Select(x => x.LastEvent)
200212
.ToArray();
201-
InitializationState = states.All(state => state is JsonSourceEventType.Updated or JsonSourceEventType.Updating or JsonSourceEventType.Initialized)
213+
UpdateState(states.All(state => state is JsonSourceEventType.Updated or JsonSourceEventType.Updating or JsonSourceEventType.Initialized)
202214
? IngestInitializationState.Initialized
203-
: IngestInitializationState.Ingesting;
215+
: IngestInitializationState.Ingesting);
204216
break;
205217

206218
}

‎src/DotJEM.Json.Index2.Test/JsonIndexTest.cs

+24
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,28 @@ public async Task SayHello_ReturnsHello()
5959
int count = searcher.Search(new MatchAllDocsQuery()).Count();
6060
Assert.AreEqual(1, count);
6161
}
62+
[Test]
63+
public async Task Search_Booleans()
64+
{
65+
IJsonIndex index = new JsonIndexBuilder("myIndex")
66+
.UsingMemmoryStorage()
67+
.WithAnalyzer(cfg => new StandardAnalyzer(cfg.Version))
68+
.WithFieldResolver(new FieldResolver("uuid", "type"))
69+
.Build();
70+
71+
IJsonIndexWriter writer = index.CreateWriter();
72+
writer.Update(JObject.FromObject(new { uuid = Guid.NewGuid(), type = "CAR", inStock = false }));
73+
writer.Update(JObject.FromObject(new { uuid = Guid.NewGuid(), type = "CAR", inStock = true }));
74+
writer.Update(JObject.FromObject(new { uuid = Guid.NewGuid(), type = "CAR", inStock = false }));
75+
writer.Update(JObject.FromObject(new { uuid = Guid.NewGuid(), type = "CAR", inStock = true }));
76+
writer.Update(JObject.FromObject(new { uuid = Guid.NewGuid(), type = "CAR", inStock = true }));
77+
writer.Commit();
78+
79+
80+
81+
IJsonIndexSearcher? searcher = index.CreateSearcher();
82+
//int count = searcher.Search(new TermQuery(new Term("type", "car"))).Count();
83+
int count = searcher.Search(new TermQuery(new Term("inStock", "true"))).Count();
84+
Assert.AreEqual(3, count);
85+
}
6286
}

‎src/DotJEM.Json.Index2/Documents/Strategies/IFieldStrategy.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public class BooleanFieldStrategy : IFieldStrategy
118118
public IEnumerable<IIndexableJsonField> CreateFields(JToken token, IPathContext context)
119119
{
120120
yield return new JsonIndexableFieldBuilder<bool>(this, token, context)
121-
.CreateStringField(b => b.ToString())
121+
.CreateTextField(b => b.ToString())
122122
.Build();
123123
}
124124
}

0 commit comments

Comments
 (0)
Please sign in to comment.