private static void AddJobs(MemberContent content, BoostingDocumentBuilder docBuilder, IList <Job> jobs) { if (jobs == null) { return; } for (var index = 0; index < jobs.Count; index++) { var job = jobs[index]; // Content field. docBuilder.AddText(FieldName.Content, job.Title); docBuilder.AddText(FieldName.Content, job.Description); docBuilder.AddText(FieldName.Content_Exact, job.Title); docBuilder.AddText(FieldName.Content_Exact, job.Description); // Job title fields. docBuilder.AddText(FieldName.JobTitle, job.Title); docBuilder.AddText(FieldName.JobTitle_Exact, job.Title); if (index == 0) { docBuilder.AddText(FieldName.JobTitleLast, job.Title); docBuilder.AddText(FieldName.JobTitleLast_Exact, job.Title); } if (index < 3) { docBuilder.AddText(FieldName.JobTitleRecent, job.Title); docBuilder.AddText(FieldName.JobTitleRecent_Exact, job.Title); } if (content.Member.VisibilitySettings.Professional.EmploymentVisibility.IsFlagSet(ProfessionalVisibility.Resume) && content.Member.VisibilitySettings.Professional.EmploymentVisibility.IsFlagSet(ProfessionalVisibility.RecentEmployers)) { docBuilder.AddText(FieldName.Content, job.Company); docBuilder.AddText(FieldName.Content_Exact, job.Company); // Employer fields. docBuilder.AddText(FieldName.Employer, job.Company); docBuilder.AddText(FieldName.Employer_Exact, job.Company); if (index == 0) { docBuilder.AddText(FieldName.EmployerLast, job.Company); docBuilder.AddText(FieldName.EmployerLast_Exact, job.Company); } if (index < 3) { docBuilder.AddText(FieldName.EmployerRecent, job.Company); docBuilder.AddText(FieldName.EmployerRecent_Exact, job.Company); } } } }
/// <inheritdoc/> public override void VisitObjectMember(object container, ObjectDescriptor containerDescriptor, IMemberDescriptor member, object value) { if (!NotifyNodeConstructing(containerDescriptor, member)) { return; } // If this member should contains a reference, create it now. IReference reference = CreateReferenceForNode(member.Type, value); ModelNode containerNode = GetContextNode(); ITypeDescriptor typeDescriptor = TypeDescriptorFactory.Find(member.Type); IContent content = new MemberContent(containerNode.Content, member, typeDescriptor, IsPrimitiveType(member.Type), reference); var node = new ModelNode(member.Name, content, Guid.NewGuid()); containerNode.AddChild(node); if (reference != null) { referenceContents.Add(content); } if (!(reference is ObjectReference)) { // For enumerable references, we visit the member to allow VisitCollection or VisitDictionary to enrich correctly the node. PushContextNode(node); Visit(value); PopContextNode(); } AvailableCommands.Where(x => x.CanAttach(node.Content.Descriptor, (MemberDescriptorBase)member)).ForEach(node.AddCommand); NotifyNodeConstructed(content); node.Seal(); }
void IContentHandler.AddContent(Document document, MemberContent content) { var value = content.Candidate.VisaStatus.Encode(); var field = new Field(FieldName.VisaStatus, value, Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS); field.setOmitTermFreqAndPositions(true); _booster.SetBoost(field); document.add(field); }
protected override bool ShouldReconcileItem(MemberContent member, IGraphNode targetNode, object localValue, object baseValue, bool isReference) { // Always reconcile referenced parts if (isReference && IsReferencedPart(member, targetNode)) { return(true); } return(base.ShouldReconcileItem(member, targetNode, localValue, baseValue, isReference)); }
private void AddMember(MemberContent content) { content.Member.Address = new Address { Location = _locationQuery.ResolveLocation(_locationQuery.GetCountry("Australia"), null) }; _membersCommand.CreateMember(content.Member); content.Candidate.Id = content.Member.Id; _candidatesCommand.CreateCandidate(content.Candidate); _searchService.UpdateMember(content.Member.Id); }
/// <summary> /// Visits a hierarchy of node, starting by the given root node. /// </summary> /// <param name="node">The root node of the visit</param> /// <param name="memberContent">The member content containing the node to visit, if relevant. This is used to properly check if the root node should be visited.</param> /// <param name="initialPath">The initial path of the root node, if this visit occurs in the context of a sub-hierarchy. Can be null.</param> public virtual void Visit(IContentNode node, MemberContent memberContent = null, GraphNodePath initialPath = null) { var path = initialPath ?? new GraphNodePath(node); RootNode = node; if (ShouldVisitNode(memberContent, node)) { VisitNode(node, path); } RootNode = null; }
public void SortByCandidateStatusTest() { // Create content. var activelyLooking = Guid.NewGuid(); var content = new MemberContent { Member = new Member { Id = activelyLooking }, Candidate = new Candidate { Status = CandidateStatus.ActivelyLooking } }; IndexContent(content); var availableNow = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = availableNow }, Candidate = new Candidate { Status = CandidateStatus.AvailableNow } }; IndexContent(content); var unspecified = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = unspecified }, Candidate = new Candidate { Status = CandidateStatus.Unspecified } }; IndexContent(content); // Default order. var memberQuery = new MemberSearchQuery { SortOrder = MemberSortOrder.Availability }; var searchResults = Search(memberQuery, 0, 10); CollectionAssert.AreEqual(new[] { availableNow, activelyLooking, unspecified }, searchResults.MemberIds.ToArray()); // Reverse order. memberQuery = new MemberSearchQuery { SortOrder = MemberSortOrder.Availability, ReverseSortOrder = true }; searchResults = Search(memberQuery, 0, 10); CollectionAssert.AreEqual(new[] { unspecified, activelyLooking, availableNow }, searchResults.MemberIds.ToArray()); }
void IContentHandler.AddContent(Document document, MemberContent content) { foreach (var status in Split(content.Member.EthnicStatus)) { var value = Encode(status); var field = new Field(FieldName.EthnicStatus, value, Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS); field.setOmitTermFreqAndPositions(true); _booster.SetBoost(field); document.add(field); } }
void IContentHandler.AddContent(Document document, MemberContent content) { var lastUpdatedTime = new[] { content.Member.LastUpdatedTime, content.Candidate.LastUpdatedTime, content.Resume == null ? DateTime.MinValue : content.Resume.LastUpdatedTime, }.Max(); AddContent(document, lastUpdatedTime); }
void IContentHandler.AddContent(Document document, MemberContent content) { var location = content.Member.Address != null ? content.Member.Address.Location : null; var relocationLocations = content.Candidate.RelocationPreference == RelocationPreference.No ? null : content.Candidate.RelocationLocations; AddContent(document, location, relocationLocations); }
void IContentHandler.AddContent(Document document, MemberContent content) { if (content.Member.AffiliateId != null && content.Member.VisibilitySettings.Professional.EmploymentVisibility.IsFlagSet(ProfessionalVisibility.Resume) && content.Member.VisibilitySettings.Professional.EmploymentVisibility.IsFlagSet(ProfessionalVisibility.Communities)) { var field = new Field(FieldName.Community, content.Member.AffiliateId.Value.ToFieldValue(), Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS); field.setOmitTermFreqAndPositions(true); _booster.SetBoost(field); document.add(field); } }
public override bool IsReferencedPart(MemberContent member, IGraphNode targetNode) { // If we're not accessing the target node through a member (eg. the target node is the root node of the visit) // or if we're visiting the member itself and not yet its target, then we're not a referenced part. if (member == null || member == targetNode.Content) { return(false); } if (typeof(TAssetPart).IsAssignableFrom(targetNode.Content.Type)) { // Check if we're the part referenced by a part design - other cases are references return(member.Container.OwnerNode.Content.Type != typeof(TAssetPartDesign)); } return(base.IsReferencedPart(member, targetNode)); }
public void TestRelocationCountry() { // Member is located in an unstructured location in Australia, and is willing to relocate to Australia. var content = new MemberContent { Member = new Member { Id = Guid.NewGuid(), Address = new Address { Location = _locationQuery.ResolveLocation(_locationQuery.GetCountry("Australia"), "Winnipeg MB r3e 1w1") }, }, Candidate = new Candidate { RelocationPreference = RelocationPreference.Yes, RelocationLocations = new List <LocationReference> { _locationQuery.ResolveLocation(_locationQuery.GetCountry("Australia"), null), }, } }; IndexContent(content); // Search in Mackay. var memberQuery = new MemberSearchQuery { Location = _locationQuery.ResolveLocation(_locationQuery.GetCountry("Australia"), "Mackay QLD 4740"), Distance = 5, IncludeRelocating = false, }; var results = Search(memberQuery, 0, 10); Assert.AreEqual(0, results.MemberIds.Count); memberQuery = new MemberSearchQuery { Location = _locationQuery.ResolveLocation(_locationQuery.GetCountry("Australia"), "Mackay QLD 4740"), Distance = 5, IncludeRelocating = true, }; results = Search(memberQuery, 0, 10); Assert.AreEqual(1, results.MemberIds.Count); }
void IContentHandler.AddContent(Document document, MemberContent content) { Salary salary = null; if (content.Member.VisibilitySettings.Professional.EmploymentVisibility.IsFlagSet(ProfessionalVisibility.Resume) && content.Member.VisibilitySettings.Professional.EmploymentVisibility.IsFlagSet(ProfessionalVisibility.Salary)) { // Convert to yearly to standardise search. salary = content.Candidate.DesiredSalary; if (salary != null) { salary = salary.ToRate(SalaryRate.Year); } } AddContent(document, salary == null ? null : salary.LowerBound, salary == null ? null : salary.UpperBound, false); }
protected virtual bool ShouldReconcileItem(MemberContent member, IGraphNode targetNode, object localValue, object baseValue, bool isReference) { if (isReference) { // Reference type, we check matches by type return(baseValue?.GetType() != localValue?.GetType()); } // Content reference (note: they are not treated as reference if (AssetRegistry.IsContentType(localValue?.GetType()) || AssetRegistry.IsContentType(localValue?.GetType())) { var localRef = AttachedReferenceManager.GetAttachedReference(localValue); var baseRef = AttachedReferenceManager.GetAttachedReference(baseValue); return(localRef?.Id != baseRef?.Id || localRef?.Url != baseRef?.Url); } // Value type, we check for equality return(!Equals(localValue, baseValue)); }
public void CommunityFilterTest() { var community = Guid.NewGuid(); // Create content. var communal = Guid.NewGuid(); var content = new MemberContent { Member = new Member { Id = communal, AffiliateId = community }, Candidate = new Candidate() }; IndexContent(content); var independent = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = independent }, Candidate = new Candidate() }; IndexContent(content); // Search without filter. var memberQuery = new MemberSearchQuery(); var results = Search(memberQuery, 0, 10); Assert.AreEqual(2, results.MemberIds.Count); // Search for community. memberQuery = new MemberSearchQuery { CommunityId = community }; results = Search(memberQuery, 0, 10); Assert.AreEqual(1, results.MemberIds.Count); Assert.IsTrue(new[] { communal }.CollectionEqual(results.MemberIds)); }
void IContentHandler.AddContent(Document document, MemberContent content) { // Only include if visible. if (!content.Member.VisibilitySettings.Professional.EmploymentVisibility.IsFlagSet(ProfessionalVisibility.Resume) || !content.Member.VisibilitySettings.Professional.EmploymentVisibility.IsFlagSet(ProfessionalVisibility.Name)) { return; } if (!string.IsNullOrEmpty(content.Member.FirstName)) { var field = new Field(FieldName.FirstName, content.Member.FirstName.ToLowerInvariant(), Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS); _booster.SetBoost(field); document.add(field); field = new Field(FieldName.Name, _analyzer.tokenStream(FieldName.FirstName, new java.io.StringReader(content.Member.FirstName))); _booster.SetBoost(field); document.add(field); field = new Field(FieldName.Name_Exact, _analyzer.tokenStream(FieldName.FirstName_Exact, new java.io.StringReader(content.Member.FirstName))); _booster.SetBoost(field); document.add(field); } if (!string.IsNullOrEmpty(content.Member.LastName)) { var field = new Field(FieldName.LastName, content.Member.LastName.ToLowerInvariant(), Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS); _booster.SetBoost(field); document.add(field); field = new Field(FieldName.Name, _analyzer.tokenStream(FieldName.LastName, new java.io.StringReader(content.Member.LastName))); _booster.SetBoost(field); document.add(field); field = new Field(FieldName.Name_Exact, _analyzer.tokenStream(FieldName.LastName_Exact, new java.io.StringReader(content.Member.LastName))); _booster.SetBoost(field); document.add(field); } }
public void IndustryFilterTest() { var bankingIndustry = Guid.NewGuid(); var accountingIndustry = Guid.NewGuid(); // Create content. var banking = Guid.NewGuid(); var content = new MemberContent { Member = new Member { Id = banking }, Candidate = new Candidate { Industries = new[] { new Industry { Id = bankingIndustry } } } }; IndexContent(content); var accounting = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = accounting }, Candidate = new Candidate { Industries = new[] { new Industry { Id = accountingIndustry } } } }; IndexContent(content); var both = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = both }, Candidate = new Candidate { Industries = new[] { new Industry { Id = bankingIndustry }, new Industry { Id = accountingIndustry } } } }; IndexContent(content); var none = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = none }, Candidate = new Candidate() }; IndexContent(content); // Search without filter. var memberQuery = new MemberSearchQuery(); var results = Search(memberQuery, 0, 10); Assert.AreEqual(4, results.MemberIds.Count); memberQuery = new MemberSearchQuery { IndustryIds = new Guid[0] }; results = Search(memberQuery, 0, 10); Assert.AreEqual(4, results.MemberIds.Count); // Search for banking. memberQuery = new MemberSearchQuery { IndustryIds = new[] { bankingIndustry } }; results = Search(memberQuery, 0, 10); Assert.AreEqual(2, results.MemberIds.Count); Assert.IsTrue(new[] { banking, both }.CollectionEqual(results.MemberIds)); // Search for banking or accounting. memberQuery = new MemberSearchQuery { IndustryIds = new[] { bankingIndustry, accountingIndustry } }; results = Search(memberQuery, 0, 10); Assert.AreEqual(3, results.MemberIds.Count); Assert.IsTrue(new[] { banking, accounting, both }.CollectionEqual(results.MemberIds)); }
public void EthnicStatusFilterTest() { // Create content. var aboriginal = Guid.NewGuid(); var content = new MemberContent { Member = new Member { Id = aboriginal, EthnicStatus = EthnicStatus.Aboriginal }, Candidate = new Candidate() }; IndexContent(content); var islander = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = islander, EthnicStatus = EthnicStatus.TorresIslander }, Candidate = new Candidate() }; IndexContent(content); var both = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = both, EthnicStatus = EthnicStatus.Aboriginal | EthnicStatus.TorresIslander }, Candidate = new Candidate() }; IndexContent(content); var none = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = none }, Candidate = new Candidate() }; IndexContent(content); // Search without filter. var memberQuery = new MemberSearchQuery(); var results = Search(memberQuery, 0, 10); Assert.AreEqual(4, results.MemberIds.Count); memberQuery = new MemberSearchQuery { EthnicStatus = default(EthnicStatus) }; results = Search(memberQuery, 0, 10); Assert.AreEqual(4, results.MemberIds.Count); // Search for Aboriginal. memberQuery = new MemberSearchQuery { EthnicStatus = EthnicStatus.Aboriginal }; results = Search(memberQuery, 0, 10); Assert.AreEqual(2, results.MemberIds.Count); Assert.IsTrue(new[] { aboriginal, both }.CollectionEqual(results.MemberIds)); // Search for Both. memberQuery = new MemberSearchQuery { EthnicStatus = EthnicStatus.Aboriginal | EthnicStatus.TorresIslander }; results = Search(memberQuery, 0, 10); Assert.AreEqual(3, results.MemberIds.Count); Assert.IsTrue(new[] { aboriginal, islander, both }.CollectionEqual(results.MemberIds)); }
protected override bool ShouldVisitNode(MemberContent memberContent, IGraphNode targetNode) { // Make sure it's actually a target (not a member) node. return(!propertyGraph.IsReferencedPart(memberContent, targetNode) && base.ShouldVisitNode(memberContent, targetNode)); }
public override void Visit(IContentNode node, MemberContent memberContent = null, GraphNodePath initialPath = null) { Result.Clear(); base.Visit(node, memberContent, initialPath); }
public void DesiredJobTypesFilterTest() { // Create content. var fullTime = Guid.NewGuid(); var content = new MemberContent { Member = new Member { Id = fullTime }, Candidate = new Candidate { DesiredJobTypes = JobTypes.FullTime } }; IndexContent(content); var partTime = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = partTime }, Candidate = new Candidate { DesiredJobTypes = JobTypes.PartTime } }; IndexContent(content); var contract = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = contract }, Candidate = new Candidate { DesiredJobTypes = JobTypes.Contract } }; IndexContent(content); var fullOrPartTime = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = fullOrPartTime }, Candidate = new Candidate { DesiredJobTypes = JobTypes.FullTime | JobTypes.PartTime } }; IndexContent(content); var all = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = all }, Candidate = new Candidate { DesiredJobTypes = JobTypes.All } }; IndexContent(content); // Search without filter. var memberQuery = new MemberSearchQuery(); var results = Search(memberQuery, 0, 10); Assert.AreEqual(5, results.MemberIds.Count); // Search for FullTime. memberQuery = new MemberSearchQuery { DesiredJobTypes = JobTypes.FullTime }; results = Search(memberQuery, 0, 10); Assert.AreEqual(3, results.MemberIds.Count); Assert.IsTrue(new[] { fullTime, fullOrPartTime, all }.CollectionEqual(results.MemberIds)); // Search for Contract. memberQuery = new MemberSearchQuery { DesiredJobTypes = JobTypes.Contract }; results = Search(memberQuery, 0, 10); Assert.AreEqual(2, results.MemberIds.Count); Assert.IsTrue(new[] { contract, all }.CollectionEqual(results.MemberIds)); // Search for FullTime or Contract. memberQuery = new MemberSearchQuery { DesiredJobTypes = JobTypes.FullTime | JobTypes.Contract }; results = Search(memberQuery, 0, 10); Assert.AreEqual(4, results.MemberIds.Count); Assert.IsTrue(new[] { fullTime, contract, fullOrPartTime, all }.CollectionEqual(results.MemberIds)); }
void IContentHandler.AddContent(Document document, MemberContent content) { document.add(new NumericField(FieldName.HasResume).setIntValue(content.Resume == null || content.Resume.IsEmpty ? 0 : 1)); }
protected override bool ShouldVisitSourceNode(MemberContent memberContent, IGraphNode targetNode) { return((ShouldVisit?.Invoke(memberContent, targetNode) ?? true) && base.ShouldVisitSourceNode(memberContent, targetNode)); }
void IContentHandler.AddContent(Document document, MemberContent content) { AddContent(document, content.Candidate.Industries == null ? null : from i in content.Candidate.Industries select i.Id); }
void IContentHandler.AddContent(Document document, MemberContent content) { document.add(new NumericField(FieldName.IsContactable).setIntValue(CanContact(content.Member) ? 1 : 0)); }
public void VisaStatusFilterTest() { // Create content. var citizen = Guid.NewGuid(); var content = new MemberContent { Member = new Member { Id = citizen }, Candidate = new Candidate { VisaStatus = VisaStatus.Citizen } }; IndexContent(content); var restrictedWorkVisa = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = restrictedWorkVisa }, Candidate = new Candidate { VisaStatus = VisaStatus.RestrictedWorkVisa } }; IndexContent(content); var notApplicable = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = notApplicable }, Candidate = new Candidate { VisaStatus = VisaStatus.NotApplicable } }; IndexContent(content); var none = Guid.NewGuid(); content = new MemberContent { Member = new Member { Id = none }, Candidate = new Candidate() }; IndexContent(content); // Search without filter. var memberQuery = new MemberSearchQuery(); var results = Search(memberQuery, 0, 10); Assert.IsTrue(new[] { citizen, restrictedWorkVisa, notApplicable, none }.CollectionEqual(results.MemberIds)); // Not applicable. memberQuery = new MemberSearchQuery { VisaStatusList = new[] { VisaStatus.NotApplicable } }; results = Search(memberQuery, 0, 10); Assert.IsTrue(new[] { notApplicable }.CollectionEqual(results.MemberIds)); // RestrictedWorkVisa. memberQuery = new MemberSearchQuery { VisaStatusList = new[] { VisaStatus.RestrictedWorkVisa } }; results = Search(memberQuery, 0, 10); Assert.IsTrue(new[] { restrictedWorkVisa }.CollectionEqual(results.MemberIds)); // Citizen, which includes everyone with none. memberQuery = new MemberSearchQuery { VisaStatusList = new[] { VisaStatus.Citizen } }; results = Search(memberQuery, 0, 10); Assert.IsTrue(new[] { citizen, notApplicable, none }.CollectionEqual(results.MemberIds)); // RestrictedWorkVisa and citizen. memberQuery = new MemberSearchQuery { VisaStatusList = new[] { VisaStatus.RestrictedWorkVisa, VisaStatus.Citizen } }; results = Search(memberQuery, 0, 10); Assert.IsTrue(new[] { restrictedWorkVisa, citizen, notApplicable, none }.CollectionEqual(results.MemberIds)); }
/// <summary> /// Indicates whether the linker should visit the given source node. /// </summary> /// <param name="memberContent">The member content referencing the source node to evaluate.</param> /// <param name="targetNode">The source node to evaluate. Can be the node holding the <paramref name="memberContent"/>, or one of its target node if this node contains a reference.</param> /// <returns>True if the node should be visited, false otherwise.</returns> protected virtual bool ShouldVisitSourceNode(MemberContent memberContent, IGraphNode targetNode) { return(true); }
void IContentHandler.AddContent(Document document, MemberContent content) { AddContent(document, content.Candidate.DesiredJobTypes); }
private void IndexContent(MemberContent content) { _indexer.IndexContent(_indexWriter, content, true); }