package org.olap4j.driver.olap4ld.linkeddata; import java.util.List; import java.util.Map; import org.olap4j.driver.olap4ld.helper.Olap4ldLinkedDataUtil; import org.semanticweb.yars.nx.Node; /** * This operator removes facts from a result of a LogicalOlapOp that do not * comply with a condition. * * @author benedikt * */ public class DiceOp implements LogicalOlapOp { public LogicalOlapOp inputOp; public List<List<Node[]>> membercombinations; public List<Node[]> hierarchysignature; /** * * @param op * @param hierarchysignature A list of hierarchies. For each hierarchy, in the member combinations * a list of members is given. * @param membercombinations A list of members to dice. */ public DiceOp(LogicalOlapOp op, List<Node[]> hierarchysignature, List<List<Node[]>> membercombinations) { this.inputOp = op; this.membercombinations = membercombinations; this.hierarchysignature = hierarchysignature; } public String toString() { String positionsStringArray = ""; // Every member same schema if (membercombinations == null || membercombinations.isEmpty()) { positionsStringArray = "{}"; } else { Map<String, Integer> map = Olap4ldLinkedDataUtil .getNodeResultFields(membercombinations.get(0).get(0)); Map<String, Integer> signaturemap = Olap4ldLinkedDataUtil .getNodeResultFields(hierarchysignature.get(0)); // There is no header for (int i = 0; i < membercombinations.size(); i++) { if (i!=0) { positionsStringArray += " OR "; } // One possible member combination (inside AND) List<Node[]> members = membercombinations.get(i); String positionStringArray[] = new String[members .size()-1]; // First is header for (int j = 1; j < members.size(); j++) { positionStringArray[j-1] = this.hierarchysignature.get(j)[signaturemap .get("?HIERARCHY_UNIQUE_NAME")] + " = " + members.get(j)[map.get("?MEMBER_UNIQUE_NAME")] .toString(); } positionsStringArray += "(" + Olap4ldLinkedDataUtil.implodeArray( positionStringArray, " AND ") + ")"; } } return "Dice (" + inputOp.toString() + ", " + positionsStringArray + ")"; } @Override public void accept(LogicalOlapOperatorQueryPlanVisitor v) throws QueryException { v.visit(this); // visit the projection input op inputOp.accept(v); } }