/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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. */ package org.drools.compiler.phreak; import org.drools.core.common.InternalFactHandle; import org.drools.core.common.InternalWorkingMemory; import org.drools.core.common.TupleSets; import org.drools.core.reteoo.LeftTuple; import org.drools.core.reteoo.LeftTupleImpl; import org.drools.core.reteoo.LeftTupleSink; import org.drools.core.reteoo.RightTupleImpl; public class BaseLeftTuplesBuilder<T extends BaseLeftTuplesBuilder> { protected InternalWorkingMemory wm; protected LeftTupleSink sink; protected TupleSets<LeftTuple> leftTuples; protected Scenario scenario; private boolean testStagedInsert; private boolean testStagedDelete; private boolean testStagedUpdate; public BaseLeftTuplesBuilder(Scenario scenario, TupleSets<LeftTuple> leftTuples) { this.wm = scenario.getWorkingMemory(); this.scenario = scenario; this.sink = scenario.getSinkNode(); this.leftTuples = leftTuples; } public boolean isTestStagedInsert() { return testStagedInsert; } public boolean isTestStagedDelete() { return testStagedDelete; } public boolean isTestStagedUpdate() { return testStagedUpdate; } public T insert(Object... objects) { this.testStagedInsert = true; if ( objects == null ) { objects = new Object[0]; } for ( int i = 0; i < objects.length; i++ ) { if ( !(objects[i] instanceof Pair) ) { Object o1 = objects[i]; InternalFactHandle fh1 = (InternalFactHandle) wm.getFactHandle( o1 ); LeftTuple leftTuple = new LeftTupleImpl( fh1, sink, true ); leftTuples.addInsert( leftTuple ); } else { Pair p = (Pair )objects[i]; InternalFactHandle fh1 = (InternalFactHandle) wm.getFactHandle( p.getO1() ); LeftTuple leftTuple1 = new LeftTupleImpl( fh1, sink, true ); InternalFactHandle fh2 = (InternalFactHandle) wm.getFactHandle( p.getO2() ); LeftTuple leftTuple2 = sink.createLeftTuple( leftTuple1, new RightTupleImpl( fh2 ), sink ); leftTuples.addInsert( leftTuple2 ); } } return (T) this ; } public T delete(Object... objects) { this.testStagedDelete = true; if ( objects == null ) { objects = new Object[0]; } for ( int i = 0; i < objects.length; i++ ) { if ( !(objects[i] instanceof Pair) ) { Object o1 = objects[i]; InternalFactHandle fh1 = (InternalFactHandle) wm.getFactHandle( o1 ); LeftTuple leftTuple = new LeftTupleImpl( fh1, sink, true ); leftTuples.addDelete( leftTuple ); } else { Pair p = (Pair )objects[i]; InternalFactHandle fh1 = (InternalFactHandle) wm.getFactHandle( p.getO1() ); LeftTuple leftTuple1 = new LeftTupleImpl( fh1, sink, true ); InternalFactHandle fh2 = (InternalFactHandle) wm.getFactHandle( p.getO2() ); LeftTuple leftTuple2 = sink.createLeftTuple( leftTuple1, new RightTupleImpl( fh2 ), sink ); leftTuples.addDelete( leftTuple2 ); } } return (T) this ; } public T update(Object... objects) { this.testStagedUpdate = true; if ( objects == null ) { objects = new Object[0]; } for ( int i = 0; i < objects.length; i++ ) { if ( !(objects[i] instanceof Pair) ) { Object o1 = objects[i]; InternalFactHandle fh1 = (InternalFactHandle) wm.getFactHandle( o1 ); LeftTuple leftTuple = new LeftTupleImpl( fh1, sink, true ); leftTuples.addUpdate( leftTuple ); } else { Pair p = (Pair )objects[i]; InternalFactHandle fh1 = (InternalFactHandle) wm.getFactHandle( p.getO1() ); LeftTuple leftTuple1 = new LeftTupleImpl( fh1, sink, true ); InternalFactHandle fh2 = (InternalFactHandle) wm.getFactHandle( p.getO2() ); LeftTuple leftTuple2 = sink.createLeftTuple( leftTuple1, new RightTupleImpl( fh2 ), sink ); leftTuples.addUpdate( leftTuple2 ); } } return (T) this ; } TupleSets<LeftTuple> get() { return this.leftTuples; } public Scenario run() { return this.scenario.run(); } }