/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.epl.agg.service; import com.espertech.esper.collection.MultiKeyUntyped; import java.util.Arrays; public class AggregationGroupByRollupLevel { private final int levelNumber; private final int levelOffset; private final int[] rollupKeys; public AggregationGroupByRollupLevel(int levelNumber, int levelOffset, int[] rollupKeys) { this.levelNumber = levelNumber; this.levelOffset = levelOffset; this.rollupKeys = rollupKeys; } public int getLevelNumber() { return levelNumber; } public int getAggregationOffset() { if (isAggregationTop()) { throw new IllegalArgumentException(); } return levelOffset; } public boolean isAggregationTop() { return levelOffset == -1; } public int[] getRollupKeys() { return rollupKeys; } public Object computeSubkey(Object groupKey) { if (isAggregationTop()) { return null; } if (groupKey instanceof MultiKeyUntyped) { MultiKeyUntyped mk = (MultiKeyUntyped) groupKey; Object[] keys = mk.getKeys(); if (rollupKeys.length == keys.length) { return mk; } else if (rollupKeys.length == 1) { return keys[rollupKeys[0]]; } else { Object[] subkeys = new Object[rollupKeys.length]; int count = 0; for (int rollupKey : rollupKeys) { subkeys[count++] = keys[rollupKey]; } return new MultiKeyUntyped(subkeys); } } else { return groupKey; } } public String toString() { return "GroupByRollupLevel{" + "levelOffset=" + levelOffset + ", rollupKeys=" + Arrays.toString(rollupKeys) + '}'; } public MultiKeyUntyped computeMultiKey(Object subkey, int numExpected) { if (subkey instanceof MultiKeyUntyped) { MultiKeyUntyped mk = (MultiKeyUntyped) subkey; if (mk.getKeys().length == numExpected) { return mk; } Object[] keys = new Object[]{numExpected}; for (int i = 0; i < rollupKeys.length; i++) { keys[rollupKeys[i]] = mk.getKeys()[i]; } return new MultiKeyUntyped(keys); } Object[] keys = new Object[numExpected]; if (subkey == null) { return new MultiKeyUntyped(keys); } keys[rollupKeys[0]] = subkey; return new MultiKeyUntyped(keys); } }