blob: 869f69e6a53d0272c7332817a403d9ba98bf6dab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018-2019 Aston University.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 3.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-3.0
*
* Contributors:
* Antonio Garcia-Dominguez - initial API and implementation
******************************************************************************/
package org.eclipse.hawk.timeaware.queries.operations.patterns;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
import org.eclipse.epsilon.eol.dom.Expression;
import org.eclipse.epsilon.eol.dom.NameExpression;
import org.eclipse.epsilon.eol.dom.Parameter;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.eol.execute.context.IEolContext;
import org.eclipse.epsilon.eol.execute.operations.AbstractOperation;
import org.eclipse.epsilon.eol.types.EolModelElementType;
import org.eclipse.epsilon.eol.types.EolNoType;
import org.eclipse.epsilon.eol.types.EolType;
import org.eclipse.hawk.timeaware.queries.TimeAwareEOLQueryEngine;
public class BoundedVersionQuantifierOperation extends AbstractOperation {
private final Function<Integer, IShortCircuitReducer> reducerLambda;
private final Supplier<TimeAwareEOLQueryEngine> modelSupplier;
public BoundedVersionQuantifierOperation(Supplier<TimeAwareEOLQueryEngine> containerModel, Function<Integer, IShortCircuitReducer> reducerLambda) {
this.modelSupplier = containerModel;
this.reducerLambda = reducerLambda;
}
@Override
public Object execute(Object target, NameExpression operationNameExpression, List<Parameter> iterators,
List<Expression> expressions, IEolContext context) throws EolRuntimeException {
if (expressions.size() != 2) {
throw new EolRuntimeException("Bounded version quantifiers require an "
+ "element predicate lambda expression and a count expression");
}
final Parameter iterator = iterators.get(0);
final EolType iteratorType = iterator.getType(context);
if (target == EolNoType.Instance && iteratorType instanceof EolModelElementType) {
target = ((EolModelElementType) iteratorType).getAllOfKind();
}
final Object countResult = context.getExecutorFactory().execute(expressions.get(1), context);
if (!(countResult instanceof Number)) {
throw new EolRuntimeException("Count expression should return a number");
}
final int count = ((Number)countResult).intValue();
return new VersionQuantifierOperation(modelSupplier, reducerLambda.apply(count))
.execute(target, operationNameExpression, iterators, expressions, context);
}
}