// Path: src/main/java/org/deri/cqels/data/Mapping.java
// public interface Mapping extends Map<Var, Long>{
// 	
// 
// 	public long get(Var var); 
// 	
// 	public void from(OpRouter router);
// 	
// 	public OpRouter from();
// 	
// 	public ExecContext getCtx();
// 	
// 	public Iterator<Var> vars();
// 	
// 	public void addParent(Mapping parent);
// 	
// 	public boolean hasParent();
// 	
// 	public boolean isCompatible(Mapping mapping);
// }
// 
// Path: src/main/java/org/deri/cqels/data/MappingWrapped.java
// public class MappingWrapped extends MappingBase {
// 
//     Mapping mapping;
// 
//     public MappingWrapped(ExecContext context, Mapping mapping) {
//         super(context);
//         this.mapping = mapping;
//     }
// 
//     public MappingWrapped(ExecContext context, Mapping mapping, Mapping parent) {
//         super(context, parent);
//         this.mapping = mapping;
//     }
// 
//     @Override
//     public long get(Var var) {
//         if (mapping.get(var) != -1) {
//             return mapping.get(var);
//         }
//         return super.get(var);
//     }
// 
//     @Override
//     public Iterator<Var> vars() {
//         if (hasParent()) {
//             return IteratorConcat.concat(mapping.vars(), super.vars());
//         }
//         return mapping.vars();
//     }
// 
//     @Override
//     public boolean containsKey(Object key) {
//         if (mapping.containsKey(key)) {
//             return true;
//         }
//         return super.containsKey(key);
//     }
// 
//     @Override
//     public boolean containsValue(Object value) {
//         if (containsValue(value)) {
//             return true;
//         }
//         return super.containsValue(value);
//     }
// 
//     @Override
//     public boolean isCompatible(Mapping mapping) {
//         if (!this.mapping.isCompatible(mapping)) {
//             return false;
//         }
//         return super.isCompatible(mapping);
//     }
// 
//     @Override
//     public boolean isEmpty() {
//         if (mapping.isEmpty()) {
//             return true;
//         }
//         return super.isEmpty();
//     }
// 
//     @Override
//     public int size() {
//         return mapping.size() + super.size();
//     }
// }
// 
// Path: src/main/java/org/deri/cqels/engine/iterator/MappingIterator.java
// public interface MappingIterator extends Closeable, Iterator<Mapping> {
// 
//     /**
//      * Get next binding
//      */
//     public Mapping nextMapping();
// 
//     /**
//      * Cancels the query as soon as is possible for the given iterator
//      */
//     public void cancel();
// }


import java.lang.reflect.Method;
import java.util.ArrayList;
import org.deri.cqels.data.Mapping;
import org.deri.cqels.data.MappingWrapped;
import org.deri.cqels.engine.iterator.MappingIterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
package org.deri.cqels.engine;


public class ThroughRouter extends OpRouterBase {

    private static final Logger logger = LoggerFactory.getLogger(
            ThroughRouter.class);
    private final ArrayList<OpRouter> dataflows;

    public ThroughRouter(ExecContext context, ArrayList<OpRouter> dataflows) {
        super(context, dataflows.get(0).getOp());
        this.dataflows = dataflows;
    }

    @Override
    public void route(Mapping mapping) {
        _route(new MappingWrapped(context, mapping));
    }

    @Override
// Path: src/main/java/org/deri/cqels/data/Mapping.java
// public interface Mapping extends Map<Var, Long>{
// 	
// 
// 	public long get(Var var); 
// 	
// 	public void from(OpRouter router);
// 	
// 	public OpRouter from();
// 	
// 	public ExecContext getCtx();
// 	
// 	public Iterator<Var> vars();
// 	
// 	public void addParent(Mapping parent);
// 	
// 	public boolean hasParent();
// 	
// 	public boolean isCompatible(Mapping mapping);
// }
// 
// Path: src/main/java/org/deri/cqels/data/MappingWrapped.java
// public class MappingWrapped extends MappingBase {
// 
//     Mapping mapping;
// 
//     public MappingWrapped(ExecContext context, Mapping mapping) {
//         super(context);
//         this.mapping = mapping;
//     }
// 
//     public MappingWrapped(ExecContext context, Mapping mapping, Mapping parent) {
//         super(context, parent);
//         this.mapping = mapping;
//     }
// 
//     @Override
//     public long get(Var var) {
//         if (mapping.get(var) != -1) {
//             return mapping.get(var);
//         }
//         return super.get(var);
//     }
// 
//     @Override
//     public Iterator<Var> vars() {
//         if (hasParent()) {
//             return IteratorConcat.concat(mapping.vars(), super.vars());
//         }
//         return mapping.vars();
//     }
// 
//     @Override
//     public boolean containsKey(Object key) {
//         if (mapping.containsKey(key)) {
//             return true;
//         }
//         return super.containsKey(key);
//     }
// 
//     @Override
//     public boolean containsValue(Object value) {
//         if (containsValue(value)) {
//             return true;
//         }
//         return super.containsValue(value);
//     }
// 
//     @Override
//     public boolean isCompatible(Mapping mapping) {
//         if (!this.mapping.isCompatible(mapping)) {
//             return false;
//         }
//         return super.isCompatible(mapping);
//     }
// 
//     @Override
//     public boolean isEmpty() {
//         if (mapping.isEmpty()) {
//             return true;
//         }
//         return super.isEmpty();
//     }
// 
//     @Override
//     public int size() {
//         return mapping.size() + super.size();
//     }
// }
// 
// Path: src/main/java/org/deri/cqels/engine/iterator/MappingIterator.java
// public interface MappingIterator extends Closeable, Iterator<Mapping> {
// 
//     /**
//      * Get next binding
//      */
//     public Mapping nextMapping();
// 
//     /**
//      * Cancels the query as soon as is possible for the given iterator
//      */
//     public void cancel();
// }


// Path: src/main/java/org/deri/cqels/engine/ThroughRouter.java
import java.lang.reflect.Method;
import java.util.ArrayList;
import org.deri.cqels.data.Mapping;
import org.deri.cqels.data.MappingWrapped;
import org.deri.cqels.engine.iterator.MappingIterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

package org.deri.cqels.engine;


public class ThroughRouter extends OpRouterBase {

    private static final Logger logger = LoggerFactory.getLogger(
            ThroughRouter.class);
    private final ArrayList<OpRouter> dataflows;

    public ThroughRouter(ExecContext context, ArrayList<OpRouter> dataflows) {
        super(context, dataflows.get(0).getOp());
        this.dataflows = dataflows;
    }

    @Override
    public void route(Mapping mapping) {
        _route(new MappingWrapped(context, mapping));
    }

    @Override
    public MappingIterator searchBuff4Match(Mapping mapping) {