Skip to content

Instantly share code, notes, and snippets.

@jackinf
Created May 25, 2017 12:56
Show Gist options
  • Save jackinf/f4fb7d5997889694a008626ba0e4bec8 to your computer and use it in GitHub Desktop.
Save jackinf/f4fb7d5997889694a008626ba0e4bec8 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
using ETIS.Core.Documents;
using ETIS.Core.Documents.Classifiers;
using ETIS.Core.Extensions;
using ETIS.Core.Indexes.DocumentSearchIndexes;
using ETIS.RavenBundle;
using Lucene.Net.Analysis;
using Raven.Abstractions.Indexing;
using Raven.Client;
using Raven.Client.Indexes;
using Raven.Client.Linq;
using ETIS.Core.Documents.Reviews;
using ETIS.Core.Indexes.DocumentSearchIndexes.InfoInterfaces;
using ETIS.Core.Views;
namespace ETIS.Core.Indexes.AcceptanceDocumentSearchIndexes.Applications
{
/// <summary>
/// Taotluste otsingu peaindeks
/// </summary>
public class ApplicationSearchIndex : AbstractMultiMapIndexCreationTask<ApplicationSearchIndex.Info>
{
public static string StaticIndexName = string.Format("ETIS/{0}", typeof (ApplicationSearchIndex).Name);
public ApplicationSearchIndex()
{
AddMapForAll<ApplicationBaseDocument>(docs => from doc in docs
let financeRound = LoadDocument<FinanceRoundView>(doc.FinanceRound.DocumentId + "/view")
let programme = LoadDocument<ProgrammeView>(financeRound.Programme.DocumentId + "/view")
let workflow = LoadDocument<WorkflowDocument>(doc.Workflow.DocumentId)
let review = LoadDocument<ReviewDocument>(doc.Review.DocumentId)
let workflowConfirmers = workflow != null ? workflow.ConfirmerInfos.Where(x => x.Confirmer != null).Select(c => LoadDocument<PersonView>(c.Confirmer.DocumentId + "/view")) : null
let docInstitution = LoadDocument<InstitutionView>(doc.Institution.DocumentId + "/view")
let frascatis = doc.ResearchAreas.Select(r => r.AreaOfStudyFrascati.View).Select(r => new {r.Name, r.NameEng, r.Code})
let cercses = doc.ResearchAreas.Select(r => r.AreaOfStudyCercs.View).Select(r => new {r.Name, r.NameEng, r.Code})
let reasearchAreas = doc.ResearchAreas.Select(r => r.AreaOfStudy.View).Select(r => new {r.Name, r.NameEng, r.Code})
let aosChildren = doc.ResearchAreas.Select(r => r.AreaOfStudyChild.View).Select(r => new {r.Name, r.NameEng, r.Code})
let responsibleExecutor = doc.ResponsibleExecutor != null ? LoadDocument<PersonView>(doc.ResponsibleExecutor.DocumentId + "/view") : null
let roles = doc.AllExecutors.Select(x => x.RoleReference).Where(x => x != null && x.View != null).Select(x => new {x.Id, x.View})
//let executorRoleId = roles.Any(r => r.View.Code == PersonRoleInProject.executor) ? roles.First(r => r.View.Code == PersonRoleInProject.executor).Id : Guid.Empty
//let mainRoleId = roles.Any(r => r.View.Code == PersonRoleInProject.main) ? roles.First(r => r.View.Code == PersonRoleInProject.main).Id : Guid.Empty
//let responsibleRoleId = roles.Any(r => r.View.Code == PersonRoleInProject.responsible) ? roles.First(r => r.View.Code == PersonRoleInProject.responsible).Id : Guid.Empty
let allExecutors = doc.AllExecutors.Select(x => new {Person = LoadDocument<PersonView>(x.Person.DocumentId + "/view") , RoleId = x.RoleReference.Id})
let allExecutorDocs = allExecutors.Select(x => x.Person)
//let executors = allExecutors.Where(x => executorRoleId.ToString() == x.RoleId.ToString()).Select(x => x.Person)
//let mainExecutors = allExecutors.Where(x => mainRoleId.ToString() == x.RoleId.ToString()).Select(x => x.Person)
//let responsibleExecutors = allExecutors.Where(x => responsibleRoleId.ToString() == x.RoleId.ToString()).Select(x => x.Person)
let expertiseGroups = doc.Expertise != null && doc.Expertise.ExpertGroupPersons != null ? doc.Expertise.ExpertGroupPersons.Select(x => x.ExpertGroup) : null
where doc.FinanceRoundType == FinanceRoundType.Application ||
doc.FinanceRoundType == FinanceRoundType.ContinuedApplication || doc.FinanceRoundType == FinanceRoundType.OverallApplication
select new Info
{
IndexId = doc.Id.ToString(),
IsActive = doc.IsActive,
IsPublic = doc.IsPublic,
FinanceRoundId = doc.FinanceRound != null ? doc.FinanceRound.Id : Guid.Empty,
WorkflowDocumentId = doc.Workflow.DocumentId,
ProgrammeId = financeRound != null && financeRound.Programme != null ? financeRound.Programme.Id : Guid.Empty,
ProgrammeCode = programme.Code,
ProgrammeName = programme.Name,
Number = doc.Number,
ProjectId = doc.Project != null ? doc.Project.Id : Guid.Empty,
StartDate = doc.StartDate,
EndDate = doc.EndDate,
Title = doc.FullName,
FinanceRoundYear = financeRound != null ? financeRound.Year : 0,
ResponsibleExecutorId = doc.ResponsibleExecutor != null ? doc.ResponsibleExecutor.Id : Guid.Empty,
ResponsibleExecutorName = responsibleExecutor != null ? responsibleExecutor.Name : null,
ResponsibleExecutorUsername = responsibleExecutor != null ? responsibleExecutor.UserName : null,
FinanceRoundType = doc.FinanceRoundType,
StaticFinanceRoundType = doc.StaticFinanceRoundType,
InstitutionId = doc.Institution.Id.ToString(),
InstitutionNameEst = docInstitution.FullName,
InstitutionNameEng = docInstitution.FullNameEng,
InstitutionRegNo = docInstitution.BusinessRegNo,
InstitutionIdTree = docInstitution.FullPath,
ProcessStatus = doc.ProcessStatus,
ProcessStatusInt = (int) doc.ProcessStatus,
ConfirmationStatusUpdatedDateString = doc.ConfirmationStatusUpdatedDate.HasValue ? doc.ConfirmationStatusUpdatedDate.Value.ToString(DateTimeExtension.DatePattern) : "",
Confirmers = workflowConfirmers.Select(x => x.Name),
CandidatesAndConfirmersDisplay = // ReSharper disable once RedundantTypeArgumentsOfMethod
workflowConfirmers != null
? string.Join("; ", workflowConfirmers.Select(x => x.Name).ToList<string>())
: null,
SearchWords = new[]
{
doc.Id.ToString(),
doc.Number,
doc.Name,
doc.NameEng,
doc.Annotation,
doc.AnnotationEng,
docInstitution != null ? docInstitution.Name : "",
doc.ResponsibleExecutor != null && responsibleExecutor != null ? responsibleExecutor.Name : ""
}.Where(x => !string.IsNullOrWhiteSpace(x)).Distinct(),
PersonIds = doc.AllExecutors.Where(e => e.Person != null && e.RoleReference != null && e.RoleReference.View != null && e.RoleReference.View.Code != PersonRoleInProject.noaccess).Select(ex => ex.Person.Id), //removed search for people in "Juurdepääs" (Access), ETISII-5191
PersonIdCodes = allExecutorDocs != null ? allExecutorDocs.Select(ex => ex.IDCode) : null,
PersonNames = allExecutorDocs != null ? allExecutorDocs.Select(ex => ex.Name) : null,
PersonRoleIds = roles != null ? roles.Select(ex => ex.Id) : null,
PersonRoleNames = roles != null ? roles.Select(ex => ex.View.Name) : null,
ResearchAreaEtisCodes = reasearchAreas.Select(r => r.Code),
ResearchAreaEtisNames = reasearchAreas.Select(r => r.Name),
ResearchAreaEtisNamesTokenized = reasearchAreas.Select(r => r.Name),
ResearchAreaEtisNamesEng = reasearchAreas.Select(r => r.NameEng),
ResearchAreaEtisNamesEngTokenized = reasearchAreas.Select(r => r.NameEng),
ResearchAreaCercsCodes = cercses.Select(r => r.Code),
ResearchAreaCercsNames = cercses.Select(r => r.Name),
ResearchAreaCercsNamesTokenized = cercses.Select(r => r.Name),
ResearchAreaCercsNamesEngTokenized = cercses.Select(r => r.NameEng),
ResearchAreaFrascatiCodes = frascatis.Select(r => r.Code),
ResearchAreaFrascatiNames = frascatis.Select(r => r.Name),
ResearchAreaFrascatiNamesTokenized = frascatis.Select(r => r.Name),
ResearchAreaFrascatiNamesEngTokenized = frascatis.Select(r => r.NameEng),
ResearchAreaChildCodes = aosChildren.Select(r => r.Code),
ResearchAreaChildNames = aosChildren.Select(r => r.Name),
ResearchAreaChildNamesTokenized = aosChildren.Select(r => r.Name),
ResearchAreaChildNamesEng = aosChildren.Select(r => r.NameEng),
ResearchAreaChildNamesEngTokenized = aosChildren.Select(r => r.NameEng),
SubmissionDateTime = doc.DatePresented,
// ReSharper disable once ConditionIsAlwaysTrueOrFalse - baasis on nullid siin kohati
ProjectStartYear = doc.ProjectStartYear != null ? doc.ProjectStartYear : 0,
ProjectEndYear = doc.ProjectEndYear,
Name = doc.Name,
NameTokenized = doc.Name,
NameEng = doc.NameEng,
NameEngTokenized = doc.NameEng,
HasReviewsSubmitted = review != null && review.HasReviewsSubmitted,
StartProject = ((bool?)doc.SendToMyFirstGrandCompetition != null && doc.SendToMyFirstGrandCompetition),
ExpertGroupNumbersDisplay = expertiseGroups != null ?
string.Join("; ", expertiseGroups.Where(x => x.View != null && !string.IsNullOrWhiteSpace(x.View.Number))
.Select(x => x.View.Number).Distinct().ToList<string>()) :
null
});
Index(x => x.ResponsibleExecutorId, FieldIndexing.NotAnalyzed);
Analyzers.Add(x => x.NameTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.NameEngTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.ResearchAreaCercsNamesTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.ResearchAreaCercsNamesEngTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.ResearchAreaEtisNamesTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.ResearchAreaEtisNamesEngTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.ResearchAreaFrascatiNamesTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.ResearchAreaFrascatiNamesEngTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.ResearchAreaChildNamesTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Analyzers.Add(x => x.ResearchAreaChildNamesEngTokenized, typeof (SimpleAnalyzer).AssemblyQualifiedName);
Index(x => x.ExpertGroupNumbersDisplay, FieldIndexing.NotAnalyzed);
Store(x => x.ExpertGroupNumbersDisplay, FieldStorage.Yes);
}
public override string IndexName
{
get { return StaticIndexName; }
}
/// <summary>
/// Lae query tulemustega ka seotud dokumendid
/// </summary>
/// <param name="session"></param>
/// <returns></returns>
public IRavenQueryable<Info> BuildQueryWithDependencies(IDocumentSession session)
{
var q = BuildQuery(session).Customize(
x =>
{
x.Include<ApplicationBaseDocument>(d => d.Institution.DocumentId);
x.Include<ApplicationBaseDocument>(d => d.Workflow.DocumentId);
x.Include<ApplicationBaseDocument>(d => d.ResponsibleExecutor.DocumentId);
x.Include<ApplicationBaseDocument>(p => p.Programme.DocumentId);
x.Include<ApplicationBaseDocument>(p => p.FinanceRound.DocumentId);
x.Include<ApplicationBaseDocument>(p => p.AllExecutors.Select(e => e.Person.DocumentId));
}
);
return q;
}
public IRavenQueryable<Info> BuildQuery(IDocumentSession session)
{
return session.Query<Info, ApplicationSearchIndex>();
}
/// <summary>
/// Indeksisse salvestatava info wrapper
/// </summary>
public class Info : ExecutorsDocumentInfo, IProgrammeSearchableInfo // ProcessDocumentInfo
{
/// <summary>
/// Taotluse programmi Id
/// </summary>
public Guid ProgrammeId { get; set; }
/// <summary>
/// Taotluse programmi kood
/// </summary>
public string ProgrammeCode { get; set; }
/// <summary>
/// Taotluse programmi nimi
/// </summary>
public string ProgrammeName { get; set; }
/// <summary>
/// Taotluse programmi number
/// </summary>
public string Number { get; set; }
/// <summary>
/// Taotluse pealkiri
/// </summary>
public string Title { get; set; }
/// <summary>
/// Rahastusvooru aasta
/// </summary>
public int? FinanceRoundYear { get; set; }
/// <summary>
/// Taotluse tüüp
/// </summary>
public FinanceRoundType FinanceRoundType { get; set; }
/// <summary>
/// Rahastusvooru staatil
/// </summary>
public StaticFinanceRoundType StaticFinanceRoundType { get; set; }
/// <summary>
/// Asutuse id stringina
/// </summary>
public string InstitutionId { get; set; }
/// <summary>
/// Asutuse eestikeelne nimi
/// </summary>
public string InstitutionNameEst { get; set; }
/// <summary>
/// Asutuse eestikeelne nimi
/// </summary>
public string InstitutionNameEng { get; set; }
/// <summary>
/// Tegemist on Stardiprojektiga
/// </summary>
public bool StartProject { get; set; }
public Guid ProjectId { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public string ConfirmationStatusUpdatedDateString { get; set; }
public string InstitutionIdTree { get; set; }
/// <summary>
/// Taotlusega seotud isikud - täitjad ja isikud kellele on määratud õigus Juurdepääsu sakil
/// AllExecutors + AccessList
/// </summary>
public IEnumerable<Guid> PersonIds { get; set; }
public IEnumerable<string> PersonIdCodes { get; set; }
public IEnumerable<string> PersonNames { get; set; }
public string InstitutionRegNo { get; set; }
public IEnumerable<Guid> PersonRoleIds { get; set; }
public IEnumerable<string> PersonRoleNames { get; set; }
public string ApplicationType { get; set; }
public DateTime SubmissionDateTime { get; set; }
public IEnumerable<string> ResearchAreaEtisCodes { get; set; }
public IEnumerable<string> ResearchAreaEtisNames { get; set; }
public IEnumerable<string> ResearchAreaEtisNamesTokenized { get; set; }
public IEnumerable<string> ResearchAreaEtisNamesEng { get; set; }
public IEnumerable<string> ResearchAreaEtisNamesEngTokenized { get; set; }
public IEnumerable<string> ResearchAreaCercsCodes { get; set; }
public IEnumerable<string> ResearchAreaCercsNames { get; set; }
public IEnumerable<string> ResearchAreaCercsNamesTokenized { get; set; }
public IEnumerable<string> ResearchAreaCercsNamesEngTokenized { get; set; }
public IEnumerable<string> ResearchAreaFrascatiCodes { get; set; }
public IEnumerable<string> ResearchAreaFrascatiNames { get; set; }
public IEnumerable<string> ResearchAreaFrascatiNamesTokenized { get; set; }
public IEnumerable<string> ResearchAreaFrascatiNamesEngTokenized { get; set; }
public IEnumerable<string> ResearchAreaChildCodes { get; set; }
public IEnumerable<string> ResearchAreaChildNames { get; set; }
public IEnumerable<string> ResearchAreaChildNamesTokenized { get; set; }
public IEnumerable<string> ResearchAreaChildNamesEng { get; set; }
public IEnumerable<string> ResearchAreaChildNamesEngTokenized { get; set; }
public int ProjectStartYear { get; set; }
public int? ProjectEndYear { get; set; }
public string Name { get; set; }
public string NameTokenized { get; set; }
public string NameEng { get; set; }
public string NameEngTokenized { get; set; }
/// <summary>
/// Kas kõik retsensioonid on kinnitatud
/// </summary>
public bool HasReviewsSubmitted { get; set; }
/// <summary>
/// Ekseprtrühma numbrid
/// </summary>
public string ExpertGroupNumbersDisplay { get; set; }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment