Проблема подкачки источника данных (пересмотрено снова) - PullRequest
0 голосов
/ 11 июня 2019

См. Проблема подкачки источника данных (пересмотренная) за оригинальный вопрос.

Маркус, вы были достаточно любезны, чтобы помочь решить проблему с включением счетчика записей в запрос с использованием вычисленного источника данных. У меня есть форма поиска с 15 виджетами - смесь диапазонов дат, выпадающих списков, текстовых значений и ._contains, ._equals, ._greaterThanOrEquals, ._lessThanOrEquals и т. Д.

Я тщательно протестировал этот код на SQL-коде MySQL, и он отлично работает.

Я добавил 16-й параметр PropertyNames, представляющий собой список с привязкой @ datasource.query.filters.Property.PropertyName._in и пустыми параметрами. Виджет на форме скрыт, потому что он используется только для дополнительной фильтрации.

Используется следующая логика, так что конкретный вошедший в систему пользователь может просматривать только свои собственные свойства. Поэтому, если они выполняют поиск, а свойство не указано, мы делаем: -

if (params.param_Property === null && canViewAllRecords === false) {
    console.log(params.param_PropertyNames); // correct output
    ds.filters.Property.PropertyName._in  = params.param_PropertyNames;
}

Количество записей (records.length) правильное, и если я перебрать массив записей, набор записей будет правильным.

Однако на странице результатов в таблице отображается больший набор результатов, в котором отсутствует фильтр PropertyNames. Поэтому, если бы мне пришлось искать в статусе «Открыто» (результаты MySQL 50), а затем я добавляю единственное значение ['Имя свойства London SW45'] для params.param_PropertyNames, количество записей равно 6, массив записей равен 6, но отображение источника данных 50. Таким образом, источник данных не фильтруется в массиве свойств.

Изначально я пытался без добавления дополнительного параметра и виджета формы и просто использовал код, такой как

if (params.param_Property === null && canViewAllRecords === false) {
    console.log(params.param_PropertyNames); // correct output
    ds.filters.Property.PropertyName._in  = properties; // an array of 
        properties to filter out
}

Но это не сработало, отсюда и идея добавления виджета формы и дополнительного параметра к вычисленному источнику данных countcount.

Если я проверю в параметрах query.parameters, то увижу: -

"param_Status": "Open", 
"param_PropertyNames": ["Property Name London SW45"],

Если я проверю query.filters: -

name=param_Status, value=Open
name=param_PropertyNames, value=[]}]}

Похоже, что фильтр не установлен. Даже жесткое кодирование ds.filters.Property.PropertyName._in = ['Имя свойства London SW45'], Я получаю тот же результат.

Есть ли у вас какие-либо идеи, что может вызвать эту проблему и что я могу сделать для обхода?

1 Ответ

0 голосов
/ 18 июня 2019

Используя решение на стороне сервера, я бы предложил отредактировать как ваш скрипт запроса источника данных SQL (на стороне сервера), который должен фильтроваться по этому списку свойств, так и включить тот же код в ваш скрипт на стороне сервера для вашего вычисленного источника данных Count. Код будет выглядеть примерно так, не зная ваших точных деталей:

var subquery = app.models.Directory.newQuery();
subquery.filters.PrimaryEmail._equals = Session.getActiveUser().getEmail();
subquery.prefetch.Property._add();
var results = subquery.run();

if(!results[0].CanViewAllRecords) {
  query.filters.Property.PropertyName._in = results[0].Property.map(function(i) {return i.PropertyName;});
}

Добавляя этот код, вы фильтруете свой каталог по текущему пользователю и предварительно выбираете таблицу отношений свойств, затем вы устанавливаете фильтр только в том случае, если ваш пользователь canviewallRecords имеет значение false, и используете функцию отображения JS для создания массива поля PropertyName в Таблица свойств. Как я уже говорил, ваш код может не совпадать, в зависимости от того, как вам нужно получить свойство пользователя canviewallrecords, и, конечно, я не знаю вашего отношения между таблицей пользователя и свойством, однозначно или много другое. , Но это должно дать вам представление о том, как реализовать это на стороне сервера.

...