Work on the CLI. More to go, but it's taking shape nicely!
This commit is contained in:
parent
ac90b9b983
commit
b55fdeae34
5 changed files with 149 additions and 6 deletions
|
@ -1,15 +1,132 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
using SearchBox;
|
using SearchBox;
|
||||||
|
|
||||||
|
|
||||||
namespace SearchBoxCLI
|
namespace SearchBoxCLI
|
||||||
{
|
{
|
||||||
class MainClass
|
enum OperatingModes
|
||||||
{
|
{
|
||||||
public static void Main(string[] args)
|
Query,
|
||||||
|
Index,
|
||||||
|
InvertedIndexAdd,
|
||||||
|
InvertedIndexRemove,
|
||||||
|
InvertedIndexUpdate
|
||||||
|
}
|
||||||
|
|
||||||
|
enum OutputModes
|
||||||
{
|
{
|
||||||
string input = Console.In.ReadToEnd();
|
Json,
|
||||||
Index index = new Index(input);
|
Text
|
||||||
|
}
|
||||||
|
|
||||||
|
class MainClass {
|
||||||
|
private static OperatingModes Mode = OperatingModes.Query;
|
||||||
|
private static string Name = string.Empty;
|
||||||
|
private static string InvIndexFilepath = string.Empty;
|
||||||
|
private static string IdMapFilepath = string.Empty;
|
||||||
|
private static TextReader Source = Console.In;
|
||||||
|
private static OutputModes OutputMode = OutputModes.Json;
|
||||||
|
|
||||||
|
public static int Main(string[] args)
|
||||||
|
{
|
||||||
|
List<string> extras = new List<string>();
|
||||||
|
for (int i = 0; i < args.Length; i++)
|
||||||
|
{
|
||||||
|
switch (args[i].TrimStart("-".ToCharArray()))
|
||||||
|
{
|
||||||
|
case "s":
|
||||||
|
case "source":
|
||||||
|
Source = new StreamReader(args[++i]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "n":
|
||||||
|
case "name":
|
||||||
|
Name = args[++i];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "invindex":
|
||||||
|
InvIndexFilepath = args[++i];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "idmap":
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "help":
|
||||||
|
Console.WriteLine("SearchBox");
|
||||||
|
Console.WriteLine("---------");
|
||||||
|
Console.WriteLine("A standalone full-text search engine.");
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Usage:");
|
||||||
|
Console.WriteLine(" ./SearchBox.exe {mode} [options]");
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Modes:");
|
||||||
|
Console.WriteLine(" query Query a pre-existing inverted search index");
|
||||||
|
Console.WriteLine(" index Generate a raw index of the source document.");
|
||||||
|
Console.WriteLine(" add Add a named document to an inverted search index.");
|
||||||
|
Console.WriteLine(" remove Remove a named document from an inverted search index.");
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Options:");
|
||||||
|
Console.WriteLine(" --source, -s Specifies the source document {index, add}");
|
||||||
|
Console.WriteLine(" --name, -n Sets the name of the source document {add, remove}");
|
||||||
|
Console.WriteLine(" --idmap, -i Specifies the location of the id map, which is used to map document names onto their nuemical ids {add, remove}");
|
||||||
|
Console.WriteLine(" --invindex Specifies the location of the inverted search index to use {add, remove}");
|
||||||
|
Console.WriteLine(" ");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Console.Error.WriteLine($"Error: Unknown property {args[i]}.");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string modeText = extras.First(); extras.RemoveAt(0);
|
||||||
|
Mode = (OperatingModes)Enum.Parse(typeof(OperatingModes), modeText);
|
||||||
|
|
||||||
|
switch (Mode) {
|
||||||
|
case OperatingModes.Index: return HandleIndex();
|
||||||
|
case OperatingModes.InvertedIndexAdd: return HandleInvIndexAdd();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int HandleInvIndexAdd()
|
||||||
|
{
|
||||||
|
if (!File.Exists(InvIndexFilepath))
|
||||||
|
File.WriteAllText(InvIndexFilepath, "[]");
|
||||||
|
if (!File.Exists(IdMapFilepath))
|
||||||
|
File.WriteAllText(InvIndexFilepath, "{}");
|
||||||
|
|
||||||
|
IdMap idMap = JsonConvert.DeserializeObject<IdMap>(File.ReadAllText(IdMapFilepath));
|
||||||
|
InvertedIndex invertedIndex = JsonConvert.DeserializeObject<InvertedIndex>(
|
||||||
|
File.ReadAllText(InvIndexFilepath)
|
||||||
|
);
|
||||||
|
Index newIndex = new Index(Source.ReadToEnd());
|
||||||
|
invertedIndex.AddIndex(newIndex);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int HandleIndex()
|
||||||
|
{
|
||||||
|
Index index = new Index(Source.ReadToEnd());
|
||||||
|
switch (OutputMode)
|
||||||
|
{
|
||||||
|
case OutputModes.Json:
|
||||||
|
Console.WriteLine(JsonConvert.SerializeObject(index));
|
||||||
|
break;
|
||||||
|
case OutputModes.Text:
|
||||||
Console.WriteLine(index);
|
Console.WriteLine(index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,12 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
<Reference Include="Newtonsoft.Json">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Newtonsoft.Json">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
|
@ -41,5 +47,8 @@
|
||||||
<Name>SearchBox</Name>
|
<Name>SearchBox</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
</Project>
|
</Project>
|
4
SearchBox-CLI/packages.config
Normal file
4
SearchBox-CLI/packages.config
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="Newtonsoft.Json" version="11.0.2" targetFramework="net47" />
|
||||||
|
</packages>
|
|
@ -1,4 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
using Stackoverflow.Utilities;
|
using Stackoverflow.Utilities;
|
||||||
|
|
||||||
namespace SearchBox
|
namespace SearchBox
|
||||||
|
@ -45,5 +47,13 @@ namespace SearchBox
|
||||||
{
|
{
|
||||||
map.RemoveBySecond(pageName);
|
map.RemoveBySecond(pageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
StringBuilder result = new StringBuilder("Id Map:\n");
|
||||||
|
foreach (BiDictionary<int, string>.Pair pair in map)
|
||||||
|
result.AppendLine($"\t{pair.First}: {pair.Second}");
|
||||||
|
return result.ToString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -33,6 +33,9 @@
|
||||||
<Reference Include="UnidecodeSharpFork">
|
<Reference Include="UnidecodeSharpFork">
|
||||||
<HintPath>..\packages\UnidecodeSharpFork.1.0.0\lib\UnidecodeSharpFork.dll</HintPath>
|
<HintPath>..\packages\UnidecodeSharpFork.1.0.0\lib\UnidecodeSharpFork.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Newtonsoft.Json">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
@ -43,7 +46,7 @@
|
||||||
<Compile Include="Utilities\StringPlus.cs" />
|
<Compile Include="Utilities\StringPlus.cs" />
|
||||||
<Compile Include="StopwordTester.cs" />
|
<Compile Include="StopwordTester.cs" />
|
||||||
<Compile Include="InvertedIndex.cs" />
|
<Compile Include="InvertedIndex.cs" />
|
||||||
<Compile Include="IdMapper.cs" />
|
<Compile Include="IdMap.cs" />
|
||||||
<Compile Include="Utilities\BiDictionary.cs" />
|
<Compile Include="Utilities\BiDictionary.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
Loading…
Reference in a new issue