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

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

    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 в базе данных брокера с ожидаемым ключевым словом, и я могу загрузить CP вручную, если закомментирую запрос и жестко запрограммирую идентификатор TCM.

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

Я гарантировал, что ключевое слово имеет значение и ключ, установленный на соответствующее значение.

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


person Rob Stevenson-Leggett    schedule 24.05.2012    source источник


Ответы (5)


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

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

person Dominic Cronin    schedule 24.05.2012
comment
Я попробовал это и обнаружил, что вообще не попадаю в базу данных. Я думаю, что ссылаюсь на неправильные библиотеки DLL, но не могу понять, какие из них правильные. У меня работает с устаревшим API фильтрации, но я не доволен. - person Rob Stevenson-Leggett; 25.05.2012

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

query.SetCriteria(multipleCombinedFacetCriteria);
String[] itemURIS = query.ExecuteQuery();
person Community    schedule 24.05.2012

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

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

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

person Hendrik Beenker    schedule 24.05.2012
comment
Я тоже задавался этим вопросом, но это не помогло. После некоторого тестирования и SQL-профилирования с техническим директором мы выяснили, что код не попадает в базу данных вечером. Мне пришлось использовать API-интерфейс устаревшего фильтра, чтобы получить какие-либо результаты. - person Rob Stevenson-Leggett; 25.05.2012
comment
Вы перешли со старой версии Tridion? Может быть, в каталогах lib все еще есть какие-то старые файлы Jar? - person Hendrik Beenker; 25.05.2012
comment
Нет, это новая установка 2009 SP1 с накопительным исправлением Content Delivery. - person Rob Stevenson-Leggett; 25.05.2012
comment
Можете ли вы получить элементы брокера на основе schema_ID или чего-то еще? Итак, что происходит, когда вы удаляете таксономический фильтр - person Hendrik Beenker; 25.05.2012

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

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

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

person Rob Stevenson-Leggett    schedule 29.05.2012

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

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

person Jonathan Williams    schedule 12.06.2012