I have Five check boxes
- Search All
- Template 1
- Template 2
- Template 3
- Template 4
If user selects Search All
, then simply we can pass index name and get result, if user selects one of template specific check box, again simply we can do by passing template name, but if any of two templates specific check box(or may be three) are checked, then?
Can we pipe-separate templateIDs?
You may need to change the method in the Advanced Database Crawler to handle the GUIDs of templates passed in. The SearchParam
class has a property called TemplateIds
which by being plural indicates it should allow more than one. However, if you look into the code, this is how it is used:
templateIds = IdHelper.NormalizeGuid(templateIds);
The NormalizeGuid()
method actually only returns a single GUID. So I recommend you alter the ApplyTemplateFilter()
method here to return multiple Template GUIDs:
protected void ApplyTemplateFilter(CombinedQuery query, string templateIds, QueryOccurance occurance)
{
if (String.IsNullOrEmpty(templateIds)) return;
templateIds = IdHelper.NormalizeGuid(templateIds);
var fieldQuery = new FieldQuery(BuiltinFields.Template, templateIds);
query.Add(fieldQuery, occurance);
}
So change templateIds = IdHelper.NormalizeGuid(templateIds)
to handle multiple GUIDs, perhaps by splitting the input at a |
to get each GUID then normalizing each one of those and combining them again via a |
.
Further to what Mark said this can be achieved by using below function:
protected void ApplyTemplateFilter(CombinedQuery query, string templateIds)
{
if (String.IsNullOrEmpty(templateIds)) return;
var fieldQuery = new CombinedQuery();
var values = IdHelper.ParseId(templateIds);
foreach (var value in values.Where(ID.IsID))
{
AddFieldValueClause(fieldQuery, BuiltinFields.Template, value, QueryOccurance.Should);
}
query.Add(fieldQuery, QueryOccurance.Must);
}