So unlike Jess, Drools can or cannot use asserted facts from a data structure and can only
use data wrapped in a bean?
/* Assert ordered or unordered facts from the session's document. A deftemplate with
matching
* id and slots for each "fact" element should already exist for unordered
facts.
*/
public void assertDocument(Document document, Rete engine) throws JessException {
Iterator facts = (document.getRootElement().getChildren("fact")).iterator();
while (facts.hasNext() == true) {
Element factElement = (Element)facts.next();
String id = factElement.getAttributeValue("id");
Fact fact = new Fact(id, engine);
Iterator slots = (factElement.getChildren("slot")).iterator();
while (slots.hasNext() == true) {
Element slotElement = (Element)slots.next();
String name = slotElement.getAttributeValue("name");
String type = slotElement.getAttributeValue("type");
if (slotElement.getChildren("value").size() == 1) {
String value = slotElement.getChild("value").getText();
fact.setSlotValue(name, getValue(type, value));
}
else {
ValueVector valueVector = new ValueVector();
Iterator values = (slotElement.getChildren("value")).iterator();
while (values.hasNext() == true) {
String value = ((Element)values.next()).getText();
valueVector.add(getValue(type, value));
}
fact.setSlotValue(name, new Value(valueVector, RU.LIST));
}
} //while slots
engine.assertFact(fact);
} //while facts
}
/*
* Output the fact base to the response output stream.
* Intended for debugging. Override to do your own processing.
*/
public String processResults(HttpServletRequest request, HttpServletResponse response,
Rete engine) throws IOException {
PrintWriter writer = response.getWriter();
writer.println("<html><head><title>Jess
Results</title></head>");
writer.println("<body><h1>PrettyPrint listFacts()</h1>");
writer.println("<pre>");
Iterator facts = engine.listFacts();
while (facts.hasNext() == true) {
Fact fact = (Fact)facts.next();
writer.println(new PrettyPrinter(fact));
}
writer.println("</pre>");
writer.println("</body></html>");
return null;
}
private Value getValue(String type, String value) throws JessException {
if ("STRING".equals(type) == true)
return new Value(value, RU.STRING);
else if ("INTEGER".equals(type) == true)
return new Value(Integer.parseInt(value), RU.INTEGER);
else if ("FLOAT".equals(type) == true)
return new Value(Float.parseFloat(value), RU.FLOAT);
else if ("SYMBOL".equals(type) == true)
return new Value(value, RU.SYMBOL);
else if ("LONG".equals(type) == true)
return new Value(Long.parseLong(value), RU.LONG);
else
return new Value(value, RU.ANY);
}
On Sep 10, 2010, at 11:18 AM, Wolfgang Laun wrote:
So everthing is String or list of String? (What if your data contains
numbers, where you'd like to use > in patterns?)
Is there a stable relationship between key/slot and its type, i.e., scalar String or list
of String?
You realize that a record of untyped fields (slots) is fundamentally different from an
approach where data is bound to be stored in (necessarily) strongly typed fields of an
object. There's no difficulty with writing similar code for storing values from a Map
into an object of some class, but class fields must have fixed types.
-W
2010/9/10 Donald Winston <satchwinston(a)yahoo.com>
This is what I'm doing:
/* Assert unordered facts from the request parameter map. A deftemplate with matching id
and
* slots should already exist.
*/
public void assertParameterMap(String id, Map map, Rete engine) throws JessException {
Fact fact = new Fact(id, engine);
Iterator keys = map.keySet().iterator();
while (keys.hasNext() == true) {
String key = (String)keys.next();
if (ID.equals(key) == true) continue;
String[] paramValues = (String[])map.get(key);
if (paramValues.length > 1) {
ValueVector values = new ValueVector();
for(String value : paramValues)
values.add(new Value(value, RU.STRING));
fact.setSlotValue(key, new Value(values, RU.LIST));
}
else
fact.setSlotValue(key, new Value(paramValues[0], RU.STRING));
}
engine.assertFact(fact);
}
I'm working on something similar for a jdom document object. I'm not using POJOs.
I'm using a data structure. (technically they're objects because java is object
oriented, but they're not "problem domain objects").
On Sep 10, 2010, at 10:12 AM, Wolfgang Laun wrote:
> If you insert POJOs as facts in Jess, you'll have to write a
> (deftemplace X (declare (from-class X)))
> and the fields available for pattern matching in rules rely on the JavaBeans
convention.
>
> I have (quite successfully) used POJOs resulting from unmarshalling an XML document
(via JAXB) as facts, both in Drools and in Jess; most certainly without writing any
"copycat" fact classes and tedious transformations.
>
> As for globals: They play the same role in Drools as in Jess; in neither system are
they part of the working memory.
>
> I don't know what you could mean by a "standard fact class".
>
> As for iterating over all fact objects in Drools' WM, Drools provides
getObjects() in WorkingMemory; or you could set up a query and run this.
>
> -W
>
>
> On 10 September 2010 14:54, Donald Winston <satchwinston(a)yahoo.com> wrote:
> I'm reviewing JBoss Rules (Drools) for an application I'm starting to build.
It appears that the only way to assert facts is to use the insert(Object) method where the
object is a bean using the proper naming conventions for it's properties. There also
appears to be a way to use arbitrary objects using globals but do these end up in the fact
base? It's disturbing to me that I have to create a bunch of classes whose sole
purpose in life is to support the rule base. This is similar to using java server pages
and having to create a bunch of classes just to support each page. That's why I
don't use java server pages and use xsl transformations instead. I want to use my xml
jdom document to represent my data and not have to create a bunch of beans. I can't
seem to find anything in the api where I can assert facts without creating my own custom
classes. There's no standard Fact class?
>
> I've been also experimenting with Jess and it provides an easy way for me to do
this. I just iterate through my jdom document and create Fact objects and assert them. I
can then execute the rules and then iterate through the updated fact base using
engine.listFacts() and update my jdom document. It couldn't be easier or more natural.
Is there an analogous way to do this in Drools?
>
>
> Thank you very much.
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users