diff --git a/SearchBox-CLI/Program.cs b/SearchBox-CLI/Program.cs
index 64d3832..7e2db00 100644
--- a/SearchBox-CLI/Program.cs
+++ b/SearchBox-CLI/Program.cs
@@ -7,6 +7,8 @@ using Newtonsoft.Json;
using LibSearchBox;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Serialization;
+using System.Threading.Tasks;
+using SBRL.Utilities;
namespace SearchBoxCLI
{
@@ -156,22 +158,23 @@ namespace SearchBoxCLI
if (!Batch)
searchBox.AddDocument(Name, Tags, Source.ReadToEnd());
else {
- string nextLine = "";
- while ((nextLine = Source.ReadLine()) != null) {
- string[] parts = nextLine.Split('|');
- if (parts[0].Trim().Length == 0)
- continue;
- try {
+ try
+ {
+ Parallel.ForEach(LineIterator.GetLines(Source), (string nextLine) => {
+ string[] parts = nextLine.Split('|');
+ if (parts[0].Trim().Length == 0)
+ return;
+
searchBox.AddDocument(
parts[1].Trim(),
Regex.Split(parts[2], @",\s*"),
File.ReadAllText(parts[0].Trim())
);
Console.Error.WriteLine($"[Searchbox] [add] {parts[0].Trim()}");
- } catch (FileNotFoundException) {
- Console.Error.WriteLine($"Error: Can't find file {parts[2].Trim()}.");
- return 1;
- }
+ });
+ } catch (FileNotFoundException error) {
+ Console.Error.WriteLine(error.Message);
+ return 1;
}
}
diff --git a/SearchBox-CLI/SearchBox-CLI.csproj b/SearchBox-CLI/SearchBox-CLI.csproj
index 9560f3a..110dd92 100644
--- a/SearchBox-CLI/SearchBox-CLI.csproj
+++ b/SearchBox-CLI/SearchBox-CLI.csproj
@@ -40,6 +40,7 @@
+
@@ -50,5 +51,8 @@
+
+
+
\ No newline at end of file
diff --git a/SearchBox-CLI/Utilities/LineIterator.cs b/SearchBox-CLI/Utilities/LineIterator.cs
new file mode 100644
index 0000000..5d2cc1a
--- /dev/null
+++ b/SearchBox-CLI/Utilities/LineIterator.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+namespace SBRL.Utilities
+{
+ static class LineIterator {
+
+ public static IEnumerable GetLines(TextReader source)
+ {
+ string nextLine;
+ while ((nextLine = source.ReadLine()) != null) {
+ yield return nextLine;
+ }
+ }
+
+ public static IEnumerable GetLines(string source)
+ {
+ source = source.Replace("\r\n", "\n");
+ int curPosition = 0, nextIndex;
+ while (true)
+ {
+ nextIndex = source.IndexOf("\n", curPosition);
+ if (nextIndex == -1)
+ break;
+
+ yield return source.Substring(curPosition, nextIndex - curPosition);
+
+ curPosition = nextIndex + 1;
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/SearchBox/IdMap.cs b/SearchBox/IdMap.cs
index 05b572a..3403ee6 100644
--- a/SearchBox/IdMap.cs
+++ b/SearchBox/IdMap.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using System.Threading;
using Newtonsoft.Json;
using Stackoverflow.Utilities;
@@ -41,6 +42,12 @@ namespace LibSearchBox
nextId = map.Max((pair) => pair.First) + 1;
}
+ private int generateNewId()
+ {
+ int incremented = Interlocked.Increment(ref nextId);
+ return incremented - 1; // Only the incrementing itself has to be atomic
+ }
+
public int GetId(string pageName)
{
@@ -49,7 +56,7 @@ namespace LibSearchBox
int result;
if (!map.TryGetBySecond(pageName, out result)) {
- map.Add(result = nextId++, pageName);
+ map.Add(result = generateNewId(), pageName);
}
return result;
}
diff --git a/SearchBox/Utilities/BiDictionary.cs b/SearchBox/Utilities/BiDictionary.cs
index 42e4328..be67835 100644
--- a/SearchBox/Utilities/BiDictionary.cs
+++ b/SearchBox/Utilities/BiDictionary.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections;
+using System.Collections.Concurrent;
using System.Collections.Generic;
namespace Stackoverflow.Utilities
@@ -26,9 +27,9 @@ namespace Stackoverflow.Utilities
public struct Enumerator : IEnumerator, IEnumerator
{
- public Enumerator(Dictionary.Enumerator dictEnumerator)
+ public Enumerator(IEnumerable> dictEnumerator)
{
- _dictEnumerator = dictEnumerator;
+ _dictEnumerator = dictEnumerator.GetEnumerator();
}
public Pair Current {
@@ -61,7 +62,7 @@ namespace Stackoverflow.Utilities
throw new NotSupportedException();
}
- private Dictionary.Enumerator _dictEnumerator;
+ private IEnumerator> _dictEnumerator;
}
@@ -78,8 +79,8 @@ namespace Stackoverflow.Utilities
if (_firstToSecond.ContainsKey(first) || _secondToFirst.ContainsKey(second))
throw new ArgumentException("Duplicate first or second");
- _firstToSecond.Add(first, second);
- _secondToFirst.Add(second, first);
+ _firstToSecond.TryAdd(first, second);
+ _secondToFirst.TryAdd(second, first);
}
///
@@ -124,8 +125,8 @@ namespace Stackoverflow.Utilities
if (!_firstToSecond.TryGetValue(first, out second))
throw new ArgumentException("first");
- _firstToSecond.Remove(first);
- _secondToFirst.Remove(second);
+ _firstToSecond.TryRemove(first, out TSecond noop);
+ _secondToFirst.TryRemove(second, out TFirst noopAgain);
}
///
@@ -139,8 +140,8 @@ namespace Stackoverflow.Utilities
if (!_secondToFirst.TryGetValue(second, out first))
throw new ArgumentException("second");
- _secondToFirst.Remove(second);
- _firstToSecond.Remove(first);
+ _secondToFirst.TryRemove(second, out TFirst noop);
+ _firstToSecond.TryRemove(first, out TSecond noopAgain);
}
#endregion
@@ -159,9 +160,9 @@ namespace Stackoverflow.Utilities
if (_firstToSecond.ContainsKey(first) || _secondToFirst.ContainsKey(second))
return false;
- _firstToSecond.Add(first, second);
- _secondToFirst.Add(second, first);
- return true;
+ bool result = _firstToSecond.TryAdd(first, second);
+ result = _secondToFirst.TryAdd(second, first) || result;
+ return result;
}
@@ -200,9 +201,9 @@ namespace Stackoverflow.Utilities
if (!_firstToSecond.TryGetValue(first, out second))
return false;
- _firstToSecond.Remove(first);
- _secondToFirst.Remove(second);
- return true;
+ bool result = _firstToSecond.TryRemove(first, out TSecond noop);
+ result = _secondToFirst.TryRemove(second, out TFirst noopAgain) || result;
+ return result;
}
///
@@ -216,8 +217,8 @@ namespace Stackoverflow.Utilities
if (!_secondToFirst.TryGetValue(second, out first))
return false;
- _secondToFirst.Remove(second);
- _firstToSecond.Remove(first);
+ _secondToFirst.TryRemove(second, out TFirst noop);
+ _firstToSecond.TryRemove(first, out TSecond noopAgain);
return true;
}
@@ -243,7 +244,7 @@ namespace Stackoverflow.Utilities
public Enumerator GetEnumerator()
{
//enumerator.Reset(firstToSecond.GetEnumerator());
- return new Enumerator(_firstToSecond.GetEnumerator());
+ return new Enumerator(_firstToSecond);
}
IEnumerator IEnumerable.GetEnumerator()
@@ -258,8 +259,8 @@ namespace Stackoverflow.Utilities
- private Dictionary _firstToSecond = new Dictionary();
- private Dictionary _secondToFirst = new Dictionary();
+ private ConcurrentDictionary _firstToSecond = new ConcurrentDictionary();
+ private ConcurrentDictionary _secondToFirst = new ConcurrentDictionary();
}
}
\ No newline at end of file