⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 select.java

📁 hsql是很有名的嵌入式数据库
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
        boolean[]     first     = new boolean[filter];        boolean[]     outerused = new boolean[filter];        int           level     = 0;        // fredt - shortcut needed by OpenOffice to speed up empty query processing for metadata        boolean notempty = !(queryCondition != null                             && queryCondition.isFixedConditional()                             &&!queryCondition.testCondition(session));        while (notempty && level >= 0) {            // perform a join            TableFilter t = tFilter[level];            boolean     found;            boolean     outerfound;            if (!first[level]) {                found = t.findFirst(session);                // if outer join, and no inner result, get next outer row                // nonJoinIsNull disallows getting the next outer row in some circumstances                outerused[level] = outerfound = t.isOuterJoin &&!found                                                &&!outerused[level]                                                &&!t.nonJoinIsNull                                                && t.nextOuter(session);                first[level] = found;            } else {                found = t.next(session);                outerused[level] = outerfound = t.isOuterJoin &&!found                                                &&!first[level]                                                &&!outerused[level]                                                &&!t.nonJoinIsNull                                                && t.nextOuter(session);                first[level] = found;            }            if (!found &&!outerfound) {                level--;                continue;            }            if (level < filter - 1) {                level++;                continue;            } else {                while (outerused[level]) {                    outerused[level--] = false;                }            }            // apply condition            if (queryCondition == null                    || queryCondition.testCondition(session)) {                try {                    Object[] row = new Object[len];                    // gets the group by column values first.                    for (int i = gResult.groupBegin; i < gResult.groupEnd;                            i++) {                        row[i] = exprColumns[i].getValue(session);                    }                    row = gResult.getRow(row);                    // Get all other values                    for (int i = 0; i < gResult.groupBegin; i++) {                        row[i] =                            isAggregated && exprColumns[i].isAggregate()                            ? exprColumns[i].updateAggregatingValue(session,                                row[i])                            : exprColumns[i].getValue(session);                    }                    for (int i = gResult.groupEnd; i < len; i++) {                        row[i] =                            isAggregated && exprColumns[i].isAggregate()                            ? exprColumns[i].updateAggregatingValue(session,                                row[i])                            : exprColumns[i].getValue(session);                    }                    gResult.addRow(row);                    if (gResult.size() >= limitcount) {                        break;                    }                } catch (HsqlInternalException e) {                    continue;                }            }        }        if (isAggregated &&!isGrouped && gResult.size() == 0) {            Object[] row = new Object[len];            for (int i = 0; i < len; i++) {                row[i] = exprColumns[i].isAggregate() ? null                                                      : exprColumns[i]                                                      .getValue(session);            }            gResult.addRow(row);        }        Iterator it = gResult.iterator();        while (it.hasNext()) {            Object[] row = (Object[]) it.next();            if (isAggregated) {                for (int i = 0; i < len; i++) {                    if (exprColumns[i].isAggregate()) {                        row[i] = exprColumns[i].getAggregatedValue(session,                                row[i]);                    }                }            }            if (iHavingLen > 0) {                // The test value, either aggregate or not, is set already.                // Removes the row that does not satisfy the HAVING                // condition.                if (!Boolean.TRUE.equals(row[iResultLen + iGroupLen])) {                    it.remove();                }            }        }        return gResult.getResult();    }    /**     * Skeleton under development. Needs a lot of work.     */    public StringBuffer getDDL() throws HsqlException {        StringBuffer sb = new StringBuffer();        sb.append(Token.T_SELECT).append(' ');        //limitStart;        //limitCount;        for (int i = 0; i < iResultLen; i++) {            sb.append(exprColumns[i].getDDL());            if (i < iResultLen - 1) {                sb.append(',');            }        }        sb.append(Token.T_FROM);        for (int i = 0; i < tFilter.length; i++) {            // find out if any expression in any of the filters isInJoin then use this form            TableFilter filter = tFilter[i];            // if any expression isInJoin            if (i != 0) {                if (filter.isOuterJoin) {                    sb.append(Token.T_FROM).append(' ');                    sb.append(Token.T_JOIN).append(' ');                }                // eStart and eEnd expressions            }            // otherwise use a comma delimited table list            sb.append(',');        }        // if there are any expressions that are not isInJoin        sb.append(' ').append(Token.T_WHERE).append(' ');        for (int i = 0; i < tFilter.length; i++) {            TableFilter filter = tFilter[i];            // eStart and eEnd expressions that are not isInJoin        }        // if has GROUP BY        sb.append(' ').append(Token.T_GROUP).append(' ');        for (int i = iResultLen; i < iResultLen + iGroupLen; i++) {            sb.append(exprColumns[i].getDDL());            if (i < iResultLen + iGroupLen - 1) {                sb.append(',');            }        }        // if has HAVING        sb.append(' ').append(Token.T_HAVING).append(' ');        for (int i = iResultLen + iGroupLen;                i < iResultLen + iGroupLen + iHavingLen; i++) {            sb.append(exprColumns[i].getDDL());            if (i < iResultLen + iGroupLen - 1) {                sb.append(',');            }        }        if (unionSelect != null) {            switch (unionType) {                case EXCEPT :                    sb.append(' ').append(Token.T_EXCEPT).append(' ');                    break;                case INTERSECT :                    sb.append(' ').append(Token.T_INTERSECT).append(' ');                    break;                case UNION :                    sb.append(' ').append(Token.T_UNION).append(' ');                    break;                case UNIONALL :                    sb.append(' ').append(Token.T_UNION).append(' ').append(                        Token.T_ALL).append(' ');                    break;            }        }        // if has ORDER BY        int groupByEnd   = iResultLen + iGroupLen;        int orderByStart = groupByEnd + iHavingLen;        int orderByEnd   = orderByStart + iOrderLen;        sb.append(' ').append(Token.T_ORDER).append(Token.T_BY).append(' ');        for (int i = orderByStart; i < orderByEnd; i++) {            sb.append(exprColumns[i].getDDL());            if (i < iResultLen + iGroupLen - 1) {                sb.append(',');            }        }        return sb;    }    boolean isResolved = false;    boolean resolveAll(Session session, boolean check) throws HsqlException {        boolean result = true;        if (isResolved) {            return true;        }        resolve(session);        result = result && checkResolved(check);        if (unionSelect != null) {            if (unionSelect.iResultLen != iResultLen) {                throw Trace.error(Trace.COLUMN_COUNT_DOES_NOT_MATCH);            }            unionSelect.resolveAll(session, check);        }        isResolved = result;        return result;    }    boolean isResolved() {        return isResolved;    }    public String describe(Session session) {        StringBuffer sb;        String       temp;        // temporary :  it is currently unclear whether this may affect        // later attempts to retrieve an actual result (calls getResult(1)        // in preProcess mode).  Thus, toString() probably should not be called        // on Select objects that will actually be used to retrieve results,        // only on Select objects used by EXPLAIN PLAN FOR        try {            getResult(session, 1);        } catch (HsqlException e) {}        sb = new StringBuffer();        sb.append(super.toString()).append("[\n");        if (sIntoTable != null) {            sb.append("into table=[").append(sIntoTable.name).append("]\n");        }        if (limitCondition != null) {            sb.append("offset=[").append(                limitCondition.getArg().describe(session)).append("]\n");            sb.append("limit=[").append(                limitCondition.getArg2().describe(session)).append("]\n");        }        sb.append("isDistinctSelect=[").append(isDistinctSelect).append(            "]\n");        sb.append("isGrouped=[").append(isGrouped).append("]\n");        sb.append("isAggregated=[").append(isAggregated).append("]\n");        sb.append("columns=[");        int columns = exprColumns.length - iOrderLen;        for (int i = 0; i < columns; i++) {            sb.append(exprColumns[i].describe(session));        }        sb.append("\n]\n");        sb.append("tableFilters=[\n");        for (int i = 0; i < tFilter.length; i++) {            sb.append("[\n");            sb.append(tFilter[i].describe(session));            sb.append("\n]");        }        sb.append("]\n");        temp = queryCondition == null ? "null"                                      : queryCondition.describe(session);        sb.append("eCondition=[").append(temp).append("]\n");        temp = havingCondition == null ? "null"                                       : havingCondition.describe(session);        sb.append("havingCondition=[").append(temp).append("]\n");        sb.append("groupColumns=[").append(groupColumnNames).append("]\n");        if (unionSelect != null) {            switch (unionType) {                case EXCEPT :                    sb.append(" EXCEPT ");                    break;                case INTERSECT :                    sb.append(" INTERSECT ");                    break;                case UNION :                    sb.append(" UNION ");                    break;                case UNIONALL :                    sb.append(" UNION ALL ");                    break;                default :                    sb.append(" UNKNOWN SET OPERATION ");            }            sb.append("[\n").append(unionSelect.describe(session)).append(                "]\n");        }        return sb.toString();    }    Result describeResult() {        Result                r;        Result.ResultMetaData rmd;        Expression            e;        r   = new Result(ResultConstants.DATA, iResultLen);        rmd = r.metaData;        for (int i = 0; i < iResultLen; i++) {            e                    = exprColumns[i];            rmd.colTypes[i]      = e.getDataType();            rmd.colSizes[i]      = e.getColumnSize();            rmd.colScales[i]     = e.getColumnScale();            rmd.colLabels[i]     = e.getAlias();            rmd.isLabelQuoted[i] = e.isAliasQuoted();            rmd.tableNames[i]    = e.getTableName();            rmd.colNames[i]      = e.getColumnName();            if (rmd.isTableColumn(i)) {                rmd.colNullable[i] = e.nullability;                rmd.isIdentity[i]  = e.isIdentity;                rmd.isWritable[i]  = e.isWritable;            }        }        return r;    }}

⌨️ 快捷键说明

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