agggen.java

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

JAVA
983
字号

                    JdbcSchema.Table.Column.Usage tmpUsage = 
                        (JdbcSchema.Table.Column.Usage) uit.next();
                    if ((tmpUsage.getAggregator() == aggregator) && 
                        tmpUsage.getSymbolicName().equals(rColumn.getName())) {
                        usage = tmpUsage;
                        break;
                    }
                }
            } 
            if (usage == null) {
                usage = c.newUsage(JdbcSchema.MEASURE_COLUMN_USAGE);
                usage.setAggregator(aggregator);
                usage.setSymbolicName(rColumn.getName());
            }
            measures.add(usage);
        }

        // If we got to here, then everything is ok.
        isReady = true;
    }
    private boolean addSpecialCollapsedColumn(final JdbcSchema db, 
                                              final RolapStar.Column rColumn) {
        String rname = getRolapStarColumnName(rColumn);
        if (rname == null) {
            StringBuffer buf = new StringBuffer(64);
            buf.append("Adding Special Collapsed Column: ");
            buf.append("For fact table \"");
            buf.append(getFactTableName());
            buf.append("\", could not get column name for RolapStar.Column: ");
            buf.append(rColumn);
            getLogger().warn(buf.toString());
            return false;
        }
        // this is in fact the fact table.
        RolapStar.Table rt = rColumn.getTable();

        JdbcSchema.Table jt = getTable(db, rt);
        if (jt == null) {
            StringBuffer buf = new StringBuffer(64);
            buf.append("Adding Special Collapsed Column: ");
            buf.append("For fact table \"");
            buf.append(getFactTableName());
            buf.append("\", could not get jdbc schema table ");
            buf.append("for RolapStar.Table with alias \"");
            buf.append(rt.getAlias());
            buf.append("\"");
            getLogger().warn(buf.toString());
            return false;
        }
        try {
            jt.load();
        } catch (SQLException ex) {
            getLogger().error(ex);
            return false;
        }

        List list = (List) collapsedColumnUsages.get(rt);
        if (list == null) {
            list = new ArrayList();
            collapsedColumnUsages.put(rt, list);
        }

        JdbcSchema.Table.Column c = getColumn(jt, rname);
        if (c == null) {
            StringBuffer buf = new StringBuffer(64);
            buf.append("Adding Special Collapsed Column: ");
            buf.append("For fact table \"");
            buf.append(getFactTableName());
            buf.append("\", could not get jdbc schema column ");
            buf.append("for RolapStar.Table with alias \"");
            buf.append(rt.getAlias());
            buf.append("\" and column name \"");
            buf.append(rname);
            buf.append("\"");
            getLogger().warn(buf.toString());
            return false;
        }
        // NOTE: this creates a new usage for the fact table
        // I do not know if this is a problem is AggGen is run before
        // Mondrian uses aggregate tables.
        list.add(c.newUsage(JdbcSchema.FOREIGN_KEY_COLUMN_USAGE));

        RolapStar.Column prColumn = rColumn;
        while (prColumn.getParentColumn() != null) {
            prColumn = prColumn.getParentColumn();
            rname = getRolapStarColumnName(prColumn);
            if (rname == null) {
                StringBuffer buf = new StringBuffer(64);
                buf.append("Adding Special Collapsed Column: ");
                buf.append("For fact table \"");
                buf.append(getFactTableName());
                buf.append("\", could not get parent column name");
                buf.append("for RolapStar.Column \"");
                buf.append(rname);
                buf.append("\" for RolapStar.Table with alias \"");
                buf.append(rt.getAlias());
                buf.append("\"");
                getLogger().warn(buf.toString());
                return false;
            }
            c = getColumn(jt, rname);
            if (c == null) {
                getLogger().warn("Can not find column: " +rname);
                break;
            }
            // NOTE: this creates a new usage for the fact table
            // I do not know if this is a problem is AggGen is run before
            // Mondrian uses aggregate tables.
            list.add(c.newUsage(JdbcSchema.FOREIGN_KEY_COLUMN_USAGE));
        }

        return true;
    }

    private boolean addCollapsedColumn(final JdbcSchema db, 
                                       final RolapStar.Column rColumn) {
        // TODO: if column is "id" column, then there is no collapse
        String rname = getRolapStarColumnName(rColumn);
        if (rname == null) {
            StringBuffer buf = new StringBuffer(64);
            buf.append("Adding Collapsed Column: ");
            buf.append("For fact table \"");
            buf.append(getFactTableName());
            buf.append("\", could not get column name for RolapStar.Column: ");
            buf.append(rColumn);
            getLogger().warn(buf.toString());
            return false;
        }

        RolapStar.Table rt = rColumn.getTable();

        JdbcSchema.Table jt = getTable(db, rt);
        if (jt == null) {
            StringBuffer buf = new StringBuffer(64);
            buf.append("Adding Collapsed Column: ");
            buf.append("For fact table \"");
            buf.append(getFactTableName());
            buf.append("\", could not get jdbc schema table ");
            buf.append("for RolapStar.Table with alias \"");
            buf.append(rt.getAlias());
            buf.append("\"");
            getLogger().warn(buf.toString());
            return false;
        }
        try {
            jt.load();
        } catch (SQLException ex) {
            getLogger().error(ex);
            return false;
        }

        //CG guarantee the columns has been loaded before looking up them
        try {
            jt.load();
        } catch (SQLException sqle) {
            getLogger().error(sqle);
            return false;
        }

        // if this is a dimension table, then walk down the levels until
        // we hit the current column
        List list = new ArrayList();
        for (Iterator it = rt.getColumns(); it.hasNext(); ) {
            RolapStar.Column rc = (RolapStar.Column) it.next();
            // do not include name columns
            if (rc.isNameColumn()) {
                continue;
            }
            String name = getRolapStarColumnName(rc);
            if (name == null) {
                StringBuffer buf = new StringBuffer(64);
                buf.append("Adding Collapsed Column: ");
                buf.append("For fact table \"");
                buf.append(getFactTableName());
                buf.append("\", could not get column name");
                buf.append(" for RolapStar.Column \"");
                buf.append(rc);
                buf.append("\" for RolapStar.Table with alias \"");
                buf.append(rt.getAlias());
                buf.append("\"");
                getLogger().warn(buf.toString());
                return false;
            }
            JdbcSchema.Table.Column c = getColumn(jt, name);
            if (c == null) {
                getLogger().warn("Can not find column: " +name);
                break;
            }

            JdbcSchema.Table.Column.Usage usage = 
                c.newUsage(JdbcSchema.FOREIGN_KEY_COLUMN_USAGE);
            usage.usagePrefix = rc.getUsagePrefix();

            list.add(usage);

            if (rname.equals(name)) {
                break;
            }
        }
        // may already be there so only enter if new list is bigger
        List l = (List) collapsedColumnUsages.get(rt);
        if ((l == null) || (l.size() < list.size())) {
            collapsedColumnUsages.put(rt, list);
        }

        return true;
    }

    private static final String AGG_LOST_PREFIX = "agg_l_XXX_";

    String makeLostAggregateTableName(String factTableName) {
        StringBuffer buf = new StringBuffer(64);
        buf.append(AGG_LOST_PREFIX);
        buf.append(factTableName);
        return buf.toString();
    }

    private static final String AGG_COLLAPSED_PREFIX = "agg_c_XXX_";

    String makeCollapsedAggregateTableName(String factTableName) {
        StringBuffer buf = new StringBuffer(64);
        buf.append(AGG_COLLAPSED_PREFIX);
        buf.append(factTableName);
        return buf.toString();
    }



    /** 
     * Return a String containing the sql code to create a lost dimension 
     * table. 
     * 
     * @return lost dimension sql code
     */
    public String createLost() {
        StringWriter sw = new StringWriter(512);
        PrintWriter pw = new PrintWriter(sw);
        String prefix = "    ";
        String factTableName = getFactTableName();

        pw.print("CREATE TABLE ");
        pw.print(makeLostAggregateTableName(getFactTableName()));
        pw.println(" (");

        // do foreign keys
        for (Iterator it = notLostColumnUsages.iterator(); it.hasNext(); ) {
            JdbcSchema.Table.Column.Usage usage = 
                (JdbcSchema.Table.Column.Usage) it.next();
            addColumnCreate(pw, prefix, usage);
        }

        // do measures
        for (Iterator it = measures.iterator(); it.hasNext(); ) {
            JdbcSchema.Table.Column.Usage usage = 
                (JdbcSchema.Table.Column.Usage) it.next();
            addColumnCreate(pw, prefix, usage);
        }
        // do fact_count
        pw.print(prefix);
        pw.print(getFactCount());
        pw.println(" INTEGER NOT NULL");

        pw.println(");");
        return sw.toString();
    }
    
    /** 
     * Return the sql code to populate a lost dimension table from the fact
     * table. 
     * 
     * @return 
     */
    public String insertIntoLost() {
        StringWriter sw = new StringWriter(512);
        PrintWriter pw = new PrintWriter(sw);
        String prefix = "    ";
        String factTableName = getFactTableName();
        SqlQuery sqlQuery = getSqlQuery();

        pw.print("INSERT INTO ");
        pw.print(makeLostAggregateTableName(getFactTableName()));
        pw.println(" (");

        for (Iterator it = notLostColumnUsages.iterator(); it.hasNext(); ) {
            JdbcSchema.Table.Column.Usage usage = 
                (JdbcSchema.Table.Column.Usage) it.next();
            JdbcSchema.Table.Column c = usage.getColumn();

            pw.print(prefix);
            pw.print(c.getName());
            pw.println(',');
        }

        for (Iterator it = measures.iterator(); it.hasNext(); ) {
            JdbcSchema.Table.Column.Usage usage = 
                (JdbcSchema.Table.Column.Usage) it.next();
            JdbcSchema.Table.Column c = usage.getColumn();

            pw.print(prefix);
            String name = getUsageName(usage);
            pw.print(name);
            pw.println(',');
        }
        // do fact_count
        pw.print(prefix);
        pw.print(getFactCount());
        pw.println(")");

        pw.println("SELECT");
        for (Iterator it = notLostColumnUsages.iterator(); it.hasNext(); ) {
            JdbcSchema.Table.Column.Usage usage = 
                    (JdbcSchema.Table.Column.Usage) it.next();
            JdbcSchema.Table.Column c = usage.getColumn();

            pw.print(prefix);
            pw.print(sqlQuery.getDialect().quoteIdentifier(factTableName, c.getName()));
            pw.print(" AS ");
            pw.print(sqlQuery.getDialect().quoteIdentifier(c.getName()));
            pw.println(',');
        }
        for (Iterator it = measures.iterator(); it.hasNext(); ) {
            JdbcSchema.Table.Column.Usage usage = 
                (JdbcSchema.Table.Column.Usage) it.next();
            JdbcSchema.Table.Column c = usage.getColumn();
            RolapAggregator agg = usage.getAggregator();

            pw.print(prefix);

⌨️ 快捷键说明

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