Использование функций в расширенных выражениях
В этом разделе объясняются различные способы определения функций, которые используются в выражениях, назначаемых связям использования и деталям, и оцениваются в процессе фильтрации опций делегатом фильтрации опций. В последующих разделах рассматриваются следующие аспекты:
• Различные способы задания псевдонима функции, чтобы уменьшить размер выражений и разрешить их повторное использование.
• Информация о том, как технический исполнитель функций может получить доступ к объектам системы фильтрации: фильтру навигации опций, критериям навигации, набору опций, ограничению по дате, объектам, которые фильтруются или участвуют в процессе фильтрации (например, детали, связи использования и связанные с ними данные).
Обзор определения функции и ее использование в выражениях
Определите Java-класс с общедоступным статическим методом (функцией), принимающий аргументы, которые нужно передать в функцию. Единственными переменными аргументами, которые можно передавать в функции, являются варианты (в частности, их статус выбора: true, если выбраны, и false, если не выбраны) и объект типа com.ptc.windchill.option.model.ATONavigationBean, который предоставляется и передается системой фильтрации во время выполнения (описано в одном из последующих разделов). Этот определенный общедоступный статический метод Java-класса можно использовать в выражении различными способами с помощью следующих форматов:
• используя полный путь к классу для метода;
• используя формат ClassName.MethodName(), если определен соответствующий импорт для класса;
• используя MethodName() format (), если определен соответствующий статический импорт для класса;
• используя MethodAbbreviation(), если определено сокращение (или псевдоним) для метода;
• используя макрос, если определен макрос.
В последующих разделах приводятся примеры построения некоторых типовых функций и выражений с этими функциями для каждой из вышеупомянутых ситуаций. Вы можете написать функции для использования возможностей переменного объекта ATONavigationBean, который предоставляет доступ к текущим элементам: NavigationCriteria, ATONavigationFilter, дата ограничения применимости для фильтра опций, набор опций для фильтра опций, выбранные в фильтре опций варианты, статус выбора для всех вариантов в наборе опций, текущий элемент NavigationUnit с фильтруемым узлом (например, WTPartUsageLink) и поддерживающие узлы (например, дочерняя деталь связи использования). В частности, это позволяет использовать другие объекты (например, значения атрибутов в деталях, связи использования и вхождения использования) в решениях по фильтрации.
Определение функции
Чтобы определить функцию, напишите Java-класс с общедоступным статическим методом и требуемыми аргументами.
Java-код:
Объяснение:
Это пример статической логической функции, которая принимает четыре логических аргумента и возвращает значение, определяемое по следующей таблице истинности (T означает "истина", F - "ложь").
Таблица истинности:
x1 | x2 | x3 | x4 | Результат |
---|
T | F | T | F | T |
T | T | F | F | T |
F | T | F | T | T |
F | F | T | T | T |
Все другие сочетания x1, x2, x3 и x4 дают значение ЛОЖЬ (F).
Чтобы получить соответствующее выражение для каждой строки, подставьте наименование параметра для T (например, x1), отрицание параметра для F (! x1) и объедините эти результаты с помощью операторов конъюнкции (&&). Например, из первой строки получается следующее выражение:
x1 && ! x2 && x3 && ! x4
Затем объедините логические выражения строк с помощью операторов дизъюнкции (||), чтобы получить выражение, представляющее таблицу истинности.
| Если в выражении неоднократно используется один и тот же вариант, можно ввести функцию и использовать ее в выражении, как объясняется далее. |
Функция может возвратить любой тип (например, любой числовой примитив - целый, число с двойной точностью, число с плавающей запятой), который затем можно сравнить с константой того же типа, чтобы создать логическое выражение, как в следующем примере.
Функции такого вида позволяют отфильтровывать конфигурации, превышающие заданные общие затраты. Как вариант, можно передать целое значение затрат в качестве еще одного параметра в функцию и выполнить сравнение непосредственно внутри функции. В результате функция возвращает логическое значение.
Использование в выражениях
В приведенных ниже примерах предполагается, что имеются варианты: RED, GREEN, BLUE, WHITE из опции COLOR; UK, US, MX из опции COUNTRY; PLASTIC, STEEL, WOOD из опции MATERIAL и SMALL, MEDIUM, LARGE, X_LARGE из опции SIZE. Используются также варианты: hasHD_TV, hasBLUERAY, hasWI_FI.
Использование полного пути к классу для метода
В этом случае для задания функции используются полный путь к классу и наименование метода. В качестве аргументов для функции в этом примере передаются наименования вариантов. Этот подход иллюстрируют следующие примеры:
• com.ptc.ext.BooleanTableFunction.evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && com.ptc.ext.BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• com.ptc.ext.CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)> 100
Использование объявлений импорта
Импортируемые классы можно задать в файле свойств WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties следующим образом:
• exparser.import.1=com.ptc.ext.BooleanTableFunction
• exparser.import.2=com.ptc.ext.CostFunction
В этом случае можно опустить путь к пакету при задании функции в выражении:
• BooleanTableFunction.evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)> 100
Использование статических объявлений импорта
В этом случае сначала задаются статические объявления импорта в файле свойств WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties следующим образом:
exparser.static.import.1=com.ptc.ext.BooleanTableFunction
exparser.static.import.2=com.ptc.ext.CostFunction
В этом случае можно опустить путь к пакету и наименование класса (оставив только наименование метода) при задании функции в выражении:
• evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• getCost(hasHD_TV, hasBLUERAY, hasWI_FI) > 100
Использование сокращений (псевдонимов) для методов
В этом случае задается сопоставление сокращения для метода с полным путем к методу в файле свойств WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties следующим образом:
exparser.abbreviation.1=EVAL=com.ptc.ext.BooleanTableFunction.evaluate
exparser.abbreviation.2=COST=com.ptc.ext.CostFunction.getCost
Затем эти псевдонимы можно использовать для обращения к функции в выражении:
• EVAL(RED, UK, PLASTIC, LARGE)
• BLUE && EVAL(GREEN, US, STEEL, SMALL) || MEDIUM
• COST(hasHD_TV, hasBLUERAY, hasWI_FI) > 100
Использование макроса
В отличие от сокращений, предоставляющих псевдонимы для полного пути к одной функции, макрос служит псевдонимом для фрагмента выражения. Это полезно, если фрагмент выражения неоднократно используется в многочисленных объектах, таких как связи использования и детали. Импорт, статический импорт и объявление сокращения решаются динамически во время анализа выражения. Сначала в выражение подставляются фрагменты для макроса, а затем выражение анализируется. В качестве других свойств анализатора определяются сопоставления макроса в WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties следующим образом:
exparser.macro.1=EVALUATE=com.ptc.ext.BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL)
exparser.macro.2=GET_COST= com.ptc.ext.CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)
Затем принимают форму два последних выражения:
• BLUE && EVALUATE || MEDIUM
• GET_COST > 100
Макросы позволяют обозначить объект ATONavigationBean, который содержит информацию о критериях навигации и фильтруемых структурных объектах.
Доступ к текущей информации фильтрации
Объект com.ptc.windchill.option.model.ATONavigationBean является bean-оболочкой для экземпляров объекта ATONavigationFilter и текущего объекта NavigationUnit, предоставляемого системой фильтрации. Помимо фильтра и навигационного объекта компонент bean определяет методы получения NavigationCriteria, ограничение по дате для фильтра опций, OptionSet, выбранные в фильтре опций варианты и статус выбора для всех вариантов в OptionSet, сгруппированных опцией.
public ATONavigationFilter getFilter();
public NavigationUnit getNavigationUnit();
public NavigationCriteria getNavigationCriteria();
public Timestamp getFilterEffectivityDate();
public OptionSet getFilterOptionSet();
public Map<String, Set<String>> getFilterChoiceMap();
public Map<String, Boolean> getFilterSelectedChoiceMap();
Использование ATONavigationBean в выражениях
Чтобы использовать компонент bean, необходимо сначала определить функцию, принимающую его в качестве одного из параметров. Примером может служить встроенный класс com.ptc.windchill.option.filter.NavigationUtils, который предоставляет методы (функции) для сравнения ограничений по дате, заданных в фильтре, с фиксированными верхними или нижними границами меток времени.
public static boolean afterDate(ATONavigationBean beanOfActivity, String after)
public static boolean beforeDate(ATONavigationBean beanOfActivity, String before)
public static boolean betweenDate(ATONavigationBean beanOfActivity, String after, String before)
Существует еще три метода, которые принимают дополнительный строковый аргумент для задания образца даты (полезно для неамериканских языковых настроек). Если в выражении задается конкретный объект, необходимо передавать пустой объект типа ATONavigationBean в качестве объекта, возвращаемого статическим методом ATONavigationBean.newATONavigationBean(). Для обозначения компонента bean, предоставляемого этим фрагментом, удобно использовать макрос. Система фильтрации передает компоненту bean элементы ATONavigationFilter и NavigationUnit, предоставляя вам доступ к текущим данным фильтрации.
В первую очередь определите макрос для экземпляра ATONavigationBean и сокращения для методов NavigationUtils в файле LookUpService.properties следующим образом:
exparser.macro.1=EFFECTIVITY_INFO= com.ptc.windchill.option.model.ATONavigationBean.newATONavigationBean()
exparser.abbreviation.1=BEFORE= com.ptc.windchill.option.filter.NavigationUtils.beforeDate
exparser.abbreviation.2=AFTER= com.ptc.windchill.option.filter.NavigationUtils.afterDate
exparser.abbreviation.3=BETWEEN= com.ptc.windchill.option.filter.NavigationUtils.betweenDates
Теперь можно определить выражение, которое зависит от того, в какой интервал времени попадает ограничение по дате:
RED && SMALL && BEFORE(EFFECTIVITY_INFO, “05/05/2005”) ||
GREEN && LARGE && BETWEEN(EFFECTIVITY_INFO, “05/05/2005”, “06/06/2006”) ||
BLUE && MEDIUM && BETWEEN(EFFECTIVITY_INFO, “06/06/2006”, “07/07/2007”) ||
WHITE && X_LARGE && AFTER(EFFECTIVITY_INFO, “07/07/2007”)
Исходя из четырех непересекающихся интервалов времени, это выражение принимает четыре разные формы, как указано в каждой строке.
RED && SMALL - если ограничение по дате предшествует 05.05.2005
GREEN && LARGE - если ограничение по дате приходится между 05.05.2005 и 06.06.2006
BLUE && MEDIUM - если ограничение по дате приходится между 06.06.2006 и 07.07.2007
WHITE && X_LARGE - если ограничение по дате наступает после 07.07.2007