aggstar.java

来自「数据仓库展示程序」· Java 代码 · 共 1,134 行 · 第 1/3 页

JAVA
1,134
字号
                return name;
            }

            /**
             * Get the enclosing AggStar.Table.
             *
             * @return
             */
            public AggStar.Table getTable() {
                return AggStar.Table.this;
            }

            /**
             * Get the bit possition associted with this column. This has the
             * same value as this column's RolapStar.Column.
             *
             * @return
             */
            public int getBitPosition() {
                return bitPosition;
            }

            /**
             * Return true if this is a numeric column.
             *
             * @return
             */
            public boolean isNumeric() {
                return isNumeric;
            }
            public SqlQuery getSqlQuery() {
                return getTable().getAggStar().getSqlQuery();
            }
            public MondrianDef.Expression getExpression() {
                return expression;
            }

            /**
             * This is used to create, generally, an SQL query segment of the
             * form: tablename.columnname.
             *
             * @param query
             * @return
             */
            public String getExpression(final SqlQuery query) {
                return getExpression().getExpression(query);
            }
            public String toString() {
                StringWriter sw = new StringWriter(256);
                PrintWriter pw = new PrintWriter(sw);
                print(pw, "");
                pw.flush();
                return sw.toString();
            }
            public void print(final PrintWriter pw, final String prefix) {
                SqlQuery sqlQuery = getSqlQuery();
                pw.print(prefix);
                pw.print(getName());
                pw.print(" (");
                pw.print(getBitPosition());
                pw.print("): ");
                pw.print(getExpression(sqlQuery));
            }
        }

        /**
         * This class is used for holding dimension level information.
         * Both DimTables and FactTables can have Level columns.
         */
        final class Level extends Column {

            Level(final String name,
                  final MondrianDef.Expression expression,
                  final boolean isNumeric,
                  final int bitPosition) {
                super(name, expression, isNumeric, bitPosition);
            }
        }

        /** The name of the table in the database. */
        private final String name;
        private final MondrianDef.Relation relation;
        protected final List levels;
        protected List children;

        Table(final String name, final MondrianDef.Relation relation) {
            this.name = name;
            this.relation = relation;
            this.levels = new ArrayList();
            this.children = Collections.EMPTY_LIST;
        }

        /**
         * Return the name of the table in the database.
         *
         * @return
         */
        public String getName() {
            return name;
        }

        /**
         * Return true if this table has a parent table (FactTable instances
         * do not have parent tables, all other do).
         *
         * @return
         */
        public abstract boolean hasParent();

        /**
         * Get the parent table (returns null if this table is a FactTable).
         *
         * @return
         */
        public abstract Table getParent();

        /**
         * Return true if this table has a join condition (only DimTables have
         * join conditions, FactTable instances do not).
         *
         * @return
         */
        public abstract boolean hasJoinCondition();
        public abstract Table.JoinCondition getJoinCondition();

        public MondrianDef.Relation getRelation() {
            return relation;
        }

        /**
         * Get this table's enclosing AggStar.
         *
         * @return
         */
        protected AggStar getAggStar() {
            return AggStar.this;
        }

        /**
         * Get a SqlQuery object.
         *
         * @return
         */
        protected SqlQuery getSqlQuery() {
            return getAggStar().getSqlQuery();
        }

        /**
         * Get a java.sql.Connection.
         *
         * @return
         */
        public Connection getJdbcConnection() {
            return getAggStar().getJdbcConnection();
        }

        /**
         * Add a Level column.
         *
         * @param level
         */
        protected void addLevel(final AggStar.Table.Level level) {
            this.levels.add(level);
        }

        /**
         * Get all Level columns.
         *
         * @return
         */
        public Iterator getLevels() {
            return levels.iterator();
        }

        /**
         * Add a child DimTable table.
         *
         * @param child
         */
        protected void addTable(final DimTable child) {
            if (children == Collections.EMPTY_LIST) {
                children = new ArrayList();
            }
            children.add(child);
        }

        /**
         * Get all child tables.
         *
         * @return
         */
        public Iterator getChildren() {
            return children.iterator();
        }

        /**
         * Convert a RolapStar.Table into a AggStar.DimTable as well as
         * converting all columns and child tables. If the
         * rightJoinConditionColumnName parameter is null, then the table's namd
         * and the rTable parameter's condition left condition's column name
         * are used to form the join condition's left expression.
         *
         * @param rTable
         * @param rightJoinConditionColumnName
         * @return
         */
        protected AggStar.DimTable convertTable(final RolapStar.Table rTable,
                                  final String rightJoinConditionColumnName) {
            String tableName = rTable.getAlias();
            MondrianDef.Relation relation = rTable.getRelation();
            RolapStar.Condition rjoinCondition = rTable.getCondition();
            MondrianDef.Expression rleft = rjoinCondition.getLeft();
            MondrianDef.Expression rright = rjoinCondition.getRight();

            MondrianDef.Expression left = null;
            if (rightJoinConditionColumnName != null) {
                left = new MondrianDef.Column(getName(),
                                              rightJoinConditionColumnName);
            } else {
                if (rleft instanceof MondrianDef.Column) {
                    MondrianDef.Column rcolumn = (MondrianDef.Column) rleft;
                    left = new MondrianDef.Column(getName(), rcolumn.name);
                } else {

                    // RME TODO can we catch this during validation
                    String msg = mres.BadRolapStarLeftJoinCondition.str(
                        "AggStar.Table",
                        rleft.getClass().getName(), left.toString());
                    getLogger().warn(msg);
                }
            }
            JoinCondition joinCondition = new JoinCondition(left, rright);
            DimTable dimTable =
                new DimTable(this, tableName, relation, joinCondition);

            dimTable.convertColumns(rTable);
            dimTable.convertChildren(rTable);

            return dimTable;
        }

        /**
         * Convert a RolapStar.Table table's columns into
         * AggStar.Table.Level columns.
         *
         * @param rTable
         */
        protected void convertColumns(final RolapStar.Table rTable) {
            // add level columns
            for (Iterator it = rTable.getColumns(); it.hasNext(); ) {
                RolapStar.Column column = (RolapStar.Column) it.next();

                String name = column.getName();
                MondrianDef.Expression expression = column.getExpression();
                boolean isNumeric = column.isNumeric();
                int bitPosition = column.getBitPosition();

                Level level = new Level(name,
                                        expression,
                                        isNumeric,
                                        bitPosition);
                addLevel(level);
            }
        }

        /**
         * Convert the child tables of a RolapStar.Table into
         * child AggStar.DimTable tables.
         *
         * @param rTable
         */
        protected void convertChildren(final RolapStar.Table rTable) {
            // add children tables
            for (Iterator it = rTable.getChildren(); it.hasNext(); ) {
                RolapStar.Table rTableChild = (RolapStar.Table) it.next();

                AggStar.DimTable dimChild = convertTable(rTableChild, null);

                addTable(dimChild);
            }
        }

        /**
         * This is a copy of the code found in RolapStar used to generate an SQL
         * query.
         *
         * @param query
         * @param failIfExists
         * @param joinToParent
         */
        public void addToFrom(final SqlQuery query,
                              final boolean failIfExists,
                              final boolean joinToParent) {
            query.addFrom(relation, name, failIfExists);
            if (joinToParent) {
                if (hasParent()) {
                    getParent().addToFrom(query, failIfExists, joinToParent);
                }
                if (hasJoinCondition()) {
                    query.addWhere(getJoinCondition().toString(query));
                }
            }
        }

        public String toString() {
            StringWriter sw = new StringWriter(256);
            PrintWriter pw = new PrintWriter(sw);
            print(pw, "");
            pw.flush();
            return sw.toString();
        }
        public abstract void print(final PrintWriter pw, final String prefix);
    }

    /**
     * This is an aggregate fact table.
     */
    public class FactTable extends Table {

        /**
         * This is a Column that is a Measure (contains an aggregator).
         */
        public class Measure extends Table.Column {
            private final RolapAggregator aggregator;

            Measure(final String name,
                    final MondrianDef.Expression expression,
                    final boolean isNumeric,
                    final int bitPosition,
                    final RolapAggregator aggregator) {
                super(name, expression, isNumeric, bitPosition);
                this.aggregator = aggregator;
            }

            /**
             * Get this Measure's RolapAggregator.
             *
             * @return
             */
            public RolapAggregator getAggregator() {
                return aggregator;
            }

            /**
             * Get this Measure's sql expression which is an aggregator.
             *
             * @param query
             * @return
             */
            public String getExpression(final SqlQuery query) {
                String expr = getExpression().getExpression(query);
                return getAggregator().getExpression(expr);
            }
        }

        private Column factCountColumn;
        private final List measures;
        private final int totalColumnSize;
        private int numberOfRows;

        FactTable(final JdbcSchema.Table aggTable) {
            this(aggTable.getName(),
                 aggTable.table,
                 aggTable.getTotalColumnSize(),
                 aggTable.getNumberOfRows());
        }
        FactTable(final String name,
                  final MondrianDef.Relation relation,
                  final int totalColumnSize,
                  final int numberOfRows) {
            super(name, relation);
            this.totalColumnSize = totalColumnSize;
            this.measures = new ArrayList();
            this.numberOfRows = numberOfRows;
        }
        public Table getParent() {
            return null;
        }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?