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 <[email protected]>
> 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 <[email protected]> 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
>> [email protected]
>> https://lists.jboss.org/mailman/listinfo/rules-users
>> 
>> _______________________________________________
>> rules-users mailing list
>> [email protected]
>> https://lists.jboss.org/mailman/listinfo/rules-users
> 
> 
> _______________________________________________
> rules-users mailing list
> [email protected]
> https://lists.jboss.org/mailman/listinfo/rules-users
> 
> 
> _______________________________________________
> rules-users mailing list
> [email protected]
> https://lists.jboss.org/mailman/listinfo/rules-users

_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to