Java源码示例:org.kie.api.runtime.rule.FactHandle

示例1
@Test
public void testApplyBlockerFirst() {
    KieSession ksession = getStatefulKnowledgeSession();

    List list = new ArrayList();
    ksession.setGlobal( "list",
                        list );
    FactHandle go2 = ksession.insert( "go2" );
    //((InternalWorkingMemory) ksession).flushPropagations();
    FactHandle go1 = ksession.insert( "go1" );
    ksession.fireAllRules();

    assertEquals( 1,
                  list.size() );
    assertTrue( list.contains( "rule1:go2" ) );

    list.clear();

    ksession.retract( go2 );
    ksession.fireAllRules();

    assertEquals( 1,
                  list.size() );
    assertTrue( list.contains( "rule1:go1" ) );
}
 
示例2
private void verifyThatCollectionContainsTheseFactHandle(HashSet<String> factSet, Object collection) { 
    factSet = (HashSet<String>) factSet.clone();
    if( collection instanceof Collection<?> ) { 
        Collection<FactHandle> factHandles = (Collection<FactHandle>) collection;
        assertTrue(! factHandles.isEmpty());
        assertTrue(factHandles.size() == factSet.size(), factSet.size() + "inserted but only " + factHandles.size() + " facts retrieved");
        Object [] internalFactHandles = factHandles.toArray();
        for( int i = 0; i < internalFactHandles.length; ++i ) { 
            Object factObject = ((InternalFactHandle) internalFactHandles[i]).getObject();
            assertTrue(factSet.contains(factObject));
            factSet.remove(factObject);
        }
        assertTrue( factSet.isEmpty(), "Additional facts found that weren't inserted.");
    }
    else { 
        fail("result of command was NOT a collection of FactHandles"); 
    }
}
 
示例3
private void check( String drl, int fire1, int fire2 ) {
    KieSession kieSession = new KieHelper().addContent( drl, ResourceType.DRL ).build().newKieSession();

    A a1 = new A();
    A a2 = new A();

    FactHandle fhA1 = kieSession.insert( a1 );
    FactHandle fhA2 = kieSession.insert( a2 );
    kieSession.insert( "xxx" );

    assertEquals( fire1, kieSession.fireAllRules() );

    a1.setB( null );
    kieSession.update( fhA1, a1 );

    a2.setB( new B( null ) );
    kieSession.update( fhA2, a2 );

    assertEquals( fire2, kieSession.fireAllRules() );
}
 
示例4
private void checkKieSession(KieSession ksession) {
    final List<String> events = new ArrayList<String>();

    ksession.setGlobal("events", events);

    // phase 1
    Room room1 = new Room("Room 1");
    ksession.insert(room1);
    FactHandle fireFact1 = ksession.insert(new Fire(room1));
    ksession.fireAllRules();
    assertEquals(1, events.size());

    // phase 2
    Sprinkler sprinkler1 = new Sprinkler(room1);
    ksession.insert(sprinkler1);
    ksession.fireAllRules();
    assertEquals(2, events.size());

    // phase 3
    ksession.delete(fireFact1);
    ksession.fireAllRules();
    assertEquals(5, events.size());
}
 
示例5
@Test
public void testModifyRetractWithFunction() throws Exception {
    final KieBase kbase = SerializationHelper.serializeObject(loadKnowledgeBase("test_RetractModifyWithFunction.drl"));
    final KieSession ksession = createKnowledgeSession(kbase);

    final org.drools.compiler.Cheese stilton = new org.drools.compiler.Cheese("stilton", 7);
    final org.drools.compiler.Cheese muzzarella = new org.drools.compiler.Cheese("muzzarella", 9);
    final int sum = stilton.getPrice() + muzzarella.getPrice();
    final FactHandle stiltonHandle = ksession.insert(stilton);
    final FactHandle muzzarellaHandle = ksession.insert(muzzarella);

    ksession.fireAllRules();

    assertEquals(sum, stilton.getPrice());
    assertEquals(1, ksession.getFactCount());
    assertNotNull(ksession.getObject(stiltonHandle));
    assertNotNull(ksession.getFactHandle(stilton));

    assertNull(ksession.getObject(muzzarellaHandle));
    assertNull(ksession.getFactHandle(muzzarella));
}
 
示例6
private DefeasibilityStatus checkStrict(  List<? extends FactHandle> premise ) {
    // The rule is strict. To prove that the derivation is strict we have to check that all the premises are
    // either facts or strictly proved facts
    for ( FactHandle h : premise ) {
        if ( h instanceof QueryElementFactHandle ) {
            return DefeasibilityStatus.DEFINITELY;
        }
        EqualityKey key = ((InternalFactHandle) h).getEqualityKey();
        if ( key != null && key.getStatus() == EqualityKey.JUSTIFIED ) {
            //DefeasibleBeliefSet bs = (DefeasibleBeliefSet) getTruthMaintenanceSystem().getJustifiedMap().get(((DefaultFactHandle) h).getId());

            DefeasibleBeliefSet bs = (DefeasibleBeliefSet) key.getBeliefSet();


            if ( bs.getStatus() != DefeasibilityStatus.DEFINITELY ) {
                // to make a fact "definitely provable", all the supporting non-factual premises must be definitely provable.
                return DefeasibilityStatus.DEFEASIBLY;
            }
        }
        // else it's a fact, so it's a good candidate for definite entailment
    }
    return DefeasibilityStatus.DEFINITELY;
}
 
示例7
public FactHandle execute(Context context) {
    KieSession ksession = ((RegistryContext)context).lookup( KieSession.class );
    
    FactHandle factHandle;
    if ( StringUtils.isEmpty( this.entryPoint ) ) {
        factHandle = ksession.insert( object );
    } else {
        factHandle = ksession.getEntryPoint( this.entryPoint ).insert( object );
    }

    if ( outIdentifier != null ) {
        if ( this.returnObject ) {
            ((RegistryContext) context).lookup( ExecutionResultImpl.class ).setResult( this.outIdentifier, object );
        }
        ((RegistryContext) context).lookup( ExecutionResultImpl.class ).getFactHandles().put( this.outIdentifier, factHandle );
    }

    if ( disconnected ) {
        DefaultFactHandle disconnectedHandle = ((DefaultFactHandle)factHandle).clone();
        disconnectedHandle.disconnect();
        return disconnectedHandle;
    }
    return factHandle;
}
 
示例8
/**
 * Special comparator  that  allows FactHandles to  be  keys, but always  checks
 * equals with the  identity of the  objects involved
 */
@Override
public boolean areEqual(final Object o1,
                        Object o2) {
    if ( o1 == o2 ) {
        return true;
        
    }
    // o1 is a FactHandle, so just check their id's are the same
    if ( o1 instanceof FactHandle ) {
        return ((InternalFactHandle)o1).getId() == ((InternalFactHandle)o2).getId() ;
    }

    // o1 is an object, so unwrap o2 for comparison
    final InternalFactHandle handle = ((InternalFactHandle) o2);
    o2 = handle.getObject();
    return o1 == o2 || o2.equals( o1 );
}
 
示例9
public ObjectUpdatedEventImpl(final WorkingMemory workingMemory,
                              final PropagationContext propagationContext,
                              final FactHandle handle,
                              final Object oldObject,
                              final Object object) {
    super( ((InternalWorkingMemory) workingMemory ).getKnowledgeRuntime(), propagationContext );
    this.factHandle = handle;
    this.oldObject = oldObject;
    this.object = object;
}
 
示例10
public void update(final FactHandle handle,
                   final Object object) {
    update(handle,
           object,
           allSetButTraitBitMask(),
           Object.class,
           null);
}
 
示例11
public void update(FactHandle handle,
                   Object object,
                   String... modifiedProperties) {
    Class modifiedClass = object.getClass();

    TypeDeclaration typeDeclaration = kBase.getOrCreateExactTypeDeclaration( modifiedClass );
    BitMask mask = typeDeclaration.isPropertyReactive() ?
                   calculatePositiveMask( modifiedClass, asList(modifiedProperties), typeDeclaration.getAccessibleProperties() ) :
                   AllSetBitMask.get();

    update( (InternalFactHandle) handle, object, mask, modifiedClass, null);
}
 
示例12
private Callable<Void> getMultipleParallelKieSessionsWithUpdatesCallable(KieBase kBase) {
    return new Callable<Void>() {
        @Override public Void call() {
            KieSession ksession = kBase.newKieSession();
            assertThat(((InternalWorkingMemory) ksession).getAgenda().isParallelAgenda()).as("Parallel agenda has to be enabled").isTrue();

            List<Integer> list = new DebugList<Integer>();
            ksession.setGlobal( "list", list );

            FactHandle[] fhs = new FactHandle[10];
            fhs = insertFacts(ksession, 10);

            ksession.fireAllRules();
            assertThat(list.size()).isEqualTo(10);

            list.clear();

            for (int i = 0; i < 10; i++) {
                ksession.update( fhs[i], i );
            }

            ksession.fireAllRules();
            assertThat(list.size()).isEqualTo(10);

            return null;
        }
    };
}
 
示例13
@Override
public void delete(InternalFactHandle fh, RuleImpl rule, TerminalNode terminalNode, FactHandle.State fhState) {
    DataHandle dh = fh.getDataHandle();
    if (dh != this.handle) {
        throw new IllegalArgumentException("The given handle is not contained in this DataStore");
    }
    entryPointSubscribers.forEach(s -> s.delete(dh, rule, terminalNode, fhState));
    subscribers.forEach(s -> s.delete(dh));
    handle = null;
}
 
示例14
@Test
public void testOnDeleteMatchConsequence() throws Exception {
    String str =
            "import " + Person.class.getCanonicalName() + ";\n" +
            "rule R1 when\n" +
            "    $p : Person( age > 30 )\n" +
            "then\n" +
            "    $p.setStatus(\"in\");\n" +
            "then[$onDeleteMatch$]\n" +
            "    $p.setStatus(\"out\");\n" +
            "end\n";

    KieSession ksession = new KieHelper()
            .addContent(str, ResourceType.DRL)
            .build()
            .newKieSession();

    Person mario = new Person("Mario", 40);
    FactHandle fact = ksession.insert(mario);
    ksession.fireAllRules();

    assertEquals("in", mario.getStatus());

    ksession.delete(fact);
    ksession.fireAllRules();

    assertEquals("out", mario.getStatus());
}
 
示例15
public void update(FactHandle handle,
                   Object object,
                   String... modifiedProperties) {
    checkAlive();
    this.defaultEntryPoint.update(handle,
                                  object,
                                  modifiedProperties);
}
 
示例16
public ObjectDeletedEventImpl(final WorkingMemory workingMemory,
                               final PropagationContext propagationContext,
                               final FactHandle handle,
                               final Object object) {
    super( ((InternalWorkingMemory) workingMemory ).getKnowledgeRuntime(), propagationContext );
    this.factHandle = handle;
    this.oldbOject = object;
}
 
示例17
public FactHandle insertAsync(Object object) {
    ObjectTypeConf typeConf = getObjectTypeConfigurationRegistry().getObjectTypeConf( this.entryPoint, object );

    PropagationContext pctx = this.pctxFactory.createPropagationContext(this.wm.getNextPropagationIdCounter(),
                                                                        PropagationContext.Type.INSERTION,
                                                                        null, null, null, entryPoint);
    InternalFactHandle handle = createHandle( object, typeConf );
    pctx.setFactHandle(handle);

    this.entryPointNode.assertObject( handle, pctx, typeConf, this.wm );
    this.wm.getRuleRuntimeEventSupport().fireObjectInserted(pctx, handle, object, this.wm);
    return handle;
}
 
示例18
public List<Object> getObjects() {
    List<Object> objects = new ArrayList<Object>( this.factHandles.size() );
    for( FactHandle handle : this.factHandles ) {
        objects.add( ((InternalFactHandle)handle).getObject() );
    }
    return Collections.unmodifiableList( objects );
}
 
示例19
public void insertLogical(final Activation activation,
                          final Object object,
                          final Mode... modes ) {

    if ( !activation.isMatched() ) {
        // Activation is already unmatched, can't do logical insertions against it
        return;
    }
    // iterate to find previous equal logical insertion
    FactHandle handle = workingMemory.getTruthMaintenanceSystem().insert( object,
                                                                          modes,
                                                                          activation.getRule(),
                                                                          activation );

}
 
示例20
/**
 * Returns a String that can be used as unique identifier for an
 * activation.  Since the activationId is the same for all assertions
 * that are created during a single insert, update or retract, the
 * key of the tuple of the activation is added too (which is a set
 * of fact handle ids). 
 * 
 * @param match The match for which a unique id should be generated
 * @return A unique id for the activation
 */
private static String getActivationId(Match match) {
    final StringBuilder result = new StringBuilder( match.getRule().getName() );
    result.append(" [");
    List< ? extends FactHandle> factHandles = match.getFactHandles();
    for ( int i = 0; i < factHandles.size(); i++ ) {
        result.append( ((InternalFactHandle) factHandles.get(i)).getId() );
        if ( i < factHandles.size() - 1 ) {
            result.append( ", " );
        }
    }
    return result.append( "]" ).toString();
}
 
示例21
protected Callable<Boolean> getTask(final int objectCount, final KieSession ksession, final boolean disposeSession,
                                    final boolean updateFacts) {
    return () -> {
        try {
            for (int j = 0; j < 10; j++) {
                final FactHandle[] facts = new FactHandle[objectCount];
                final FactHandle[] stringFacts = new FactHandle[objectCount];
                for (int i = 0; i < objectCount; i++) {
                    facts[i] = ksession.insert(new AtomicInteger(i));
                    stringFacts[i] = ksession.insert("test_" + i);
                }
                if (updateFacts) {
                    for (int i = 0; i < objectCount; i++) {
                        ksession.update(facts[i], new AtomicInteger(-i));
                        ksession.update(stringFacts[i], "updated_test_" + i);
                    }
                }
                for (int i = 0; i < objectCount; i++) {
                    ksession.delete(facts[i]);
                    ksession.delete(stringFacts[i]);
                }
                ksession.fireAllRules();
            }
            return true;
        } catch (final Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (disposeSession) {
                ksession.dispose();
            }
        }
    };
}
 
示例22
private Map getActivationParameters(Tuple tuple) {
    Map result = new HashMap();
    Declaration[] declarations = ((RuleTerminalNode) tuple.getTupleSink()).getAllDeclarations();

    for (int i = 0; i < declarations.length; i++) {
        FactHandle handle = tuple.get(declarations[i]);
        if (handle instanceof InternalFactHandle) {
            result.put(declarations[i].getIdentifier(),
                       declarations[i].getValue(this,
                                                ((InternalFactHandle) handle).getObject()));
        }
    }
    return result;
}
 
示例23
@Test()
public void testAbis_Working() {
    // DROOLS-644
    String drl =
            "import " + Person.class.getCanonicalName() + ";\n" +
            "global java.util.List list;\n" +
            "rule R when\n" +
            "    $p1 : Person( name == \"Mario\", $a1: age) \n" +
            "    $p2 : Person( age > $a1 ) \n" +
            "then\n" +
            "    list.add(\"t0\");\n" +
            "end\n" +
            "rule Z when\n" +
            "    $p1 : Person( name == \"Mario\" ) \n" +
            "then\n" +
            "    modify($p1) { setAge(35); } \n" +
            "end\n" 
            ;

    // making the default explicit:
    KieSession ksession = new KieHelper(PropertySpecificOption.ALWAYS).addContent(drl, ResourceType.DRL)
            .build()
            .newKieSession();
    
    System.out.println(drl);
    ReteDumper.dumpRete(ksession);

    List<String> list = new ArrayList<String>();
    ksession.setGlobal("list", list);

    Person mario = new Person("Mario", 40);
    Person mark = new Person("Mark", 37);
    FactHandle fh_mario = ksession.insert(mario);
    ksession.insert(mark);
    int x = ksession.fireAllRules();
    assertEquals(1, list.size());
    assertEquals("t0", list.get(0));
}
 
示例24
public Object execute(Context context) {
    KieSession ksession = ((RegistryContext) context).lookup( KieSession.class );

    FactHandle factHandle = this.factHandle;
    if( factHandle == null ) {
        factHandle = this.disconnectedFactHandle;
    }
    Object object = ksession.getObject( factHandle );

    if (this.outIdentifier != null) {
        ((RegistryContext) context).lookup( ExecutionResultImpl.class ).setResult( this.outIdentifier, object );
    }

    return object;
}
 
示例25
@Test
public void testDeleteLogicalAssertion() {
    // BZ-1317026
    String drl =
            "rule R1 when\n" +
            "then\n" +
            "    insertLogical( \"test\" ); \n" +
            "end\n";

    KieSession ksession = new KieHelper().addContent( drl, ResourceType.DRL )
                                         .build()
                                         .newKieSession();
    try {
        ksession.fireAllRules();
        Collection<FactHandle> fhs = ksession.getFactHandles( new ClassObjectFilter( String.class ) );
        assertEquals(1, fhs.size());

        for (FactHandle fh : fhs) {
            ksession.delete( fh );
        }

        fhs = ksession.getFactHandles( new ClassObjectFilter( String.class ) );
        assertEquals(0, fhs.size());
    } finally {
        ksession.dispose();
    }
}
 
示例26
private Object convertObjectToSerializableVariant( Object obj, Map<Object, Object> seenObjectsMap ) {
    if( obj == null ) {
        return null;
    }
    if( obj instanceof QueryResultsImpl ) {
        obj = new FlatQueryResults((QueryResultsImpl) obj);
    } else if( obj instanceof FactHandle ) {
        obj = DisconnectedFactHandle.newFrom((FactHandle) obj);
    } else if( !(obj instanceof JaxbListWrapper) && (obj instanceof Collection || obj instanceof Map) ) {
        obj = recursiveMarshal(obj, seenObjectsMap);
    }
    return obj;
}
 
示例27
public List<String> call() throws Exception {
    final List<String> events = new ArrayList<String>();

    try {
        KieSession ksession = kbase.newKieSession();
        ksession.setGlobal("events", events);

        // phase 1
        Room room1 = new Room("Room 1");
        ksession.insert(room1);
        FactHandle fireFact1 = ksession.insert(new Fire(room1));
        ksession.fireAllRules();
        assertEquals(1, events.size());

        // phase 2
        Sprinkler sprinkler1 = new Sprinkler(room1);
        ksession.insert(sprinkler1);
        ksession.fireAllRules();
        assertEquals(2, events.size());

        // phase 3
        ksession.retract(fireFact1);
        ksession.fireAllRules();
    } catch (Exception e) {
        System.err.println("Exception in thread " + Thread.currentThread().getName() + ": " + e.getLocalizedMessage());
        throw e;
    }

    return events;
}
 
示例28
@Test
public void testGetFactHandleIdentityBehavior() throws Exception {
    final KieBaseConfiguration kbc = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
    kbc.setOption(EqualityBehaviorOption.IDENTITY);
    final KieBase kbase = SerializationHelper.serializeObject(loadKnowledgeBase(kbc));
    final KieSession ksession = createKnowledgeSession(kbase);

    final CheeseEqual cheese = new CheeseEqual("stilton", 10);
    ksession.insert(cheese);
    final FactHandle fh1 = ksession.getFactHandle(new Cheese("stilton", 10));
    assertNull(fh1);
    final FactHandle fh2 = ksession.getFactHandle(cheese);
    assertNotNull(fh2);
}
 
示例29
public static DisconnectedFactHandle newFrom( FactHandle handle ) {
    if( handle instanceof DisconnectedFactHandle ) {
        return (DisconnectedFactHandle) handle;
    } else {
        InternalFactHandle ifh = (InternalFactHandle) handle;
        return new DisconnectedFactHandle(ifh.getId(),
                                          ifh.getIdentityHashCode(),
                                          ifh.getObjectHashCode(),
                                          ifh.getRecency(),
                                          ifh.getEntryPoint() != null ? ifh.getEntryPoint().getEntryPointId() : null,
                                          ifh.getObject(),
                                          ifh.isTraitOrTraitable() );
    }
}
 
示例30
@Test
public void testGetFactHandle() throws Exception {
    final KieBase kbase = SerializationHelper.serializeObject(loadKnowledgeBase("../empty.drl"));
    final KieSession ksession = createKnowledgeSession(kbase);

    for (int i = 0; i < 20; i++) {
        final Object object = new Object();
        ksession.insert(object);
        final FactHandle factHandle = ksession.getFactHandle(object);
        assertNotNull(factHandle);
        assertEquals(object, ksession.getObject(factHandle));
    }
    ksession.dispose();
}