Tridion 2009 SP1 Broker not returning results
tridion, tridion-content-delivery, tridion2009
Solution
I have managed to get this working using the following code:
private string GetComponentPresentationsUsingFilter()
{
//RSL: Had to use the obsolete filtering API because could not get anything back from the Broker.
var filter = new SearchFilter("tcm:0-" + _publicationId + "-1");
var query = new Query();
string schemaId = SchemaId.Split('-')[1];
query.AddCriteria("schema", "=", schemaId);
query.AddCustomMetaQuery(string.Format("KEY_NAME = 'product' AND CAST(KEY_STRING_VALUE as nvarchar(100)) = '{0}'", ProductFilter));
string[] results = filter.Match(query, new Sorting("title=asc"), MaxItems);
if (results == null)
{
Logger.Log.Info("Results was null.");
return string.Empty;
}
using (var cpf = new ComponentPresentationFactory(_publicationId))
{
var resultString = new StringBuilder();
Logger.Log.InfoFormat("Got {0} Results", results.Length);
foreach (string componentTcmId in results)
{
int componentId = int.Parse(componentTcmId.Split('-')[1]);
Logger.Log.InfoFormat("Got componentId as {0}", componentId);
int templateId = int.Parse(TemplateId.Split('-')[1]);
Logger.Log.InfoFormat("Got templateId as {0}", templateId);
ComponentPresentation cp = cpf.GetComponentPresentation(componentId, templateId);
if (cp != null && !string.IsNullOrEmpty(cp.Content))
{
resultString.Append(cp.Content);
Logger.Log.InfoFormat("Appended Content {0}", cp.Content);
}
}
return resultString.ToString();
}
}
No idea why I can get results this way but nothing using the Criteria api?
Problem
I am having trouble loading a Dynamic Component Presentation from the Broker based on a fairly simple query like the below, where I am trying to load the Component based on being tagged with a specific Keyword: ``` private string GetComponentPresentations() { Logger.Log.Info("Entered GetComponentPresentations"); var publicationCriteria = new PublicationCriteria(_publicationId); int schemaId = int.Parse(SchemaId.Split('-')[1]); // Is it the correct content type (Schema) var isSpecifedSchema = new ItemSchemaCriteria(schemaId); // Type of the item is 16 (Component). var isComponent = new ItemTypeCriteria(16); // All of the above conditions must be true Criteria isCorrectComponent = CriteriaFactory.And(isSpecifedSchema, isComponent); var publicationAndIsComponent = CriteriaFactory.And(publicationCriteria, isCorrectComponent); //Only get components tagged with the specified keyword var keywordCriteria = new KeywordCriteria(_productsCategoryTcmId, ProductFilter, Criteria.Equal); //Only get Components of the correct type from the correct publication Criteria fullCriteria = CriteriaFactory.And(publicationAndIsComponent, keywordCriteria); using (var query = new Query(fullCriteria)) { string[] results = query.ExecuteQuery(); using (var cpf = new ComponentPresentationFactory(_publicationId)) { if(results != null) { var resultString = new StringBuilder(); foreach (string componentTcmId in results) { Logger.Log.Info("Looping over results"); int componentId = int.Parse(componentTcmId.Split('-')[1]); int templateId = int.Parse(TemplateId.Split('-')[1]); ComponentPresentation cp = cpf.GetComponentPresentation(componentId, templateId); if (cp != null && !string.IsNullOrEmpty(cp.Content)) { resultString.Append(cp.Content); Logger.Log.InfoFormat("Appended Content {0}",cp.Content); } } Logger.Log.Info("Returning"); return resultString.ToString(); } Logger.Log.Info("Results was null."); return string.Empty; } } } ``` I can see the item in the ITEMS_CATEGORIES_AND_KEYWORDS table in the Broker database with the keyword I expect and I can load the CP manually if I comment out the query and hardcode the TCM ID in. I have made sure the Category is published and that all the variables' values are correct. I have ensured the Keyword has a value and a key set to the appropriate value. What else can I check?