BuildUtils { public TemporalDependencyMatrix calculateTemporalDistance(GroupElement groupElement) { List<Pattern> events = new ArrayList<Pattern>(); selectAllEventPatterns( events, groupElement ); final int size = events.size(); if ( size >= 1 ) { Interval[][] source = new Interval[size][]; for ( int row = 0; row < size; row++ ) { source[row] = new Interval[size]; for ( int col = 0; col < size; col++ ) { if ( row == col ) { source[row][col] = new Interval( 0, 0 ); } else { source[row][col] = new Interval( Interval.MIN, Interval.MAX ); } } } Interval[][] result; if ( size > 1 ) { List<Declaration> declarations = new ArrayList<>(); int eventIndex = 0; for ( Pattern event : events ) { declarations.add( event.getDeclaration() ); Map<Declaration, Interval> temporal = new HashMap<>(); gatherTemporalRelationships( event.getConstraints(), temporal ); for ( Map.Entry<Declaration, Interval> entry : temporal.entrySet() ) { int targetIndex = declarations.indexOf( entry.getKey() ); Interval interval = entry.getValue(); source[targetIndex][eventIndex].intersect( interval ); Interval reverse = new Interval( interval.getUpperBound() == Long.MAX_VALUE ? Long.MIN_VALUE : -interval.getUpperBound(), interval.getLowerBound() == Long.MIN_VALUE ? Long.MAX_VALUE : -interval.getLowerBound() ); source[eventIndex][targetIndex].intersect( reverse ); } eventIndex++; } result = TimeUtils.calculateTemporalDistance( source ); } else { result = source; } return new TemporalDependencyMatrix( result, events ); } return null; }  void addBuilder(final Class< ? > target,
                           final ReteooComponentBuilder builder); ReteooComponentBuilder getBuilderFor(final RuleConditionElement target); ReteooComponentBuilder getBuilderFor(final Class cls); T attachNode(BuildContext context, T candidate); BetaConstraints createBetaNodeConstraint(final BuildContext context,
                                                    final List<BetaNodeFieldConstraint> list,
                                                    final boolean disableIndexing); TemporalDependencyMatrix calculateTemporalDistance(GroupElement groupElement);  }
@Test public void testCalculateTemporalDistance() { Interval[][] input = new Interval[][] { { new Interval(0,0), new Interval(-2,2), new Interval(-3, 4), new Interval(MIN, MAX), new Interval(MIN, MAX) }, { new Interval(-2,2), new Interval(0,0), new Interval(MIN, MAX), new Interval(1,2), new Interval(MIN, MAX) }, { new Interval(-4,3), new Interval(MIN,MAX), new Interval(0, 0), new Interval(2, 3), new Interval(MIN, MAX) }, { new Interval(MIN,MAX), new Interval(-2,-1), new Interval(-3, -2), new Interval(0, 0), new Interval(1, 10) }, { new Interval(MIN,MAX), new Interval(MIN,MAX), new Interval(MIN,MAX), new Interval(-10, -1), new Interval(0,0) } }; Interval[][] expected = new Interval[][] { { new Interval(0,0), new Interval(-2,2), new Interval(-3, 2), new Interval(-1, 4), new Interval(0, 14) }, { new Interval(-2,2), new Interval(0,0), new Interval(-2, 0), new Interval(1,2), new Interval(2, 12) }, { new Interval(-2,3), new Interval(0,2), new Interval(0, 0), new Interval(2, 3), new Interval(3, 13) }, { new Interval(-4,1), new Interval(-2,-1), new Interval(-3, -2), new Interval(0, 0), new Interval(1, 10) }, { new Interval(-14,0), new Interval(-12,-2), new Interval(-13,-3), new Interval(-10, -1), new Interval(0,0) } }; AfterEvaluatorDefinition evals = new AfterEvaluatorDefinition(); ClassObjectType ot = new ClassObjectType(StockTick.class, true); Pattern a = new Pattern( 0, ot, "$a" ); Pattern b = new Pattern( 1, ot, "$b" ); b.addConstraint( new EvaluatorConstraint( new Declaration[] { a.getDeclaration() }, evals.getEvaluator( ValueType.OBJECT_TYPE, AfterEvaluatorDefinition.AFTER, "-2,2"), new SelfReferenceClassFieldReader( StockTick.class ) ) ); Pattern c = new Pattern( 2, ot, "$c" ); c.addConstraint( new EvaluatorConstraint( new Declaration[] { a.getDeclaration() }, evals.getEvaluator( ValueType.OBJECT_TYPE, AfterEvaluatorDefinition.AFTER, "-3,4"), new SelfReferenceClassFieldReader( StockTick.class ) ) ); Pattern d = new Pattern( 3, ot, "$d" ); d.addConstraint( new EvaluatorConstraint( new Declaration[] { b.getDeclaration() }, evals.getEvaluator( ValueType.OBJECT_TYPE, AfterEvaluatorDefinition.AFTER, "1,2"), new SelfReferenceClassFieldReader( StockTick.class ) ) ); d.addConstraint( new EvaluatorConstraint( new Declaration[] { c.getDeclaration() }, evals.getEvaluator( ValueType.OBJECT_TYPE, AfterEvaluatorDefinition.AFTER, "2,3"), new SelfReferenceClassFieldReader( StockTick.class ) ) ); Pattern e = new Pattern( 4, ot, "$e" ); e.addConstraint(new EvaluatorConstraint(new Declaration[]{d.getDeclaration()}, evals.getEvaluator(ValueType.OBJECT_TYPE, AfterEvaluatorDefinition.AFTER, "1,10"), new SelfReferenceClassFieldReader(StockTick.class))); GroupElement not = new GroupElement( Type.NOT ); not.addChild( e ); GroupElement and = new GroupElement( Type.AND ); and.addChild( a ); and.addChild( b ); and.addChild( c ); and.addChild( d ); and.addChild( not ); TemporalDependencyMatrix matrix = utils.calculateTemporalDistance( and ); assertEqualsMatrix( expected, matrix.getMatrix() ); assertEquals( 15, matrix.getExpirationOffset( a ) ); assertEquals( 11, matrix.getExpirationOffset( d ) ); assertEquals( 1, matrix.getExpirationOffset( e ) ); }