Tridion 2009 SP1 Broker не возвращает результаты

У меня возникают проблемы при загрузке презентации динамического компонента из брокера, основанной на довольно простом запросе, подобном приведенному ниже, где я пытаюсь загрузить компонент на основе пометки определенным ключевым словом:

    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;
            }
        }

    }

Я вижу элемент в таблице ITEMS_CATEGORIES_AND_KEYWORDS в базе данных Broker с ожидаемым ключевым словом, и я могу загрузить CP вручную, если закомментирую запрос и жестко закодирую идентификатор TCM.

Я удостоверился, что Категория опубликована и что все значения переменных верны.

Я убедился, что ключевое слово имеет значение и ключ установлен на соответствующее значение.

Что еще я могу проверить?

5 ответов

Решение

Мне удалось заставить это работать, используя следующий код:

    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();
        }
    }

Не знаю, почему я могу получить результаты таким образом, но ничего, используя Criteria API?

Я бы порекомендовал удалить каждый из критериев из запроса один за другим и проверить, какие результаты возвращаются для каждого.

Еще одна вещь, которую нужно проверить, это то, что вы используете API, который, как вы думаете, вы используете. Tridion имеет два очень похожих API для запросов брокера. Дважды проверьте, что вы ссылаетесь на правильные сборки.

Проверяли ли вы, что категория, по которой вы запрашиваете, опубликована? Вам нужно будет сделать это, если вы используете более новый механизм "критериев". Мне всегда это нравится!

Спасибо Джонатан

При просмотре в Java API я вижу эту перегрузку:

KeywordCriteria(java.lang.String categoryName, java.lang.String keyword, FieldOperator operator) 

Может ли _productsCategoryTcmId быть просто именем категории вместо URI?

Вы пытались использовать метод SetCriteria в запросе? Например:

query.SetCriteria(multipleCombinedFacetCriteria);
String[] itemURIS = query.ExecuteQuery();
Другие вопросы по тегам