1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/eric_ds-jfireEL

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Высокопроизводительный фреймворк для анализа выражений jfireEL

Сценарии использования

Анализ выражений EL используется в некоторых случаях, связанных с динамической конфигурацией правил. Например, внедрение внешних правил в механизм рабочего процесса, анализ SpEL в Spring Framework и т. д. Фреймворк jfireEL поддерживает распространённые выражения EL, такие как арифметические операции, получение элементов массива, списка, карты, пар ключ-значение, свойств, вызов методов, каскадный вызов, определение классов и перечислений, а также получение объектов и др.

По сравнению со SpringEL, jfireEL более лаконичен в выражении. Например, для сравнения свойств в SpringEL можно написать: vars['home'].bool(vars['person'].getAge() + '12' != vars['value']). В jfireEL это будет выглядеть так: home.bool(person.getAge() + '12' != value). Очевидно, что jfireEL легче читать.

Приглашаем присоединиться к техническому обсуждению в группе 186233599 и подписаться на публичный аккаунт автора: «Ветер и огонь говорят».

Тестирование производительности

Для сравнения производительности jfireEL, BeetlEL и SpringEL было использовано выражение vars['home'].bool(vars['person'].getAge() + '12' != vars['value']), которое было предварительно разогрето одинаковое количество раз для обеспечения инициализации. Результаты сравнения производительности трёх фреймворков следующие:

Способ использования

Сначала необходимо добавить зависимость Maven:

<dependency>
    <groupId>com.jfirer</groupId>
    <artifactId>jfireEl</artifactId>
    <version>1.0</version>
</dependency>

При использовании в коде сначала выполняется анализ выражения EL, после чего можно использовать этот внешний параметр для оценки выражения.

int[] array = new int[]
{
    1, 2, 3, 4
};
Map < String, Object > vars = new HashMap < String, Object > ();
vars.put("array", array);
Expression lexer = Expression.parse("array[2]");//используется статический метод parse для разбора строки в виде выражения EL и получения экземпляра выражения. Этот экземпляр является потокобезопасным и может использоваться повторно без необходимости повторного создания.
assertEquals(3, lexer.calculate(vars));//используются внешние параметры, передаваемые через Map. Метод calculate оценивает выражение на основе заданных параметров.

В выражениях EL строка, заключённая в одинарные кавычки (''), считается строкой, в противном случае она рассматривается как имя переменной, метода, параметра или конкретное имя перечисления в зависимости от контекста.

jfireEL использует Map в качестве носителя параметров, где ключом является имя переменной, а значением — значение переменной.

Примеры использования

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

[] Поддержка доступа к элементам

jfireEL поддерживает использование [] для доступа к элементам массива, List и Map. Следующие выражения являются правильными и допустимыми.

Доступ к элементам массива

int[] array = new int[]
{
    1, 2, 3, 4
};
Map < String, Object > vars = new HashMap < String, Object > ();
vars.put("array", array);
Expression lexer = Expression.parse("array[2]"); //анализ выражения EL
assertEquals(3, lexer.calculate(vars)); //выполнение выражения EL

Доступ к элементу List

List < String > list = new ArrayList < String > ();
list.add("1212");
list.add("13");
Map < String, Object > vars = new HashMap < String, Object > ();
vars.put("list", list);
Expression lexer = Expression.parse("list[1]");
assertEquals("13", lexer.calculate(vars));

Доступ к ключу и значению Map

Map < String, String > map = new HashMap < String, String > ();
map.put("1", "12");
Map < String, Object > vars = new HashMap < String, Object > ();
vars.put("map", map);
vars.put("age", "1");
Expression lexer = Expression.parse("map['1']");
assertEquals("12", lexer.calculate(vars));
Expression lexer2 = Expression.parse("map[age]");
assertEquals("12", lexer2.calculate(vars));

Поддержка арифметических операций

Арифметические операции включают сложение, вычитание, умножение и деление, а также вычисление остатка. Поддержка выглядит следующим образом:

Expression lexer = Expression.parse("1+4/2");
assertEquals(3, lexer.calculate(null)); //если не требуется вводить параметры для расчёта, можно передать null, что не повлияет на операцию
Expression lexer = Expression.parse("5-(4-1)");
assertEquals(2, lexer.calculate(null));
Expression lexer = Expression.parse("1*2-1");
assertEquals(1, lexer.calculate(null));

Поддержка доступа к свойствам объекта и класса

Доступ к свойствам объекта осуществляется с помощью .. Если необходимо получить доступ к статическому свойству класса, можно использовать форму T(ClassName) для получения статического класса, а затем использовать . для доступа к соответствующему свойству. Код для обоих случаев следующий:

public class PropertyTest extends TestSupport
{
    public static int age = 12;
    //доступ к свойствам объекта
    @Test
    public void test()
        {
            Expression lexer = Expression.parse("home.person.age");
            //home — это объект, содержащий свойство person, age — числовое свойство person
            assertEquals(person.age, lexer.calculate(vars));
            lexer = Expression.parse("home.person.age", Functional.build().setPropertyFetchByUnsafe(true).setRecognizeEveryTime(false).toFunction());
            assertEquals(person.age, lexer.calculate(vars));
        }
        
    //доступ к статическим свойствам класса
    @Test
    public void test2()
    {
        //PropertyTest — это тестовый класс, T() указывает на полное имя класса
        int result = Expression.parse("T(PropertyTest).age").calculate();
        assertEquals(age, result);
    }
}

Из примера доступа к свойствам объекта видно, что jfireEL поддерживает каскадные операции.

Поддержка троичных выражений

jfireEL поддерживает форму expression?value1:value2 для троичных выражений. Конкретный код выглядит следующим образом:

assertEquals(1, Expression.parse("2>1?1:2").calculate());
assertEquals(1, Expression.parse("3-2+1>1?1:2").calculate());
assertEquals(1, Expression.parse("3-2+1>1?2-1:2").calculate());
assertEquals(2, Expression.parse("3-2+1<1?2:1+1").calculate());
Map < String, Object > vars = new

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Быстрый анализатор выражений EL с поддержкой разнообразных выражений EL, сверхвысокая производительность — в 7 раз выше, чем у SpringEL. Развернуть Свернуть
AFL-3.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/eric_ds-jfireEL.git
git@api.gitlife.ru:oschina-mirror/eric_ds-jfireEL.git
oschina-mirror
eric_ds-jfireEL
eric_ds-jfireEL
master