This is an automated email from the ASF dual-hosted git repository.

tkobayas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new 4036d97e5c [incubator-kie-drools-5961] DSL Constraints Don't Work With 
OOPath (#6066)
4036d97e5c is described below

commit 4036d97e5cf5159c56648848c83d24b113ed60f6
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Fri Sep 6 18:09:20 2024 +0900

    [incubator-kie-drools-5961] DSL Constraints Don't Work With OOPath (#6066)
    
    - At the moment, RuleUnit OOPath doesn't support DSL. Removed confusing doc 
section
---
 .../pages/language-reference/_DSL-section.adoc     | 417 ---------------------
 .../ROOT/pages/language-reference/index.adoc       |   2 -
 2 files changed, 419 deletions(-)

diff --git 
a/drools-docs/src/modules/ROOT/pages/language-reference/_DSL-section.adoc 
b/drools-docs/src/modules/ROOT/pages/language-reference/_DSL-section.adoc
deleted file mode 100644
index 6adfcd0c2d..0000000000
--- a/drools-docs/src/modules/ROOT/pages/language-reference/_DSL-section.adoc
+++ /dev/null
@@ -1,417 +0,0 @@
-////
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
-////
-
-= Domain Specific Languages
-
-
-(((Domain Specific Languages)))
-Domain Specific Languages (or DSLs) are a way of creating a rule language that 
is dedicated to your problem domain.
-A set of DSL definitions consists of transformations from DSL "sentences" to 
DRL constructs, which lets you use of all the underlying rule language and 
engine features.
-Given a DSL, you write rules in DSL rule (or DSLR) files, which will be 
translated into DRL files.
-
-DSL and DSLR files are plain text files, and you can use any text editor to 
create and modify them.
-But there are also DSL and DSLR editors, both in the IDE as well as in the web 
based BRMS, and you can use those as well, although they may not provide you 
with the full DSL functionality. 
-
-== When to Use a DSL
-
-
-DSLs can serve as a layer of separation between rule authoring (and rule 
authors) and the technical intricacies resulting from the modelling of domain 
object and the {RULE_ENGINE}'s native language and methods.
-If your rules need to be read and validated by domain experts (such as 
business analysts, for instance) who are not programmers, you should consider  
using a DSL; it hides implementation details and focuses on the rule logic 
proper.
-DSL sentences can also act as "templates" for conditional elements and 
consequence actions that are used repeatedly in your rules, possibly with minor 
variations.
-You may define DSL sentences as being mapped to these repeated phrases, with 
parameters providing a means for accommodating those variations.
-
-DSLs have no impact on the {RULE_ENGINE} at runtime, they are just a compile 
time feature, requiring a special parser and transformer.
-
-== DSL Basics
-
-
-The Drools DSL mechanism allows you to customise conditional expressions and 
consequence actions.
-A global substitution mechanism ("keyword") is also available.
-
-.Example (((DSL))) DSL mapping
-====
-[source]
-----
-[when]Something is {colour}=Something(colour=="{colour}")
-----
-====
-
-
-In the preceding example, `[when]` indicates the scope of the expression, 
i.e., whether it is valid for the LHS or the RHS of a rule.
-The part after the bracketed keyword is the expression that you use in the 
rule; typically a natural language expression, but it doesn't have to be.
-The part to the right of the equal sign ("=") is the mapping of the expression 
into the rule language.
-The form of this string depends on its destination, RHS or  LHS.
-If it is for the LHS, then it ought to be a term according to the regular LHS 
syntax; if it is for the RHS then it might be a Java statement.
-
-Whenever the DSL parser matches a line from the rule file written in the DSL 
with an expression in the DSL definition, it performs three steps of string 
manipulation.
-First, it extracts the string values appearing where the expression contains 
variable names in braces (here: ``\{colour}``). Then, the values obtained from 
these captures are then interpolated wherever that name, again enclosed in 
braces, occurs on the right hand side of the mapping.
-Finally, the interpolated string replaces whatever was matched by the entire 
expression in the line of the DSL rule file.
-
-Note that the expressions (i.e., the strings on the left hand side of the 
equal sign) are used as regular expressions in a pattern matching operation 
against a line of the DSL rule file, matching all or part of a line.
-This means you can use (for instance) a '?' to indicate that the preceding 
character is optional.
-One good reason to use this is to overcome variations in natural language 
phrases of your DSL.
-But, given that these expressions are regular expression patterns, this also 
means that all "magic" characters of Java's pattern syntax have to be escaped 
with a preceding backslash ('\').
-
-It is important to note that the compiler transforms DSL rule files line by 
line.
-In the previous example, all the text after "Something is " to the end of the 
line is captured as the replacement value for "\{colour}", and this is used for 
interpolating the target string.
-This may not be exactly what you want.
-For instance, when you intend to merge different DSL expressions to generate a 
composite DRL pattern, you need to transform a DSLR line in several independent 
operations.
-The best way to achieve this is to ensure that the captures are surrounded by 
characteristic text - words or  even single characters.
-As a result, the matching operation done by the parser plucks out a substring 
from  somewhere within the line.
-In the example below, quotes are used as  distinctive characters.
-Note that the characters that surround the capture are not included during 
interpolation, just the contents between them.
-
-As a rule of thumb, use quotes for textual data that a rule editor may want to 
enter.
-You can also enclose the capture with words to ensure that the text is 
correctly matched.
-Both is illustrated by the following example.
-Note that a single line such as `Something is "green" and
-    another solid thing` is now correctly expanded.
-
-.Example with quotes
-====
-[source]
-----
-[when]something is "{colour}"=Something(colour=="{colour}")
-[when]another {state} thing=OtherThing(state=="{state})"
-----
-====
-
-
-It is a good idea to avoid punctuation (other than quotes or apostrophes) in 
your DSL expressions as much as possible.
-The main reason is that punctuation is easy to forget for rule authors using 
your DSL.
-Another reason is that parentheses, the period and the question mark are magic 
characters, requiring escaping in the DSL definition.
-
-In a DSL mapping, the braces "{" and "}" should only be used to enclose a 
variable definition or reference, resulting in a capture.
-If they should occur literally, either in the expression or within the 
replacement text on the right hand side, they must be escaped with a preceding 
backslash ("\"):
-
-[source]
-----
-[then]do something= if (foo) \{ doSomething(); \}
-----
-
-[NOTE]
-====
-If braces "{" and "}" should appear in the replacement string of a DSL 
definition, escape them with a backslash ('\').
-====
-
-.Examples of DSL mapping entries
-====
-[source]
-----
-# This is a comment to be ignored.
-[when]There is a person with name of "{name}"=Person(name=="{name}")
-[when]Person is at least {age} years old and lives in "{location}"=
-      Person(age >= {age}, location=="{location}")
-[then]Log "{message}"=System.out.println("{message}");
-[when]And = and
-----
-====
-
-
-Given the above DSL examples, the following examples show the expansion of 
various DSLR snippets:
-
-.Examples of DSL expansions 
-====
-[source]
-----
-There is a person with name of "Kitty"
-   ==> Person(name="Kitty")
-Person is at least 42 years old and lives in "Atlanta"
-   ==> Person(age >= 42, location="Atlanta")
-Log "boo"
-   ==> System.out.println("boo");
-There is a person with name of "Bob" And Person is at least 30 years old and 
lives in "Utah"
-   ==> Person(name="Bob") and Person(age >= 30, location="Utah")
-----
-====
-
-[NOTE]
-====
-Don't forget that if you are capturing plain text from a DSL rule line and 
want to use it as a string literal in the expansion, you must provide the 
quotes on the right hand side of the mapping.
-====
-
-
-You can chain DSL expressions together on one line, as long as it is clear to 
the parser where one ends and the next one begins and where the text 
representing a parameter ends.
-(Otherwise you risk getting all the text until the end of the line as a 
parameter value.) The DSL expressions are tried, one after the other, according 
to their order in the DSL definition file.
-After any match, all remaining DSL expressions are investigated, too.
-
-The resulting DRL text may consist of more than one line.
-Line ends are in the replacement text are written as ``\n``.
-
-== Adding Constraints to Facts
-
-
-A common requirement when writing rule conditions is to be able to add an 
arbitrary combination of constraints to a pattern.
-Given that a fact type may have many fields, having to provide an individual 
DSL statement for each combination would be plain folly.
-
-The DSL facility allows you to add constraints to a pattern by a simple 
convention: if your DSL expression starts with a hyphen (minus character, "-") 
it is assumed to be a field constraint and, consequently, is is added to the 
last pattern line preceding it.
-
-For an example, lets take look at class ``Cheese``, with the following fields: 
type, price, age and country.
-We can express some LHS condition in normal DRL like the following
-
-[source]
-----
-Cheese(age < 5, price == 20, type=="stilton", country=="ch")
-----
-
-
-The DSL definitions given below result in three DSL phrases which may be used 
to create any combination of constraint involving these fields.
-
-[source]
-----
-[when]There is a Cheese with=Cheese()
-[when]- age is less than {age}=age<{age}
-[when]- type is '{type}'=type=='{type}'
-[when]- country equal to '{country}'=country=='{country}'
-----
-
-
-You can then write rules with conditions like the following: 
-[source]
-----
-There is a Cheese with
-        - age is less than 42
-        - type is 'stilton'
-----
- The parser will pick up a line beginning with "-" and add it as a constraint 
to  the preceding pattern, inserting a comma when it is required.
-For the preceding example, the resulting DRL is: 
-[source]
-----
-Cheese(age<42, type=='stilton')
-----
-
-Combining all numeric fields with all relational operators (according to the 
DSL expression "age is less than..." in the preceding example) produces an 
unwieldy amount of DSL entries.
-But you can define DSL phrases for the various operators and even a generic 
expression that handles any field constraint, as shown below.
-(Notice that the expression definition contains a regular expression in 
addition to the variable name.)
-
-[source]
-----
-[when][]is less than or equal to=<=
-[when][]is less than=<
-[when][]is greater than or equal to=>=
-[when][]is greater than=>
-[when][]is equal to===
-[when][]equals===
-[when][]There is a Cheese with=Cheese()
-[when][]- {field:\w*} {operator} {value:\d*}={field} {operator} {value}
-----
-
-
-Given these DSL definitions, you can write rules with conditions such as:
-
-[source]
-----
-There is a Cheese with
-   - age is less than 42
-   - rating is greater than 50
-   - type equals 'stilton'
-----
-
-
-In this specific case, a phrase such as "is less than" is replaced by ``<``, 
and then the line matches the last DSL entry.
-This removes the hyphen, but the final result is still added as a constraint 
to the preceding pattern.
-After processing all of the lines, the resulting DRL text is:
-
-[source]
-----
-Cheese(age<42, rating > 50, type=='stilton')
-----
-
-[NOTE]
-====
-The order of the entries in the DSL is important if separate DSL expressions 
are intended to match the same line, one after the other.
-====
-
-== Developing a DSL
-
-
-A good way to get started is to write representative samples of the rules your 
application requires, and to test them as you develop.
-This will provide you with a stable framework of conditional elements and 
their constraints.
-Rules, both in DRL and in DSLR, refer to entities according to the data model 
representing the application data that should be subject to the reasoning 
process defined in rules.
-Notice that writing rules is generally easier if most of the data model's 
types are facts.
-
-Given an initial set of rules, it should be possible to identify recurring or 
similar code snippets and to mark variable parts as parameters.
-This provides reliable leads as to what might be a handy DSL entry.
-Also, make sure you have a full grasp of the jargon the  domain experts are 
using, and base your DSL phrases on this vocabulary.
-
-You may postpone implementation decisions concerning conditions and actions 
during this first design phase by leaving certain conditional elements and 
actions in their DRL form by prefixing a line with a greater sign (">"). (This 
is also handy for inserting debugging statements.)
-
-During the next development phase, you should find that the DSL configuration 
stabilizes pretty quickly.
-New rules can be written by reusing the existing DSL definitions, or by adding 
a parameter to an existing condition or consequence entry.
-
-Try to keep the number of DSL entries small.
-Using parameters lets you apply the same DSL sentence for similar rule 
patterns or constraints.
-But do not exaggerate: authors using the DSL should still be able to identify 
DSL phrases by some fixed text.
-
-== DSL and DSLR Reference
-
-
-A DSL file is a text file in a line-oriented format.
-Its entries are used for transforming a DSLR file into a file according to DRL 
syntax.
-
-* A line starting with "\#" or "//" (with or without preceding white space) is 
treated as a comment. A comment line starting with "#/" is scanned for words 
requesting a debug option, see below.
-* Any line starting with an opening bracket ("[") is assumed to be the first 
line of a DSL entry definition.
-* Any other line is appended to the preceding DSL entry definition, with the 
line end replaced by a space.
-
-
-A DSL entry consists of the following four parts:
-
-* A scope definition, written as one of the keywords "when" or "condition", 
"then" or "consequence", "*" and "keyword", enclosed in brackets ("[" and "]"). 
This indicates whether the DSL entry is valid for the condition or the 
consequence of a rule, or both. A scope indication of "keyword" means that the 
entry has global significance, i.e., it is recognized anywhere in a DSLR file.
-* A type definition, written as a Java class name, enclosed in brackets. This 
part is optional unless the next part begins with an opening bracket. An empty 
pair of brackets is valid, too.
-* A DSL expression consists of a (Java) regular expression, with any number of 
embedded _variable definitions,_ terminated by an equal sign ("="). A variable 
definition is enclosed in braces ("{" and "}"). It consists of a variable name 
and two optional attachments, separated by colons (":"). If there is one 
attachment, it is a regular expression for matching text that is to be assigned 
to the variable; if there are two attachments, the first one is a hint for the 
GUI editor and the seco [...]
-+ 
-Note that all characters that are "magic" in regular expressions must be 
escaped with a preceding backslash ("\") if they should occur literally within 
the expression.
-* The remaining part of the line after the delimiting equal sign is the 
replacement text for any DSLR text matching the regular expression. It may 
contain variable references, i.e., a variable name enclosed in braces. 
Optionally, the variable name may be followed by an exclamation mark ("!") and 
a transformation function, see below.
-+ 
-Note that braces ("{" and "}") must be escaped with a preceding backslash 
("\") if they should occur literally within the replacement string.
-
-
-Debugging of DSL expansion can be turned on, selectively, by using a comment 
line starting with "#/" which may contain one or more words from the table 
presented below.
-The resulting output is written to standard output.
-
-.Debug options for DSL expansion
-[cols="1,1", options="header"]
-|===
-| Word
-| Description
-
-|result
-|Prints the resulting DRL text, with line numbers.
-
-|steps
-|Prints each expansion step of condition and consequence
-            lines.
-
-|keyword
-|Dumps the internal representation of all DSL entries with
-            scope "keyword".
-
-|when
-|Dumps the internal representation of all DSL entries with
-            scope "when" or "*".
-
-|then
-|Dumps the internal representation of all DSL entries with
-            scope "then" or "*".
-
-|usage
-|Displays a usage statistic of all DSL entries.
-|===
-
-
-Below are some sample DSL definitions, with comments describing the language 
features they illustrate.
-
-[source]
-----
-# Comment: DSL examples
-
-#/ debug: display result and usage
-
-# keyword definition: replaces "regula" by "rule"
-[keyword][]regula=rule
-
-# conditional element: "T" or "t", "a" or "an", convert matched word
-[when][][Tt]here is an? {entity:\w+}=
-        ${entity!lc}: {entity!ucfirst} ()
-
-# consequence statement: convert matched word, literal braces
-[then][]update {entity:\w+}=modify( ${entity!lc} )\{ \}
-----
-
-
-The transformation of a DSLR file proceeds as follows:
-
-. The text is read into memory.
-. Each of the "keyword" entries is applied to the entire text. First, the 
regular expression from the keyword definition is modified by replacing white 
space sequences with a pattern matching any number of white space characters, 
and by replacing variable definitions with a capture made from the regular 
expression provided with the definition, or with the default (".*?"). Then, the 
DSLR text is searched exhaustively for occurrences of strings matching the 
modified regular expression. Sub [...]
-. Sections of the DSLR text between "when" and "then", and "then" and "end", 
respectively, are located and processed in a uniform manner, line by line, as 
described below.
-+ 
-For a line, each DSL entry pertaining to the line's section is taken in turn, 
in the order it appears in the DSL file.
-Its regular expression part is modified: white space is replaced by a pattern 
matching any number of white space characters; variable definitions with a 
regular expression are replaced by a capture with this regular expression, its 
default being ".*?". If the resulting regular expression matches all or part of 
the line, the matched part is replaced by the suitably modified replacement 
text.
-+ 
-Modification of the replacement text is done by replacing variable references 
with the text corresponding to the regular expression capture.
-This text may be modified according to the string transformation function 
given in the variable reference; see below for details.
-+ 
-If there is a variable reference naming a variable that is not defined in the 
same entry, the expander substitutes a value bound to a variable of that name, 
provided it was defined in one of the preceding lines of the current rule.
-. If a DSLR line in a condition is written with a leading hyphen, the expanded 
result is inserted into the last line, which should contain a pattern CE, i.e., 
a type name followed by a pair of parentheses. if this pair is empty, the 
expanded line (which should contain a valid constraint) is simply inserted, 
otherwise a comma (",") is inserted beforehand.
-+ 
-If a DSLR line in a consequence is written with a leading hyphen, the expanded 
result is inserted into the last line, which should contain a "modify" 
statement, ending in a pair of braces ("{" and "}"). If this pair is empty, the 
expanded line (which should contain a valid method call) is simply inserted, 
otherwise a comma (",") is inserted beforehand. 
-
-
-[NOTE]
-====
-It is currently _not_ possible to use a line with a leading hyphen to insert 
text into other conditional element forms (e.g., "accumulate") or it may only 
work for the first insertion (e.g., "eval").
-====
-
-
-All string transformation functions are described in the following table.
-
-.String transformation functions
-[cols="1,1", options="header"]
-|===
-| Name
-| Description
-
-|uc
-|Converts all letters to upper case.
-
-|lc
-|Converts all letters to lower case.
-
-|ucfirst
-|Converts the first letter to upper case, and
-            all other letters to lower case.
-
-|num
-|Extracts all digits and "-" from the string. If the
-            last two digits in the original string are preceded by "." or
-            ",", a decimal period is inserted in the corresponding position.
-
-|__a__?__b__/__c__
-|Compares the string with string __a__, and if they
-            are equal, replaces it with __b__, otherwise with
-            __c__. But _c_ can be another triplet
-            __a__, __b__, __c__, so
-            that the entire structure is, in fact, a translation table.
-|===
-
-
-The following DSL examples show how to use string transformation functions.
-
-[source]
-----
-# definitions for conditions
-[when][]There is an? {entity}=${entity!lc}: {entity!ucfirst}()
-[when][]- with an? {attr} greater than {amount}={attr} <= {amount!num}
-[when][]- with a {what} {attr}={attr} 
{what!positive?>0/negative?%lt;0/zero?==0/ERROR}
-----
-
-
-A file containing a DSL definition has to be put under the resources folder or 
any of its subfolders like any other drools artifact.
-It must have the extension ``$$.$$dsl``, or alternatively be marked with type 
``ResourceType.DSL``.
-when programmatically added to a ``KieFileSystem``.
-For a file using DSL definition, the extension `$$.$$dslr` should be used, 
while it can be added to a `KieFileSystem` with type ``ResourceType.DSLR``.
-
-For parsing and expanding a DSLR file the DSL configuration is read and 
supplied to the parser.
-Thus, the parser can "recognize" the DSL expressions and transform them into 
native rule language expressions.
-
-ifdef::backend-docbook[]
-[index]
-== Index
-// Generated automatically by the DocBook toolchain.
-endif::backend-docbook[]
diff --git a/drools-docs/src/modules/ROOT/pages/language-reference/index.adoc 
b/drools-docs/src/modules/ROOT/pages/language-reference/index.adoc
index b468a9ebac..95de660cfd 100644
--- a/drools-docs/src/modules/ROOT/pages/language-reference/index.adoc
+++ b/drools-docs/src/modules/ROOT/pages/language-reference/index.adoc
@@ -28,6 +28,4 @@ include::_drl-rules.adoc[leveloffset=+1]
 
 include::_performance-tuning-drl-ref.adoc[leveloffset=+2]
 
-include::_DSL-section.adoc[leveloffset=+1]
-
 include::_XLSDecisionTable-section.adoc[leveloffset=+1]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to