Skip to content

Instantly share code, notes, and snippets.

@Swoogan
Created March 30, 2015 16:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Swoogan/41c3bb1beb3cdfd9f209 to your computer and use it in GitHub Desktop.
Save Swoogan/41c3bb1beb3cdfd9f209 to your computer and use it in GitHub Desktop.
public struct DocIdLookup
{
public List<string> DocIds;
public int Index;
}
public class Indexer
{
private readonly Dictionary<string, List<string>> _terms =
new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
private readonly Dictionary<string, List<DocIdLookup>> _docIds =
new Dictionary<string, List<DocIdLookup>>();
public void Index(string docId, string text)
{
List<DocIdLookup> indexes;
if (_docIds.TryGetValue(docId, out indexes))
{
foreach (var index in indexes)
index.DocIds.RemoveAt(index.Index);
}
else
{
indexes = new List<DocIdLookup>();
}
var words = text.Split();
foreach (var term in words)
{
List<string> val;
if (_terms.TryGetValue(term, out val) == false)
{
val = new List<string>();
_terms[term] = val;
}
val.Add(docId);
indexes.Add(new DocIdLookup
{
DocIds = val,
Index = val.Count - 1
});
}
_docIds[docId] = indexes;
}
public List<string> Query(string term)
{
List<string> val;
_terms.TryGetValue(term, out val);
return val ?? new List<string>();
}
public void Delete(string docId)
{
List<DocIdLookup> indexes;
if (!_docIds.TryGetValue(docId, out indexes))
return;
foreach (var index in indexes)
index.DocIds.RemoveAt(index.Index);
_docIds.Remove(docId);
}
}
[TestMethod]
public void CanIndexAndQuery()
{
var index = new Indexer();
index.Index("users/1", "Oren Eini");
index.Index("users/2", "Hibernating Rhinos");
index.Index("users/3", "Oren is Anyende");
Assert.IsTrue(index.Query("eini").Contains("users/1"));
Assert.IsTrue(index.Query("rhinos").Contains("users/2"));
Assert.IsTrue(index.Query("Oren").Contains("users/1"));
Assert.IsTrue(index.Query("Oren").Contains("users/3"));
}
[TestMethod]
public void CanUpdate()
{
var index = new Indexer();
index.Index("users/1", "Oren Eini");
//updating
index.Index("users/1", "Ayende Rahien");
Assert.IsTrue(index.Query("Rahien").Contains("users/1"));
Assert.IsTrue(index.Query("eini").Count == 0);
}
[TestMethod]
public void CanDelete()
{
var index = new Indexer();
index.Index("users/1", "Oren Eini");
var query = index.Query("Oren");
Assert.IsTrue(query.Contains("users/1"));
// deleting
index.Delete("users/1");
Assert.IsTrue(index.Query("Oren").Count == 0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment