//for (int i = 0; i < documentIds.Count(); i++)
//{
// documents[i] = GetDocument(documentIds[i]);
//}
//return documents;
}
public Corpus[] GetCorpora(int UserId)
{
using (var context = new PaperCatModelContainer())
{
List<CorpusModel> corpusModels;
if (UserId != 0)
corpusModels = context.CorpusModelSet.Where(c => c.User.UserId == UserId).ToList();
else
corpusModels = context.CorpusModelSet.Where(c => c.User == null).ToList();
Corpus[] corpuses = new Corpus[corpusModels.Count()];
for (int i = 0; i < corpusModels.Count(); i++)
{
corpuses[i] = corpusModels[i].GetCorpusFromModel();
}
return corpuses;
}
}
public Document GetDocument(int DocumentId)
{
DocumentModel doc;
using (var context = new PaperCatModelContainer())
{
doc = context.DocumentModelSet.Find(DocumentId);
if (doc == null)
return null;
return GetFullDocument(doc);
}
}
private static Document GetFullDocument(DocumentModel document)
{
return GetDocumentNonRelationalProperties(document.GetDocumentFromModel(), GetDocumentClient());
}
public Document[] GetDocuments(int CorpusId)
{
using (var context = new PaperCatModelContainer())
{
var documentList = context.DocumentModelSet.Where(d => d.Сorpus.CorpusId == CorpusId).ToList();
Document[] documents = new Document[documentList.Count];
for (int i = 0; i < documentList.Count; i++)
{
documents[i] = GetFullDocument(documentList[i]);
}
return documents;
}
}
public int MakeCommonCorpus(string Name, Document[] documents)
{
return MakeCorpus(Name, documents, 0);
}
public int MakeCorpus(string Name, Document[] documents, int UserId)
{
using (var context = new PaperCatModelContainer())
{
CorpusModel corpusModel = new CorpusModel()
{
CorpusName = Name,
User = context.UserModelSet.FirstOrDefault(u => u.UserId == UserId)
};
context.CorpusModelSet.Add(corpusModel);
context.SaveChanges();
if (documents != null)
foreach (var item in documents)
{
item.CorpusId = corpusModel.CorpusId;
AddDocument(item);
}
return corpusModel.CorpusId;
}
}
public void UpdateCorpus(Corpus corpus)
{
if (corpus == null)
throw new Exception("Параметр не может быть null");
using (var context = new PaperCatModelContainer())
{
var corpusModel = context.CorpusModelSet.Find(corpus.CorpusId);
if (corpusModel == null)
{
throw new Exception("Такого корпуса не существует");
}
corpusModel.CorpusName = corpus.CorpusName;
context.SaveChanges();
}
}
public void UpdateDocument(Document document, bool IsTextChanged)
{
if (document == null)
throw new Exception("Параметр не может быть null");
using (var context = new PaperCatModelContainer())
{
var documentModel = context.DocumentModelSet.Find(document.DocumentId);
if (documentModel == null)
{
throw new Exception("Такого документа не существует");
}
documentModel.Name = document.Name;
documentModel.OriginalFile = document.OriginalFile;
document.CorpusId = documentModel.Сorpus.CorpusId; //документ остается в том же корпусе
context.SaveChanges();
}
DocumentClient client = GetDocumentClient();
string selfLink = GetDocumentSelfLink(document.DocumentId, client);
if (IsTextChanged)
{
Task.Run(() => { DeleteDocumentFromIndexStructure(document.DocumentId, document.CorpusId); AddDocumentToIndexStructure(document); } );
}
if (selfLink != null)
client.ReplaceDocumentAsync(selfLink, new AzureDocument(document)).Wait();
}
public void UpdateUser(User user)
{
if (user == null)
throw new Exception("Параметр не может быть null");
using (var context = new PaperCatModelContainer())
{
var userModel = context.UserModelSet.Find(user.UserId);
if (userModel == null)
{
throw new Exception("Такого пользователя не существует");
}
userModel.FIO = user.FIO;
if (IsThisLoginExist(user.Login, context, user.UserId))
{
throw new Exception("Другой пользователь с таким логином уже существует");
}
userModel.Login = user.Login;
userModel.Password = user.Password;
userModel.Email = user.Email;
context.SaveChanges();
}
}
}
}
{
public class NLAStructureHelper
{
private const int nSymbols = 3;
string HeadSelfLink = "";
NLAStructure Head;
DocumentClient documentClient;
/// <summary>
/// Поиск осуществляется отдельно для каждого корпуса
/// </summary>
/// <param name="client"></param>
/// <param name="Corpusid"></param>
public NLAStructureHelper(DocumentClient client, int Corpusid, bool isForceCreate = true)
{
documentClient = client;
Head = LoadHead(Corpusid, isForceCreate);
}
/// <summary>
/// Добавить id документа к данному слову
/// </summary>
/// <param name="word"></param>
/// <param name="documentId"></param>
public void Add(string word, int documentId)
{
NLAStructure structure = Head;
string CurrentStructureLink = HeadSelfLink;
for (int i = 0; i < word.Length; i += nSymbols)
{
string key = word.Length < i + nSymbols ? word.Substring(i) : word.Substring(i, nSymbols);
IndexStructureObject obj;
if (structure.Dictionary.ContainsKey(key))
obj = structure.Dictionary[key];
else
{
obj = new IndexStructureObject();
structure.Dictionary.Add(key, obj);
}
if (i + nSymbols >= word.Length) //дошли до нужного листа
{
obj.DocumentIds.Add(documentId);
SaveChanges(CurrentStructureLink, structure);
}
else
{
NLAStructure oldNLAStructure = structure;
structure = GetNextStructure(obj);
SaveChanges(CurrentStructureLink, oldNLAStructure);
CurrentStructureLink = obj.NextStructureSelfLink;
}
}
}
/// <summary>
//// Удалить все вхождения id документа из структуры
/// </summary>
/// <param name="documentId"></param>
public void Delete(int documentId)
{
Delete(documentId, Head, HeadSelfLink);
}
private bool Delete(int documentId, NLAStructure NLAStructure, string CurrentStructureLink)
{
if (NLAStructure != null)
{
var TemtDictionary = new Dictionary<string, IndexStructureObject>(NLAStructure.Dictionary);
foreach (var item in TemtDictionary)
{
IndexStructureObject iso = item.Value;
NLAStructure nextNLAStructure = GetNextStructure(iso, false);
if (nextNLAStructure != null)
if (Delete(documentId, nextNLAStructure, iso.NextStructureSelfLink))
iso.NextStructureSelfLink = "";
iso.DocumentIds.Remove(documentId);
if (iso.NextStructureSelfLink == "" && iso.DocumentIds.Count == 0)
{
NLAStructure.Dictionary.Remove(item.Key);
}
}
}
if (NLAStructure.Dictionary.Count == 0)
{
documentClient.DeleteDocumentAsync(CurrentStructureLink);
return true;
}
SaveChanges(CurrentStructureLink, NLAStructure);
return false;
}
private NLAStructure GetNextStructure(IndexStructureObject indexStructureObject, bool isForcedCreate = true)
{
if (indexStructureObject.NextStructureSelfLink != "")
{
Document doc = documentClient.ReadDocumentAsync(indexStructureObject.NextStructureSelfLink).Result;
NLAStructure Structure = (dynamic)doc;
return Structure;
}
else if (isForcedCreate)
{
NLAStructure newStructure = new NLAStructure();
Document doc = documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(Properties.Resources.DataBaseId, Properties.Resources.IndicesCollectionId), newStructure).Result;
indexStructureObject.NextStructureSelfLink = doc.SelfLink;
return newStructure;
}
else return null;
}
private void SaveChanges(string StructureLink, NLAStructure structure)
{
documentClient.ReplaceDocumentAsync(StructureLink, structure).Wait();
}
private NLAStructure LoadHead(int CorpusId, bool isForceCreate = true)
{
Uri documentCollectionUri = UriFactory.CreateDocumentCollectionUri(Properties.Resources.DataBaseId, Properties.Resources.IndicesCollectionId);
Microsoft.Azure.Documents.Document doc = CorpusId != 0 ?
documentClient.CreateDocumentQuery(documentCollectionUri).AsEnumerable().Where(d => d.GetPropertyValue<int>("CorpusId") == CorpusId).FirstOrDefault()
: null ;
NLAHeadDocument Structure = null;
if (doc != null)
{
Structure = (dynamic)doc;
HeadSelfLink = doc.SelfLink;
}
else if (isForceCreate)
{
Structure = new NLAHeadDocument(CorpusId);
doc = documentClient.CreateDocumentAsync(documentCollectionUri, Structure).Result;
HeadSelfLink = doc.SelfLink;
}
return Structure;
}
internal List<int> FindWordDocumentIds(string word)
{
NLAStructure structure = Head;
IndexStructureObject obj = null;
for (int i = 0; i < word.Length; i += nSymbols)
{
string key = word.Length < i + nSymbols ? word.Substring(i) : word.Substring(i, nSymbols);
if (structure != null && structure.Dictionary.ContainsKey(key))
{
obj = structure.Dictionary[key];
structure = GetNextStructure(obj, false);
}
else return new List<int>();
}
if (obj != null)
return obj.DocumentIds;
return new List<int>();
}
}
}