/// <summary> /// Raises the <see cref="E:NodesIndexing"/> event. /// </summary> /// <param name="e">The <see cref="Examine.IndexingNodesEventArgs"/> instance containing the event data.</param> protected virtual void OnNodesIndexing(IndexingNodesEventArgs e) { if (NodesIndexing != null) NodesIndexing(this, e); }
/// <summary> /// Builds an xpath statement to query against Umbraco data for the index type specified, then /// initiates the re-indexing of the data matched. /// </summary> /// <param name="type"></param> protected override void PerformIndexAll(string type) { if (!SupportedTypes.Contains(type)) return; var xPath = "//*[(number(@id) > 0 and (@isDoc or @nodeTypeAlias)){0}]"; //we'll add more filters to this below if needed var sb = new StringBuilder(); //create the xpath statement to match node type aliases if specified if (IndexerData.IncludeNodeTypes.Count() > 0) { sb.Append("("); foreach (var field in IndexerData.IncludeNodeTypes) { //this can be used across both schemas const string nodeTypeAlias = "(@nodeTypeAlias='{0}' or (count(@nodeTypeAlias)=0 and name()='{0}'))"; sb.Append(string.Format(nodeTypeAlias, field)); sb.Append(" or "); } sb.Remove(sb.Length - 4, 4); //remove last " or " sb.Append(")"); } //create the xpath statement to match all children of the current node. if (IndexerData.ParentNodeId.HasValue && IndexerData.ParentNodeId.Value > 0) { if (sb.Length > 0) sb.Append(" and "); sb.Append("("); sb.Append("contains(@path, '," + IndexerData.ParentNodeId.Value + ",')"); //if the path contains comma - id - comma then the nodes must be a child sb.Append(")"); } //create the full xpath statement to match the appropriate nodes. If there is a filter //then apply it, otherwise just select all nodes. var filter = sb.ToString(); xPath = string.Format(xPath, filter.Length > 0 ? " and " + filter : ""); //raise the event and set the xpath statement to the value returned var args = new IndexingNodesEventArgs(IndexerData, xPath, type); OnNodesIndexing(args); if (args.Cancel) { return; } xPath = args.XPath; DataService.LogService.AddVerboseLog(-1, string.Format("({0}) PerformIndexAll with XPATH: {1}", this.Name, xPath)); AddNodesToIndex(xPath, type); }