aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/interval/IntervalAggregationOperator.xtend
blob: 21d3d73b1417833b795da0ba832caf1f6871ad23 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.interval

import java.util.stream.Stream
import org.eclipse.viatra.query.runtime.matchers.psystem.aggregations.IMultisetAggregationOperator
import org.eclipse.xtend.lib.annotations.Accessors
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor

@FinalFieldsConstructor
class IntervalAggregationOperator implements IMultisetAggregationOperator<Interval, IntervalRedBlackNode, Interval> {
	@Accessors val IntervalAggregationMode mode

	override getName() {
		mode.modeName
	}

	override getShortDescription() {
		mode.description
	}

	override createNeutral() {
		mode.empty
	}

	override isNeutral(IntervalRedBlackNode result) {
		result.leaf
	}

	override update(IntervalRedBlackNode oldResult, Interval updateValue, boolean isInsertion) {
		if (isInsertion) {
			val newNode = mode.createNode(updateValue)
			oldResult.add(newNode)
		} else {
			oldResult.remove(updateValue)
		}
	}

	override getAggregate(IntervalRedBlackNode result) {
		if (result.leaf) {
			mode.neutral
		} else {
			result.result
		}
	}

	override aggregateStream(Stream<Interval> stream) {
		stream.reduce(mode).orElse(mode.neutral)
	}
}