>This would be a wonderful improvement.  So each leaf node would be a
>condition (i.e. a field name and a value), and each non-leaf node would
>be an operator (e.g. AND or OR).  So far, this sounds good.  Now how
>about adding operators like XOR.  I could see that working, but in
>practice, XOR probably wouldn't be so useful... rather you might want a
>custom operator that says "return True iff exactly one of an entire
>group of conditions is true".  I don't think it would be possible to
>implement this type of operator using a strictly binary tree... it would
>need to be a tree structure that allows for more than two child nodes. 
>This would also make the internal representation more similar to the way
>it would be displayed in the GUI (where a binary tree would require a
>slightly different internal representation).  If I'm not clear on this
>point, I can write up an example.
>

        I think i have got it:
        
        It is possible to extend expression types to include
        an N peer boolean expression that contains a list of
        expressions and applies the same operator to each.
        
        Like a 'flatened' part of a binary tree:
        'if (a | b | c | d)' instead of 'if (a | (b | (c | d)))'

        (There are probably logical precedence rules to automatically
        work out this sort of thing from a binary tree and group
        leaf nodes. I bet its a one liner is lisp!).

        Attached is some idl, does this 'express' a boolean
        expression model for the GUI use cases you and
        Matthew have 'expressed'?


Paul.

| ? + ? = To question
----------------\
   Paul Sandoz
        x19219
+353-1-8199219
 

// BooleanExpression type, marker for boolean expressions
//
interface nsIBooleanExpression
{
};

// Condition type, marker for conditions
//
// leaf node
//
interface nsIBooleanCondition : nsIBooleanExpression
{
};

// String match condition
//
interface nsIStringMatch : nsIBooleanCondition
{
        .
        .
        .
};

interface nsIBooleanExpressionOperation : nsIBooleanExpression
{
        attribute long operator;
};

// Unary node
//
interface nsIBooleanExpressionUnary : nsIBooleanExpressionOperation
{
        attribute nsIBooleanExpression expression;
};


// Binary node
//
interface nsIBooleanExpressionBinary : nsIBooleanExpressionOperation
{
        attribute nsIBooleanExpression leftHandExpression;
        attribute nsIBooleanExpression rightHandExpression;
};

// NPeer node
//
interface nsIBooleanExpressionNPeer : nsIBooleanExpressionOperation
{
        // nsISupportsArray<BooleanExpression>
        //
        attribute nsISupportsArray peerExpressions;
};

Reply via email to