// Path: src/main/java/org/deri/cqels/data/ExtendMapping.java
// public class ExtendMapping extends MappingBase {
// 
//     Mapping mapping;
//     VarExprList exprs;
// 
//     public ExtendMapping(ExecContext context, Mapping mapping, VarExprList exprs) {
//         super(context);
//         this.mapping = mapping;
//         this.exprs = exprs;
//     }
// 
//     public ExtendMapping(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);
//         }
//         if (exprs.contains(var)) {
//             NodeValue value = exprs.getExpr(var).eval(
//                     new Mapping2Binding(context, mapping),
//                     new FunctionEnvBase());
//             return context.engine().encode(value.asNode());
//         }
//         return super.get(var);
//     }
// 
//     @Override
//     public Iterator<Var> vars() {
//         if (hasParent()) {
//             return IteratorConcat.concat(
//                     IteratorConcat.concat(mapping.vars(), exprs.getVars().iterator()), super.vars());
//         }
//         return IteratorConcat.concat(mapping.vars(), exprs.getVars().iterator());
//     }
// 
//     @Override
//     public boolean containsKey(Object key) {
//         if (mapping.containsKey(key)) {
//             return true;
//         }
//         if (exprs.contains((Var) key)) {
//             return true;
//         }
//         return super.containsKey(key);
//     }
// 
//     @Override
//     public boolean containsValue(Object value) {
//         if (mapping.containsValue(value)) {
//             return true;
//         }
//         return super.containsValue(value);
//     }
// 
//     @Override
//     public boolean isCompatible(Mapping mapping) {
//         //TODO : need to be checked
//         if (!mapping.isCompatible(this)) {
//             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() + exprs.size();
//     }
// }
// 
// 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/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/iterator/NullMappingIter.java
// public class NullMappingIter extends MappingIter {
// 	private static NullMappingIter instance;
// 	public NullMappingIter() {
// 		super(null);
// 	}
// 	
// 	public static NullMappingIter instance() {
// 		if(instance==null) instance=new NullMappingIter(); 
// 		return instance;
// 	}
// 	
// 	@Override
// 	protected void closeIterator() {
// 		// TODO Auto-generated method stub
// 
// 	}
// 
// 	@Override
// 	protected boolean hasNextMapping() {
// 		// TODO Auto-generated method stub
// 		return false;
// 	}
// 
// 	@Override
// 	protected Mapping moveToNextMapping() {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	protected void requestCancel() {
// 		// TODO Auto-generated method stub
// 
// 	}
// 
// }


import org.deri.cqels.data.ExtendMapping;
import org.deri.cqels.data.Mapping;
import org.deri.cqels.engine.iterator.MappingIterator;
import org.deri.cqels.engine.iterator.NullMappingIter;
import com.hp.hpl.jena.sparql.algebra.op.OpExtend;
import com.hp.hpl.jena.sparql.core.VarExprList;
package org.deri.cqels.engine;


public class ExtendRouter extends OpRouter1 {

    private final VarExprList exprs;

    public ExtendRouter(ExecContext context, OpExtend op, OpRouter sub) {
        super(context, op, sub);
        this.exprs = op.getVarExprList();
    }

    @Override
    public void route(Mapping mapping) {
// Path: src/main/java/org/deri/cqels/data/ExtendMapping.java
// public class ExtendMapping extends MappingBase {
// 
//     Mapping mapping;
//     VarExprList exprs;
// 
//     public ExtendMapping(ExecContext context, Mapping mapping, VarExprList exprs) {
//         super(context);
//         this.mapping = mapping;
//         this.exprs = exprs;
//     }
// 
//     public ExtendMapping(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);
//         }
//         if (exprs.contains(var)) {
//             NodeValue value = exprs.getExpr(var).eval(
//                     new Mapping2Binding(context, mapping),
//                     new FunctionEnvBase());
//             return context.engine().encode(value.asNode());
//         }
//         return super.get(var);
//     }
// 
//     @Override
//     public Iterator<Var> vars() {
//         if (hasParent()) {
//             return IteratorConcat.concat(
//                     IteratorConcat.concat(mapping.vars(), exprs.getVars().iterator()), super.vars());
//         }
//         return IteratorConcat.concat(mapping.vars(), exprs.getVars().iterator());
//     }
// 
//     @Override
//     public boolean containsKey(Object key) {
//         if (mapping.containsKey(key)) {
//             return true;
//         }
//         if (exprs.contains((Var) key)) {
//             return true;
//         }
//         return super.containsKey(key);
//     }
// 
//     @Override
//     public boolean containsValue(Object value) {
//         if (mapping.containsValue(value)) {
//             return true;
//         }
//         return super.containsValue(value);
//     }
// 
//     @Override
//     public boolean isCompatible(Mapping mapping) {
//         //TODO : need to be checked
//         if (!mapping.isCompatible(this)) {
//             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() + exprs.size();
//     }
// }
// 
// 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/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/iterator/NullMappingIter.java
// public class NullMappingIter extends MappingIter {
// 	private static NullMappingIter instance;
// 	public NullMappingIter() {
// 		super(null);
// 	}
// 	
// 	public static NullMappingIter instance() {
// 		if(instance==null) instance=new NullMappingIter(); 
// 		return instance;
// 	}
// 	
// 	@Override
// 	protected void closeIterator() {
// 		// TODO Auto-generated method stub
// 
// 	}
// 
// 	@Override
// 	protected boolean hasNextMapping() {
// 		// TODO Auto-generated method stub
// 		return false;
// 	}
// 
// 	@Override
// 	protected Mapping moveToNextMapping() {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	protected void requestCancel() {
// 		// TODO Auto-generated method stub
// 
// 	}
// 
// }


// Path: src/main/java/org/deri/cqels/engine/ExtendRouter.java
import org.deri.cqels.data.ExtendMapping;
import org.deri.cqels.data.Mapping;
import org.deri.cqels.engine.iterator.MappingIterator;
import org.deri.cqels.engine.iterator.NullMappingIter;
import com.hp.hpl.jena.sparql.algebra.op.OpExtend;
import com.hp.hpl.jena.sparql.core.VarExprList;

package org.deri.cqels.engine;


public class ExtendRouter extends OpRouter1 {

    private final VarExprList exprs;

    public ExtendRouter(ExecContext context, OpExtend op, OpRouter sub) {
        super(context, op, sub);
        this.exprs = op.getVarExprList();
    }

    @Override
    public void route(Mapping mapping) {
        _route(new ExtendMapping(context, mapping, exprs));