package org.olap.server.processor.functions; import java.util.Collections; import java.util.List; import org.olap.server.processor.LevelMember; import org.olap.server.processor.LevelMemberSet; import org.olap.server.processor.sql.SetSubquery; import org.olap.server.processor.sql.TableMapping; import org.olap.server.processor.sql.TableMapping.LevelMapping; import org.olap4j.OlapException; import org.olap4j.mdx.CallNode; import org.olap4j.metadata.Cube; import org.olap4j.metadata.Member; @OlapFunctionName(name = ":") public class Colon extends OlapFunction { private Member member_from, member_to; public Colon(CallNode node, Cube cube) { super(node, cube); } @Override public List<LevelMemberSet> memberSet() throws OlapException { List<LevelMemberSet> arg_set_from = createLevelMemberSet(node.getArgList().get(0)); List<LevelMemberSet> arg_set_to = createLevelMemberSet(node.getArgList().get(1)); member_from = arg_set_from.get(0).getMembers().get(0); member_to = arg_set_to.get(0).getMembers().get(0); if(member_from.getLevel()!=member_to.getLevel()) throw new OlapException("Levels mismatch: "+node.toString()); return Collections.singletonList(new LevelMemberSet(member_from.getLevel(), node, this)); } @Override public SetSubquery query(TableMapping mapping, LevelMemberSet layer) throws OlapException { LevelMapping lmap = mapping.getMapping(member_from.getLevel()); return new SetSubquery(lmap.join, lmap.key_column, ((LevelMember)member_from).getKey(), ((LevelMember)member_to).getKey()); } }