aggstar.java

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

JAVA
1,134
字号
        public boolean hasParent() {
            return false;
        }
        public boolean hasJoinCondition() {
            return false;
        }
        public Table.JoinCondition getJoinCondition() {
            return null;
        }

        /**
         * Get the volume of the table (now of rows * size of a row).
         *
         * @return
         */
        public int getVolume() {
            return getTotalColumnSize() * getNumberOfRows();
        }

        /**
         * Get the total size of all columns in a row.
         *
         * @return
         */
        public int getTotalColumnSize() {
            return totalColumnSize;
        }

        /**
         * Get the number of rows in this aggregate table.
         *
         * @return
         */
        public int getNumberOfRows() {
            if (numberOfRows == -1) {
                makeNumberOfRows();
            }
            return numberOfRows;
        }

        /**
         * This is for testing ONLY.
         *
         * @param numberOfRows
         */
        void setNumberOfRows(int numberOfRows) {
            this.numberOfRows = numberOfRows;
        }

        /**
         * Get all Measures.
         *
         * @return Iterator over measures,
         */
        public Iterator getMeasures() {
            return measures.iterator();
        }

        /**
         * Get all columns.
         *
         * @return Iterator over columns,
         */
        public Iterator getColumns() {
            List list = new ArrayList();
            list.addAll(measures);
            list.addAll(levels);
            for (Iterator it = getChildren(); it.hasNext(); ) {
                DimTable dimTable = (DimTable) it.next();
                dimTable.addColumnsToList(list);
            }

            return list.iterator();
        }

        /**
         * For a foreign key usage create a child DimTable table.
         *
         * @param usage
         */
        private void loadForeignKey(final JdbcSchema.Table.Column.Usage usage) {
            if (usage.rTable != null) {
                DimTable child = convertTable(usage.rTable,
                                          usage.rightJoinConditionColumnName);
                addTable(child);
            } else {
                // it a column thats not a measure or foreign key - it must be
                // a non-shared dimension
                // See: AggTableManager.java
                JdbcSchema.Table.Column column = usage.getColumn();
                String name = column.getName();
                String symbolicName = usage.getSymbolicName();
                if (symbolicName == null) {
                    symbolicName = name;
                }

                MondrianDef.Expression expression =
                    new MondrianDef.Column(getName(), name);
                boolean isNumeric = column.isNumeric();
                RolapStar.Column rColumn = usage.rColumn;
                if (rColumn == null) {
                    String msg = "loadForeignKey: for column " +
                        name +
                        ", rColumn == null";
                    getLogger().warn(msg);
                } else {
                    int bitPosition = rColumn.getBitPosition();
// RME Note: this should be a Level Object, not a Column
                    Column c = new Column(symbolicName,
                                          expression,
                                          isNumeric,
                                          bitPosition);
                }
            }
        }
        /**
         * Given a usage of type measure, create a Measure column.
         *
         * @param usage
         */
        private void loadMeasure(final JdbcSchema.Table.Column.Usage usage) {
            String name = usage.getColumn().getName();
            String symbolicName = usage.getSymbolicName();
            if (symbolicName == null) {
                symbolicName = name;
            }
            boolean isNumeric = usage.getColumn().isNumeric();
            RolapAggregator aggregator = usage.getAggregator();

            MondrianDef.Expression expression = null;
            if (usage.getColumn().hasUsage(JdbcSchema.FOREIGN_KEY_COLUMN_USAGE)
                    && ! aggregator.isDistinct()) {
                expression = factCountColumn.getExpression();
            } else {
                expression = new MondrianDef.Column(getName(), name);
            }

            int bitPosition = usage.rMeasure.getBitPosition();

            Measure aggMeasure = new Measure(symbolicName,
                                             expression,
                                             isNumeric,
                                             bitPosition,
                                             aggregator);

            measures.add(aggMeasure);
        }

        /**
         * Create a fact_count column for a usage of type fact count.
         *
         * @param usage
         */
        private void loadFactCount(final JdbcSchema.Table.Column.Usage usage) {
            String name = usage.getColumn().getName();
            String symbolicName = usage.getSymbolicName();
            if (symbolicName == null) {
                symbolicName = name;
            }

            MondrianDef.Expression expression =
                new MondrianDef.Column(getName(), name);
            boolean isNumeric = usage.getColumn().isNumeric();
            int bitPosition = -1;

            Column aggColumn = new Column(symbolicName,
                                          expression,
                                          isNumeric,
                                          bitPosition);

            factCountColumn = aggColumn;
        }

        /**
         * Given a usage of type level, create a Level column.
         *
         * @param usage
         */
        private void loadLevel(final JdbcSchema.Table.Column.Usage usage) {
            String name = usage.getSymbolicName();
            MondrianDef.Expression expression =
                new MondrianDef.Column(getName(), usage.levelColumnName);
            boolean isNumeric = usage.getColumn().isNumeric();
            int bitPosition = usage.rColumn.getBitPosition();

            Level level = new Level(name,
                                    expression,
                                    isNumeric,
                                    bitPosition);
            addLevel(level);
        }
        public void print(final PrintWriter pw, final String prefix) {
            pw.print(prefix);
            pw.println("Table:");
            String subprefix = prefix + "  ";
            String subsubprefix = subprefix + "  ";

            pw.print(subprefix);
            pw.print("name=");
            pw.println(getName());

            if (getRelation() != null) {
                pw.print(subprefix);
                pw.print("relation=");
                pw.println(getRelation());
            }

            pw.print(subprefix);
            pw.print("numberofrows=");
            pw.println(getNumberOfRows());

            pw.print(subprefix);
            pw.println("FactCount:");
            factCountColumn.print(pw, subsubprefix);
            pw.println();

            pw.print(subprefix);
            pw.println("Measures:");
            for (Iterator it = getMeasures(); it.hasNext(); ) {
                Column column = (Column) it.next();
                column.print(pw, subsubprefix);
                pw.println();
            }

            pw.print(subprefix);
            pw.println("Levels:");
            for (Iterator it = getLevels(); it.hasNext(); ) {
                Level level = (Level) it.next();
                level.print(pw, subsubprefix);
                pw.println();
            }

            for (Iterator it = getChildren(); it.hasNext(); ) {
                DimTable child = (DimTable) it.next();
                child.print(pw, subprefix);
            }
        }
        private void makeNumberOfRows() {
            SqlQuery query = getSqlQuery();
            query.addSelect("count(*)");
            query.addFrom(getRelation(), getName(), false);
            Connection conn = getJdbcConnection();
            try {
                ResultSet rs = null;
                try {
                    rs = RolapUtil.executeQuery(conn, query.toString(),
                                         "AggStar.FactTable.makeNumberOfRows");

                    if (rs.next()) {
                        numberOfRows = rs.getInt(1);
                    } else {
                        String msg = mres.SqlQueryFailed.str(
                                "AggStar.FactTable.makeNumberOfRows",
                                query.toString());
                        getLogger().warn(msg);

                        // set to large number so that this table is never used
                        numberOfRows = Integer.MAX_VALUE/getTotalColumnSize();
                    }
                } finally {
                    if (rs != null) {
                        rs.close();
                    }
                }
            } catch (SQLException ex) {
                // ignore
                getLogger().error(ex);
            } finally {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    // ignore
                }
            }
        }

    }

    /**
     * This class represents a dimension table.
     */
    public class DimTable extends Table {
        private final Table parent;
        private final JoinCondition joinCondition;

        DimTable(final Table parent,
                 final String name,
                 final MondrianDef.Relation relation,
                 final JoinCondition joinCondition) {
            super(name, relation);
            this.parent = parent;
            this.joinCondition = joinCondition;
        }
        public Table getParent() {
            return parent;
        }
        public boolean hasParent() {
            return true;
        }
        public boolean hasJoinCondition() {
            return true;
        }
        public Table.JoinCondition getJoinCondition() {
            return joinCondition;
        }


        /**
         * Add all of this Table's columns to the list parameter and then add
         * all child table columns.
         *
         * @param list
         */
        public void addColumnsToList(final List list) {
            list.addAll(levels);
            for (Iterator it = getChildren(); it.hasNext(); ) {
                DimTable dimTable = (DimTable) it.next();
                dimTable.addColumnsToList(list);
            }
        }
        public void print(final PrintWriter pw, final String prefix) {
            pw.print(prefix);
            pw.println("Table:");
            String subprefix = prefix + "  ";
            String subsubprefix = subprefix + "  ";

            pw.print(subprefix);
            pw.print("name=");
            pw.println(getName());

            if (getRelation() != null) {
                pw.print(subprefix);
                pw.print("relation=");
                pw.println(getRelation());
            }

            pw.print(subprefix);
            pw.println("Levels:");

            for (Iterator it = getLevels(); it.hasNext(); ) {
                Level level = (Level) it.next();
                level.print(pw, subsubprefix);
                pw.println();
            }

            joinCondition.print(pw, subprefix);

            for (Iterator it = getChildren(); it.hasNext(); ) {
                DimTable child = (DimTable) it.next();
                child.print(pw, subprefix);
            }
        }
    }

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

    /**
     * Print this AggStar.
     *
     * @param pw
     * @param prefix
     */
    public void print(final PrintWriter pw, final String prefix) {
        pw.print(prefix);
        pw.println("AggStar:");
        String subprefix = prefix + "  ";
        pw.print(subprefix);
        pw.println(bitKey);
        aggTable.print(pw, subprefix);
    }
}

⌨️ 快捷键说明

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