/*
* SPDX-FileCopyrightText: 2021-2023 The Refinery Authors
*
* SPDX-License-Identifier: EPL-2.0
*/
package tools.refinery.store.query.viatra.internal.update;
import tools.refinery.viatra.runtime.matchers.context.IInputKey;
import tools.refinery.viatra.runtime.matchers.context.IQueryRuntimeContextListener;
import tools.refinery.viatra.runtime.matchers.tuple.ITuple;
import tools.refinery.store.query.viatra.internal.ViatraModelQueryAdapterImpl;
import tools.refinery.store.query.view.AnySymbolView;
import tools.refinery.store.query.view.SymbolView;
import java.util.HashMap;
import java.util.Map;
public class ModelUpdateListener {
private final Map> symbolViewUpdateListeners;
public ModelUpdateListener(ViatraModelQueryAdapterImpl adapter) {
var symbolViews = adapter.getStoreAdapter().getInputKeys().keySet();
symbolViewUpdateListeners = new HashMap<>(symbolViews.size());
for (var symbolView : symbolViews) {
registerView(adapter, (SymbolView>) symbolView);
}
}
private void registerView(ViatraModelQueryAdapterImpl adapter, SymbolView view) {
var model = adapter.getModel();
var interpretation = model.getInterpretation(view.getSymbol());
var listener = SymbolViewUpdateListener.of(adapter, view, interpretation);
symbolViewUpdateListeners.put(view, listener);
}
public boolean containsSymbolView(AnySymbolView relationView) {
return symbolViewUpdateListeners.containsKey(relationView);
}
public void addListener(IInputKey key, AnySymbolView symbolView, ITuple seed,
IQueryRuntimeContextListener listener) {
var symbolViewUpdateListener = symbolViewUpdateListeners.get(symbolView);
symbolViewUpdateListener.addFilter(key, seed, listener);
}
public void removeListener(IInputKey key, AnySymbolView symbolView, ITuple seed,
IQueryRuntimeContextListener listener) {
var symbolViewUpdateListener = symbolViewUpdateListeners.get(symbolView);
symbolViewUpdateListener.removeFilter(key, seed, listener);
}
}