Search code examples
tridiontridion2009tridion-content-delivery

Tridion 2009 SP1 Broker not returning results


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?


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?