Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/phase05 #5

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using FullTextSearch.Core;

namespace FullTextSearch.Controller.DocumentController.Abstraction;

public interface IDocumentBuilder
{

void BuildName(string name);
void BuildPath(string path);
void BuildText(string text);
void DeleteExtraSpace();
void BuildWords();
Document GetDocument();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace FullTextSearch.Controller.DocumentController.Abstraction;

public interface IDocumentDirector
{
void Construct(string name, string path, string text, IDocumentBuilder documentBuilder);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace FullTextSearch.Controller.DocumentController.Abstraction;

public interface IDocumentFormatter
{
string ToUpper(string text);
IEnumerable<string> Split(string queryText, string regex);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using System.Text.RegularExpressions;
using FullTextSearch.Controller.DocumentController.Abstraction;
using FullTextSearch.Core;

namespace FullTextSearch.Controller.DocumentController;

public class DocumentBuilder : IDocumentBuilder
{
private readonly Document _document;
private readonly IDocumentFormatter _documentFormatter;

public DocumentBuilder(IDocumentFormatter documentFormatter)
{
_documentFormatter = documentFormatter ?? throw new ArgumentNullException(nameof(documentFormatter));
_document = new Document();
}

public void BuildName(string name)
{
_document.Name = name;
}

public void BuildPath(string path)
{
_document.Path = path;
}

public void BuildText(string text)
{
_document.Text = text;
}

public void DeleteExtraSpace()
{
_document.Text = Regex.Replace( _document.Text, @"\s+", " ");
}
public void BuildWords()
{
_document.Words = _documentFormatter
.Split(_documentFormatter
.ToUpper(_document.Text), " ");
}

public Document GetDocument()
{
return _document;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using FullTextSearch.Controller.DocumentController.Abstraction;

namespace FullTextSearch.Controller.DocumentController;

public class DocumentDirector : IDocumentDirector
{
public void Construct(string name, string path, string text, IDocumentBuilder documentBuilder)
{
documentBuilder.BuildName(name);
documentBuilder.BuildPath(path);
documentBuilder.BuildText(text);
documentBuilder.DeleteExtraSpace();
documentBuilder.BuildWords();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Text.RegularExpressions;
using FullTextSearch.Controller.DocumentController.Abstraction;

namespace FullTextSearch.Controller.DocumentController;

public class DocumentFormatter : IDocumentFormatter{

public string ToUpper(string text)
{
return text.ToUpper();
}

public IEnumerable<string> Split(string queryText, string regex)
{
return Regex.Split(queryText, regex);
}

}
22 changes: 22 additions & 0 deletions phase05/FullTextSearch.Controller/FullTextSearch.Controller.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\FullTextSearch.Model\FullTextSearch.Model.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="NSubstitute" Version="5.1.0" />
<PackageReference Include="NSubstitute.Analyzers.VisualBasic" Version="1.0.17">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
using FullTextSearch.Core;

namespace FullTextSearch.Controller.InvertedIndexController.Abstraction;

public interface IInvertedIndexMapper {
Dictionary<string, IEnumerable<Document>> Map(IEnumerable<Document> documents);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using FullTextSearch.Controller.InvertedIndexController.Abstraction;
using FullTextSearch.Core;

namespace FullTextSearch.Controller.InvertedIndexController;

public class InvertedIndexMapper : IInvertedIndexMapper
{
public Dictionary<string, IEnumerable<Document>> Map(IEnumerable<Document> documents)
{
var invertedIndex = new Dictionary<string, List<Document>>();

foreach (var document in documents)
{
var words = document.Words.ToList();

for (int startIndex = 0; startIndex < words.Count; startIndex++)
{
for (int endIndex = startIndex + 1; endIndex <= Math.Min(words.Count, startIndex + 5); endIndex++)
{
var phrase = string.Join(" ", words.Skip(startIndex).Take(endIndex - startIndex));

if (!invertedIndex.ContainsKey(phrase))
invertedIndex.Add(phrase, new List<Document>(){document});

else if(!invertedIndex[phrase].Contains(document))
invertedIndex[phrase].Add(document);
}
}
}
return invertedIndex.ToDictionary(pair => pair.Key, pair => (IEnumerable<Document>)pair.Value);
}
}
2 changes: 2 additions & 0 deletions phase05/FullTextSearch.Controller/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using FullTextSearch.Core;

namespace FullTextSearch.Controller.QueryController.Abstraction;

public interface IQueryBuilder
{
void BuildText(string text);
void BuildWordsBySign(IEnumerable<IWordCollector> collectors);
Query GetQuery();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace FullTextSearch.Controller.QueryController.Abstraction;

public interface IQueryDirector
{
void Construct(string text, IQueryBuilder queryBuilder);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace FullTextSearch.Controller.QueryController.Abstraction;

public interface IWordCollector
{
string Pattern { get; init; }
char Sign { get; init; }
IEnumerable<string> Collect(string text);
IEnumerable<string> RemovePrefix(IEnumerable<string> collectedWords);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using FullTextSearch.Core;

namespace FullTextSearch.Controller.QueryController.Abstraction;

public interface IWordCollectorDriver
{
void DriveCollect(IEnumerable<IWordCollector> collectors, Query query);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Text.RegularExpressions;
using FullTextSearch.Controller.QueryController.Abstraction;

namespace FullTextSearch.Controller.QueryController;

public class MinusWordCollector : IWordCollector
{
public string Pattern { get; init; } = @"(-""[^""]+""|-\w+)";
public char Sign { get; init; } = '-';
public IEnumerable<string> Collect(string text)
{
var regex = new Regex(Pattern);

var matches = regex.Matches(text);

return matches.Select(m => m.Value);
}

public IEnumerable<string> RemovePrefix(IEnumerable<string> collectedWords)
{
return collectedWords.Select(c => c.Trim('-').Trim('"').ToUpper());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Text.RegularExpressions;
using FullTextSearch.Controller.QueryController.Abstraction;

namespace FullTextSearch.Controller.QueryController;

public class NoSignedWordCollector : IWordCollector
{
public string Pattern { get; init; } = @"(\+""[^""]+""|\+\w+)|(-""[^""]+""|-\w+)|(""[^""]+""|\b\w+\b)";
public char Sign { get; init; } = ' ';

public IEnumerable<string> Collect(string text)
{
var regex = new Regex(Pattern);
var matches = regex.Matches(text);

return matches.Select(m => m.Value);
}

public IEnumerable<string> RemovePrefix(IEnumerable<string> collectedWords)
{
return collectedWords
.Where(c => !c.StartsWith("+") && !c.StartsWith("-"))
.Select(c => c.Trim('"').ToUpper());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System.Text.RegularExpressions;
using FullTextSearch.Controller.QueryController.Abstraction;

namespace FullTextSearch.Controller.QueryController;

public class PlusWordsCollector : IWordCollector
{
public string Pattern { get; init; }= @"(\+""[^""]+""|\+\w+)";
public char Sign { get; init; } = '+';

public IEnumerable<string> Collect(string text)
{
var regex = new Regex(Pattern);

var matches = regex.Matches(text);

return matches.Select(m => m.Value);
}

public IEnumerable<string> RemovePrefix(IEnumerable<string> collectedWords)
{
return collectedWords.Select(word => word.Trim('+').Trim('"').ToUpper());
}
}
31 changes: 31 additions & 0 deletions phase05/FullTextSearch.Controller/QueryController/QueryBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using FullTextSearch.Controller.QueryController.Abstraction;
using FullTextSearch.Core;

namespace FullTextSearch.Controller.QueryController;

public class QueryBuilder : IQueryBuilder
{
private readonly IWordCollectorDriver _wordCollectorDriver;
private readonly Query _query;

public QueryBuilder(IWordCollectorDriver wordCollectorDriver)
{
_wordCollectorDriver = wordCollectorDriver;
_query = new Query();
}

public void BuildText(string text)
{
_query.Text = text;
}

public void BuildWordsBySign(IEnumerable<IWordCollector> collectors)
{
_wordCollectorDriver.DriveCollect(collectors, _query);
}

public Query GetQuery()
{
return _query;
}
}
18 changes: 18 additions & 0 deletions phase05/FullTextSearch.Controller/QueryController/QueryDirector.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using FullTextSearch.Controller.QueryController.Abstraction;

namespace FullTextSearch.Controller.QueryController;

public class QueryDirector : IQueryDirector
{
public void Construct(string text, IQueryBuilder queryBuilder)
{
queryBuilder.BuildText(text);
queryBuilder.BuildWordsBySign(new List<IWordCollector>()
{
new MinusWordCollector(),
new PlusWordsCollector(),
new NoSignedWordCollector()

});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using FullTextSearch.Controller.QueryController.Abstraction;
using FullTextSearch.Core;

namespace FullTextSearch.Controller.QueryController;

public class WordCollectorDriver : IWordCollectorDriver
{
public void DriveCollect(IEnumerable<IWordCollector> collectors, Query query)
{
collectors.ToList().ForEach(c =>
query.WordsBySign[c.Sign] = c.RemovePrefix(c.Collect(query.Text)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace FullTextSearch.Controller.Read.Abstraction;

public interface IDirectory
{
List<string> GetFiles(string dirPath);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace FullTextSearch.Controller.Read.Abstraction;

public interface IFileReader
{
Task<string> ReadAsync(string path);
}
Loading