About | Tutorial | Rule Engine | GRL | GRL JSON | RETE Algorithm | Functions | FAQ | Benchmark
Wszystkie wbudowane funkcje są zdefiniowane w pliku ast/BuiltInFunctions.go
. Na chwilę obecną są to:
MakeTime
spowoduje utworzenie time.Time
z lokalnymi locale
.
year
to numer roku.month
to numer miesiąca, Styczeń = 1.day
to numer dnia w miesiącu.hour
godzina w ciągu dnia, zaczynając od 0.minute
minuta w godzinie, zaczynając od 0.second
sekunda w minucie, zaczynając od 0.
time.Time
wartość reprezentująca czas określony w argumencie wlocal
.
rule SetExpire "Set the expire date for Fact created before 2020" {
when
Fact.CreateTime < MakeTime(2020,1,1,0,0,0)
then
Fact.ExpireTime = MakeTime(2021,1,1,0,0,0);
}
Changed
sprawi, że podana variableName
zostanie usunięta z pamięci roboczej przed następnym cyklem.
variableName
nazwa zmiennej, która ma być usunięta z pamięci roboczej.
rule SetExpire "Set new expire date" {
when
IsZero(Fact.ExpireTime)
then
Fact.CalculateExpire(); // this function will internally change the ExpireTime variable
Changed("Fact.ExpireTime")
}
Funkcja Now
utworzy nową wartość time.Time
zawierającą aktualny czas.
time.Time
wartość reprezentującą bieżącą wartość.
rule ResetTime "Reset the lastUpdate time" {
when
Fact.LastUpdate < Now()
then
Fact.LastUpdate = Now();
}
Log
spowoduje wyemitowanie łańcucha log-debug z wnętrza reguły.
text
Tekst do wysłania do Log-Debug
rule SomeRule "Log candidate name if he is below 17 years old" {
when
Candidate.Age < 17
then
Log("Under aged: " + Candidate.Name);
}
IsNil
sprawdzi, czy argument jest wartością nil
.
i
zmienna do sprawdzenia.
true
jeśli podany argument jestnil
lub niepoprawną wartościąptr
.false
jeśli podany argument jest poprawną wartościąptr
.
rule CheckEducation "Check candidate's education fact" {
when
IsNil(Candidate.Education) == false &&
Candidate.Education.Grade == "PHD"
then
Candidate.Onboard = true;
}
IsZero
sprawdzi każdą zmienną w argumencie pod kątem jej wartości Zero
. Zero oznacza, że zmienna jest nowo zdefiniowana i nie ma przypisanej wartości początkowej. Zwykle stosuje się to do typów takich jak string
, int64
, uint64
, bool
, time.Time
, itp.
i
zmienna do sprawdzenia.
true
jeśli podany argument jest zerem.false
jeśli podany argument nie jest zerem.
rule CheckStartTime "Check device's starting time." {
when
IsZero(Device.StartTime) == true
then
Device.StartTime = Now();
}
Retract
wykluczy podaną regułę z ewaluacji w kolejnych cyklach. Jeśli reguła jest wycofana, to jej zakres when
nie będzie oceniany w następnych cyklach po wywołaniu Retract
. Silnik automatycznie przywróci wszystkie reguły na swoje miejsce, gdy zacznie ponownie od początku.
ruleName
nazwa reguły do wycofania.
rule CheckStartTime "Check device's starting time." salience 1000 {
when
IsZero(Device.StartTime) == true
then
Device.StartTime = Now();
Retract("CheckStartTime");
}
Funkcja GetTimeYear
wyodrębni wartość Year z argumentu time.
time
Zmienna czasowa
- Wartość roku w czasie.
rule StartNewYearProcess "Check if it's a new year to restart new FinancialYear." salience 1000 {
when
GetTimeYear(Now()) != GL.FinancialYear
then
GL.CloseYear(GL.FinancialYear)
}
GetTimeMonth
will extract the Month value of the time argument.
time
Zmienna czasowa
- Wartość miesiąca czasu. 1 = styczeń.
// TODO: something's not right here. The description is copy/pasted from above
// but the condition/action doesn't make sense to me
rule StartNewYearProcess "Check if its a new year to restart new FinancialYear." salience 1000 {
when
isZero(Process.Month)
then
Process.Month = GetTimeMonth(Process.Month);
}
Polecenie GetTimeDay
wyodrębni dzień miesiąca z argumentu time.
time
Zmienna czasowa
- Wartość dnia miesiąca dla czasu.
rule GreetEveryDay "Log a greeting every day." salience 1000 {
when
Greeting.Day != GetTimeDay(Now())
then
Log("Its a new Day !!!")
Retract("GreetEveryDay")
}
Polecenie GetTimeHour
wyodrębni wartość godziny z argumentu time.
time
Zmienna czasowa
- Wartość godziny czasu. Mieści się w przedziale od 0 do 23
rule DailyCheckBuild "Execute build every 6AM and 6PM." {
when
GetTimeHour(Now()) == 6 || GetTimeHour(Now()) == 18
then
CiCd.BuildDaily();
Retract("DailyCheckBuild");
}
Polecenie GetTimeMinute
wyodrębni wartość minutową argumentu time.
time
Zmienna czasowa
- Minutowa wartość czasu, od 0 do 59.
rule DailyCheckBuild "Execute build every 6.30AM and 6.30PM." {
when
(GetTimeHour(Now()) == 6 || GetTimeHour(Now()) == 18) &&
GetTimeMinute(Now()) == 30
then
CiCd.BuildDaily();
Retract("DailyCheckBuild");
}
Polecenie GetTimeSecond
wyodrębni drugą wartość argumentu time.
time
Zmienna czasowa
- Drugą wartość czasu, z zakresu od 0 do 59.
rule DailyCheckBuild "Execute build every 6.30AM and 6.30PM." {
when
(GetTimeHour(Now()) == 6 || GetTimeHour(Now()) == 18) &&
GetTimeMinute(Now()) == 30 && GetTimeSecond(Now()) == 0
then
CiCd.BuildDaily();
Retract("DailyCheckBuild");
}
IsTimeBefore
sprawdza, czy wartość czasowa poprzedza inną wartość czasową.
time
Wartość czasowa, która ma zostać sprawdzonabefore
Wartość czasowa, względem której sprawdzana jest powyższa wartość.
- True jeśli wartość czasowa
before
poprzedza wartośćtime
. - False jeśli wartość czasu
before
nie poprzedza wartościtime
.
rule PromotionExpireCheck "Apply a promotion if promotion hasn't yet expired." {
when
IsTimeBefore(Now(), Promotion.ExpireDateTime)
then
Promotion.Discount = 0.10;
Retract("PromotionExpireCheck");
}
IsTimeAfter
sprawdza, czy wartość czasowa następuje po innej wartości czasowej.
time
Wartość czasowa, która ma zostać sprawdzonaafter
Wartość czasowa, względem której sprawdzana jest powyższa wartość.
- True jeśli wartość czasu
after
podąża za wartościątime
. - False jeśli wartość czasu
after
nie podąża za wartościątime
.
rule AdditionalTax "Apply additional tax if new tax rules are in effect." {
when
IsTimeAfter(Purchase.TransactionTime, TaxRegulation.StartSince)
then
Purchase.Tax = Purchase.Tax + 0.01;
}
Funkcja TimeFormat
sformatuje argument czasu w sposób określony przez argument layout
.
time
Wartość czasu, która ma zostać sformatowana.layout
Zmienna łańcuchowa określająca układ formatu daty.
Aby uzyskać informacje na temat formatu układu, można przeczytać ten artykuł
- Łańcuch znaków sformatowany w określony sposób.
rule LogPurchaseDate "Log the purchase date." {
when
IsZero(Purchase.TransactionDate) == false
then
Log(TimeFormat(Purchase.TransactionDate, "2006-01-02T15:04:05-0700");
}
Polecenie Complete
spowoduje, że silnik przestanie przetwarzać kolejne reguły w bieżącym cyklu. Jest to przydatne, gdy chcemy zakończyć dalsze przetwarzanie reguł pod określonym warunkiem.
rule DailyCheckBuild "Execute build at 6.30AM and 6.30PM." {
when
(GetTimeHour(Now()) == 6 || GetTimeHour(Now()) == 18) &&
GetTimeMinute(Now()) == 30 && GetTimeSecond(Now()) == 0
then
CiCd.BuildDaily();
Complete();
}
Wszystkie poniższe funkcje są opakowaniem ich funkcji matematycznych Golanga. Powinieneś przeczytać stronę Golanga o matematyce, aby dowiedzieć się, jak używać każdej z funkcji.
W przeciwieństwie do go, nie musisz używać prefiksu math.
, aby użyć ich w swoim GRL.
Używaj ich jak normalnych wbudowanych funkcji.
when
Max(Fact.A, Fact.C, Fact.B) > 10
then
Fact.X = Acosh(Fact.C);
- Max(vals ...float64) float64
- Min(vals ...float64) float64
- Abs(x float64) float64
- Acos(x float64) float64
- Acosh(x float64) float64
- Asin(x float64) float64
- Asinh(x float64) float64
- Atan(x float64) float64
- Atan2(y, x float64) float64
- Atanh(x float64) float64
- Cbrt(x float64) float64
- Ceil(x float64) float64
- Copysign(x, y float64) float64
- Cos(x float64) float64
- Cosh(x float64) float64
- Dim(x, y float64) float64
- Erf(x float64) float64
- Erfc(x float64) float64
- Erfcinv(x float64) float64
- Erfinv(x float64) float64
- Exp(x float64) float64
- Exp2(x float64) float64
- Expm1(x float64) float64
- Float64bits(f float64) uint64
- Float64frombits(b uint64) float64
- Floor(x float64) float64
- Gamma(x float64) float64
- Hypot(p, q float64) float64
- Ilogb(x float64) int
- IsInf(f float64, sign int64) bool
- IsNaN(f float64) (is bool)
- J0(x float64) float64
- J1(x float64) float64
- Jn(n int64, x float64) float64
- Ldexp(frac float64, exp int64) float64
- MathLog(x float64) float64
- Log10(x float64) float64
- Log1p(x float64) float64
- Log2(x float64) float64
- Logb(x float64) float64
- Mod(x, y float64) float64
- NaN() float64
- Pow(x, y float64) float64
- Pow10(n int64) float64
- Remainder(x, y float64) float64
- Round(x float64) float64
- RoundToEven(x float64) float64
- Signbit(x float64) bool
- Sin(x float64) float64
- Sinh(x float64) float64
- Sqrt(x float64) float64
- Tan(x float64) float64
- Tanh(x float64) float64
- Trunc(x float64) float64
Poniższe funkcje mogą być wywoływane z poziomu GRL, o ile odbiornik typ wartości jest poprawny.
Len
zwróci długość łańcucha.
- Długość odbiornika łańcucha znaków.
rule DoSomething "Do something when string length is sufficient" {
when
Fact.Name.Len() > "ATextConstant".Len()
then
Fact.DoSomething();
}
Polecenie Compare
porówna łańcuch odbiorcy z argumentem.
string
Łańcuch do porównania
< 0
jeśli odbiornik jest mniejszy od argumentu0
jeśli odbiornik jest równy argumentowi> 0
jeśli odbiornik jest większy od argumentu
rule CompareString "Do something when Fact.Text is greater than A" {
when
Fact.Text.Compare("A") > 0
then
Fact.DoSomething();
}
Contains
sprawdzi, czy jego argument jest zawarty w odbiorniku.
string
Podłańcuch do sprawdzenia w odbiorniku
true
jeśli argument jest zawarty w odbiorniku.false
jeśli argument nie jest zawarty w odbiorniku.
rule ContainString "Do something when Fact.Text is contains XXX" {
when
Fact.Text.Contains("XXX")
then
Fact.DoSomething();
}
In
sprawdzi, czy którykolwiek z argumentów jest równy odbiornikowi.
string
Zmienny argument łańcuchowy do sprawdzenia
- bolean
true
jeśli którykolwiek z argumentów jest równy odbiornikowi, lubfalse
w przeciwnym przypadku.
rule CheckArgumentIn "Do something when Fact.Text is equals to 'ABC' or 'BCD' or 'CDE' " {
when
Fact.Text.In("ABC", "BCD", "CDE")
then
Fact.DoSomething();
}
Count
policzy liczbę wystąpień argumentu w łańcuchu odbiornika.
string
Podłańcuch do policzenia w odbiorniku
- liczba wystąpień argumentu w odbiorniku.
rule CountString "Do something when Fact.Text contains 3 occurrences of 'ABC'" {
when
Fact.Text.Count("ABC") == 3
then
Fact.DoSomething();
}
HasPrefix
sprawdzi, czy łańcuch odbiornika ma określony prefiks.
string
Oczekiwany prefiks.
true
jeśli odbiornik ma dany argument jako swój przedrostek.false
jeśli odbiornik nie ma tego argumentu jako swojego przedrostka.
rule IsPrefixed "Do something when Fact.Text started with PREF" {
when
Fact.Text.HasPrefix("PREF")
then
Fact.DoSomething();
}
HasSuffix
sprawdzi, czy łańcuch odbiornika ma określony sufiks.
string
Oczekiwany sufiks.
true
jeśli odbiornik ma dany argument jako swój sufiks.false
, jeśli odbiornik nie ma tego argumentu jako przyrostka.
rule IsSuffixed "Do something when Fact.Text ends with SUFF" {
when
Fact.Text.HasSuffix("SUFF")
then
Fact.DoSomething();
}
Index
zwróci indeks pierwszego wystąpienia argumentu w łańcuchu odbiornika.
string
Podłańcuch do wyszukania.
- Wartość indeksu pierwszego wystąpienia argumentu.
rule IndexCheck "Do something when Fact.Text ABC occurs as specified" {
when
Fact.Text.Index("ABC") == "abABCabABC".Index("ABC")
then
Fact.DoSomething();
}
LastIndex
zwróci indeks ostatniego wystąpienia argumentu w łańcuchu odbiornika.
string
Podłańcuch do wyszukania.
- Indeks ostatniego wystąpienia argumentu.
rule LastIndexCheck "Do something when Fact.Text ABC occurs in the last position as specified" {
when
Fact.Text.LastIndex("ABC") == "abABCabABC".LastIndex("ABC")
then
Fact.DoSomething();
}
Polecenie Powtórz
zwróci łańcuch zawierający n
wystąpień łańcucha odbiorcy.
int64
liczba powtórzeń
- Nowy łańcuch zawierający
n
wystąpień łańcucha odbiorcy.
rule StringRepeat "Do something when Fact.Text contains ABCABCABC" {
when
Fact.Text == "ABC".Repeat(3)
then
Fact.DoSomething();
}
Polecenie Replace
zwróci łańcuch ze wszystkimi wystąpieniami starego
zastąpionymi nowym
.
old
podłańcuch, który ma zostać zastąpiony.new
łańcuch, który chcesz zastąpić wszystkimi wystąpieniamiold
.
- Łańcuch, w którym wszystkie wystąpienia
old
w odbiorniku zostały zastąpione przeznew
.
rule ReplaceString "Do something when Fact.Text contains replaced string" {
when
Fact.Text == "ABC123ABC".Replace("123","ABC")
then
Fact.DoSomething();
}
Split
zwróci wycinek łańcucha, którego elementy są określone po podziale odbiornika przez argument string token. Token nie będzie występował w elementach wynikowego wycinka.
string
token, którego chcesz użyć do podziału odbiornika.
- Plaster zawierający fragmenty oryginalnego łańcucha podzielone przez token.
rule SplitString "Do something when Fact.Text is prefixed by 'ABC,'" {
when
Fact.Text.Split(",")[0] == "ABC"
then
Fact.DoSomething();
}
ToLower
zwróci łańcuch, którego zawartość stanowią wszystkie małe litery znaków w odbiorniku.
- Nowy łańcuch będący wersją odbiornika napisaną małymi literami.
rule LowerText "Do something when Fact.Text is equal to 'abc'" {
when
Fact.Text.ToLower() == "Abc".ToLower()
then
Fact.DoSomething();
}
ToUpper
zwróci łańcuch, którego zawartość stanowią wszystkie duże litery znaków znaków w odbiorniku.
- Nowy łańcuch będący wersją odbiornika napisaną dużymi literami.
rule UpperText "Do something when Fact.Text is equal to 'ABC'" {
when
Fact.Text.ToUpper() == "Abc".ToUpper()
then
Fact.DoSomething();
}
Trim
zwróci łańcuch, z którego usunięto białe spacje na obu końcach.
- Łańcuch znaków z usuniętymi białymi spacjami z początku i końca.
rule TrimText "Do something when Fact.Text is 'ABC'" {
when
Fact.Text == " Abc ".Trim().ToUpper()
then
Fact.DoSomething();
}
MatchString
MatchString informuje, czy łańcuch s zawiera dowolne dopasowanie wzorca wyrażenia regularnego. Podobne do golang MatchString
- True jeśli
regexPattern
pasuje do łańcucha s - False, jeśli
regexPattern
nie pasuje do łańcucha s.
rule MatchStringText "Return true when regex pattern matches the string" {
when
Fact.Text.MatchString("B([a-z]+)ck")
then
Fact.DoSomething();
}
Len
zwróci długość tablicy/plastra.
- Długość tablicy/układu.
rule DoSomething "Do something when array length is sufficient" {
when
Fact.ChildrenArray.Len() > 2
then
Fact.DoSomething();
}
Polecenie Append
powoduje dołączenie val
na końcu tablicy odbiorników.
val
wartość, która ma być dołączona.
rule DoSomething "Add a new child when the array has less than 2 children" {
when
Fact.ChildrenArray.Len() < 2
then
Fact.ChildrenArray.Append(Fact.NewChild());
}
Len
zwróci długość mapy.
- Długość odbiornika mapy.
rule DoSomething "Do something when map length is sufficient" {
when
Fact.ChildrenMap.Len() > 2
then
Fact.DoSomething();
}
Wszystkie funkcje dostępne z poziomu DataContext są nieodwołalne z poziomu reguły, zarówno w zakresie "When" jak i "Then".
Możesz tworzyć funkcje, których odbiorcą jest Twój Fakt, a funkcje te mogą być wywoływane z poziomu GRL.
Na przykład. Podane:
type MyPoGo struct {
}
func (p *MyPoGo) GetStringLength(sarg string) int {
return len(sarg)
}
func (p *MyPoGo) AppendString(aString, subString string) string {
return sprintf("%s%s", aString, subString)
}
Użytkownik może wywoływać zdefiniowane metody:
dctx := grule.context.NewDataContext()
dctx.Add("Pogo", &MyPoGo{})
rule "If it's possible to Groool, Groool" {
when
Pogo.GetStringLength(some.variable) < 100
then
some.variable = Pogo.AppendString(some.variable, "Groooling");
}
W funkcjach niestandardowych obsługiwane są argumenty zmienne.
func (p *MyPoGo) GetLongestString(strs... string) string {
var longestStr string
for _, s := range strs {
if len(s) > len(longestStr) {
longestStr = s
}
}
return longestStr
}
Funkcję tę można następnie wywołać z wnętrza reguły, podając zero lub więcej wartości dla argumentu variadic.
when
Pogo.GetStringLength(some.variable) < 100
then
some.longest = Pogo.GetLongestString(some.stringA, some.stringB, some.stringC);
Ponieważ możliwe jest podanie wartości zerowych w celu spełnienia argumentu variadic, można je również wykorzystać do symulacji parametrów opcjonalnych.
func (p *MyPoGo) AddTax(cost int64, optionalTaxRate... float64) int64 {
var taxRate float64 = 0.2
if len(optionalTaxRate) > 0 {
taxRate = optionalTaxRate[0]
}
return cost * (1+taxRate)
}
when
Pogo.IsTaxApplied() == false
then
some.cost = Pogo.AddTax(come.cost);
//or
when
Pogo.IsTaxApplied() == false
then
some.cost = Pogo.AddTax(come.cost, 0.15);
Gdy tworzysz własną funkcję, która ma być wywoływana z silnika reguł, musisz znać następujące prawa:
- Funkcja musi być widoczna, co oznacza, że funkcje muszą zaczynać się od dużej litery. Funkcje prywatne nie mogą być wykonywane.
- Funkcja musi zwracać tylko jeden typ wartości. Zwracanie wielu wartości z funkcji nie jest obsługiwane, a wykonanie reguły nie powiedzie się, jeśli zwróconych zostanie wiele wartości.
- Sposób traktowania literałów liczbowych w GRL Grule'a jest taki, że integer zawsze będzie traktowany jako typ
int64
, a real jakofloat64
, dlatego zawsze musisz odpowiednio zdefiniować swoje typy liczbowe.