В работе

Умный псевдо-SQL фильтр на JS. Продолжение

Есть библиотека: [login to view URL] (см. в приложении)

Вот задача, по которой она делалась: https://www.freelancer.com/projects/Software-Architecture/pseudo-SQL-Javascript-jQuery/

В процессе ее использования появилось понимание дальнейшего развития ее возможностей. Необходимо ее доработать или полностью переписать с учетом новых особенностей.

Нововведения, которые требуется реализовать в дополнение к существующим функциям:

1. static и dynamic словари теперь не просто словари вида:

var static_dictionaries =

{

'createdDate': ['startOfDay()', 'startOfWeek()', 'startOfMonth()', 'now()',],

'description': []

};

а они получили дополнительный уровень: уровень разрешенных comparison_operators:

var static_dictionaries =

{

'createdDate': {

'allowed_values': ['startOfDay()', 'startOfWeek()', 'startOfMonth()', 'now()',],

'allowed_comparison_operators': ['=', '>', '<', '>=', '<=']

},

'description': {

'allowed_values': [],

'allowed_comparison_operators': ['~', 'like', '=']

}

};

- это нужно, потому что, как оказалось, не все операторы можно использовать с разными словами.

2. возможными значениями могут быть списки. Инициатором появления списка являются ключевые слова in или not in:

testcases and priority in ('High', 'Medium') and createdBy = currentUser()

3. в качестве возможных значений словарей теперь могут быть не просто слова, но и фразы, которые следует заключать в двойные кавычки, но при поиске эти кавычки игнорировать:

var dynamic_dictionaries =

{

'project': {

'allowed_values': ['Hello World', 'Keep calm & JS', 'Acme'],

'allowed_comparison_operators': ['=', 'is', 'is not', 'in', 'not in']

}

};

и получаем:

testcases and project = "Keep cal & JS"

или, с учетом п.1:

testcases and project not in ("Keep cal & JS", Acme)

testcases and description ~ "Hello, world" and createdBy = currentUser()

4. добавляется особый словарь: ordering

var ordering_dictionaries = {'orderBy': ['asc', 'desc']}

особенность его в том, что между ключем 'orderBy' и значением должен стоять как минимум один из ключей statiс или dynamic словаря, либо несколько ключей через запятую:

testcases orderBy priority desc

testcases and priority in (High, Medium) orderBy createdDate, priority desc

(!) для начала этого словаря не требуется наличие логического оператора

(!) после ввода ключей и значений из этого словаря любые другие словари и операторы перестают действовать (т.е. это финализирующее слово). но если удалить orderBy … desc, то они снова начинают действовать.

5. добавляется особый словарь: grouping

var grouping_dictionaries = {'groupBy': [ключи из static и dynamic словаря]}

testcases groupBy priority

testcases groupBy priority orderBy priority asc

(!) для начала этого словаря так же не требуется наличие логического оператора

(!) после ввода значений из этого словаря перестают действовать любые другие словари кроме ordering

Нашел ошибки и неточности в описании:

4. Естественно, мы не должны просто
var ordering_dictionaries = {'orderBy': ['asc', 'desc']};
testcases and priority in (High, Medium) orderBy createdDate, priority desc

у нас, ведь, есть comparison_operators, поэтому:
var ordering_dictionaries =
{
'orderBy': {
'allowed_values': ['asc', 'desc'],
'allowed_comparison_operators': ['=']
}
};
testcases and priority in (High, Medium) orderBy = (createdDate(), priority) desc
- так, кажется, логичней. Но обсуждаемо. Пускай "код подскажет", как правильней и логичней.
И то же самое про логический соединитель and: если логичней по коду писать orderBy после and, то давай после and:
testcases and priority in (High, Medium) and orderBy = (createdDate(), priority) desc
testcases and orderBy = priority desc
но нужно учесть, что не может стоять or:
testcases or orderBy = priority desc
- т.е. вводить еще какие-то ключи в ordering_dictionaries словарь вроде allowed_logical_operators_before, allowed_logical_operators_after... смотри сам, чтобы было удобно.

5. То же самое упустил с groupBy:
var grouping_dictionaries = {'groupBy': [ключи из static и dynamic словаря]}
testcases groupBy priority
testcases groupBy priority orderBy priority asc

логичнее же так:
var grouping_dictionaries = {'groupBy': {'allowed_values': [ключи из static и dynamic словаря], 'allowed_comparison_operators': ['=']}
testcases groupBy = priority
testcases groupBy = (priority, createdDate())

или с and:
testcases and groupBy = priority and orderBy = priority asc
в последнем примере добавлен логический соединитель and между groupBy и orderBy - он также кажется логичным здесь.

Но обсуждаемо. Может быть, так лучше, а может быть иначе. Поэтому, как мне кажется, удобней было бы добавить еще и allowed_logical_operators_before, allowed_logical_operators_after в каждый из словарей - и на основе них работать. Получится и гибче и единообразней.

Нашел ошибки и неточности в описании:

4. Естественно, мы не должны просто
var ordering_dictionaries = {'orderBy': ['asc', 'desc']};
testcases and priority in (High, Medium) orderBy createdDate, priority desc

у нас, ведь, есть comparison_operators, поэтому:
var ordering_dictionaries =
{
'orderBy': {
'allowed_values': ['asc', 'desc'],
'allowed_comparison_operators': ['=']
}
};
testcases and priority in (High, Medium) orderBy = (createdDate(), priority) desc
- так, кажется, логичней. Но обсуждаемо. Пускай "код подскажет", как правильней и логичней.

И то же самое про логический соединитель and: если логичней по коду писать orderBy после and, то давай после and:
testcases and priority in (High, Medium) and orderBy = (createdDate(), priority) desc
testcases and orderBy = priority desc
но нужно учесть, что не может стоять or:
testcases or orderBy = priority desc
- т.е. вводить еще какие-то ключи в ordering_dictionaries словарь вроде allowed_logical_operators_before, allowed_logical_operators_after... смотри сам, чтобы было удобно.

5. То же самое упустил с groupBy:
var grouping_dictionaries = {'groupBy': [ключи из static и dynamic словаря]}
testcases groupBy priority
testcases groupBy priority orderBy priority asc

логичнее же так:
var grouping_dictionaries = {'groupBy': {'allowed_values': [ключи из static и dynamic словаря], 'allowed_comparison_operators': ['=']}
testcases groupBy = priority
testcases groupBy = (priority, createdDate())

или с and:
testcases and groupBy = priority and orderBy = priority asc
в последнем примере добавлен логический соединитель and между groupBy и orderBy - он также кажется логичным здесь.

Но обсуждаемо. Может быть, так лучше, а может быть иначе. Поэтому, как мне кажется, удобней было бы добавить еще и allowed_logical_operators_before, allowed_logical_operators_after в каждый из словарей - и на основе них работать. Получится и гибче и единообразней.

Квалификация: Javascript, Архитектура ПО

Показать больше js freelancer, hello world javascript, freelancer sql c#, freelancer.js, freelancer high priority, architecture freelancer com, 5 https www freelancer com, software write edid, free software write company profile, software write websites idea, software write book images, software write books, software write protection, free software write book, software write book, software write protect software, software write technical manual

О работодателе:
( 5 отзыв(-а, -ов) ) Saint-Petersburg, Russian Federation

ID проекта: #9647638

2 фрилансеров(-а) в среднем готовы выполнить эту работу за $694

edwardryzhewski

Добрый день.Заинтересовал ваш проект, можем обговорить детали? С уважением, Эдуард.

$277 USD за 10 дней(-я)
(14 отзывов(-а))
4.8
AntonBliznetc

Я представляю команду разработчиков из Екатеринбурга. Я имею большой опыт в sql разработке и в обработке баз данных. И не большой опыт в javascript. Мой напарник node.js разработчик. Вопрос: В современных броузере Больше

$1111 USD за 30 дней(-я)
(14 отзывов(-а))
2.7