The R Project SVN R-packages

Rev

Rev 3684 | Rev 4160 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3684 Rev 3808
Line 1089... Line 1089...
1089
    return ret;
1089
    return ret;
1090
}
1090
}
1091
 
1091
 
1092
 
1092
 
1093
SEXP sdf_sort_variable(SEXP svec, SEXP decreasing) {
1093
SEXP sdf_sort_variable(SEXP svec, SEXP decreasing) {
1094
    char *iname, *iname_src, *varname_src, *type;
1094
    char *iname, *tblname, *varname, *type, *sort_type, *iname2;
1095
    sqlite3_stmt *stmt;
1095
    sqlite3_stmt *stmt;
1096
    int res;
1096
    int res;
1097
 
1097
 
1098
    iname_src = SDF_INAME(svec);
1098
    iname = SDF_INAME(svec);
-
 
1099
    tblname = SVEC_TBLNAME(svec);
1099
    varname_src = SVEC_VARNAME(svec);
1100
    varname = SVEC_VARNAME(svec);
1100
 
1101
 
1101
    if (!USE_SDF1(iname_src, TRUE, TRUE)) return R_NilValue;
1102
    if (!USE_SDF1(iname, TRUE, TRUE)) return R_NilValue;
1102
 
1103
 
1103
    /* determine type of svec */
1104
    /* determine type of svec */
1104
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data limit 1", varname_src, iname_src);
1105
    sprintf(g_sql_buf[0], "select [%s] from [%s].[%s] limit 1", varname, iname, tblname);
1105
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
1106
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
1106
    _sqlite_error(res);
1107
    _sqlite_error(res);
1107
    sqlite3_step(stmt);
1108
    sqlite3_step(stmt);
1108
    strcpy(g_sql_buf[0], sqlite3_column_decltype(stmt, 0));
1109
    strcpy(g_sql_buf[0], sqlite3_column_decltype(stmt, 0));
1109
    sqlite3_finalize(stmt);
1110
    sqlite3_finalize(stmt);
1110
 
1111
 
1111
    /* create a new vector of that type */
-
 
1112
    iname = _create_svector1(mkString("tmp_sort"), g_sql_buf[0], NULL, TRUE);
-
 
1113
 
-
 
1114
    /* insert to new sdf ordered */
-
 
1115
    sprintf(g_sql_buf[0], "insert into [%s].sdf_data "
-
 
1116
            "select [row name], [%s] from [%s].sdf_data "
-
 
1117
            "order by [%s] %s", iname, varname_src, iname_src, varname_src,
-
 
1118
            (LOGICAL(decreasing)[0]) ? "desc" : "asc");
-
 
1119
    res = _sqlite_exec(g_sql_buf[0]);
-
 
1120
    _sqlite_error(res);
-
 
1121
 
-
 
1122
    if (TEST_SDFVECTORTYPE(svec, "factor")) { /* copy factor table to iname */
1112
    if (TEST_SDFVECTORTYPE(svec, "factor")) { /* copy factor table to iname */
1123
        if (TEST_SDFVECTORTYPE(svec, "ordered")) type = "ordered";
1113
        if (TEST_SDFVECTORTYPE(svec, "ordered")) type = "ordered";
1124
        else type = "factor";
1114
        else type = "factor";
1125
        _copy_factor_levels2(type, iname_src, varname_src, iname, "V1");
1115
        _copy_factor_levels2(type, iname, varname, iname, "V1");
1126
    } else type = CHAR_ELT(GET_SDFVECTORTYPE(svec), 0);
1116
    } else type = CHAR_ELT(GET_SDFVECTORTYPE(svec), 0);
1127
 
1117
 
-
 
1118
    if (strcmp(tblname, "sdf_data") == 0) {
-
 
1119
        /* cache sorted data if column to be sorted comes from main sdf_data */
-
 
1120
 
-
 
1121
        /* test if there is already a sort_varname table */
-
 
1122
        sort_type = (LOGICAL(decreasing)[0]) ? "desc" : "asc";
-
 
1123
        sprintf(g_sql_buf[1], "select count(*) from [%s].sqlite_master "
-
 
1124
                "where type='table' and name='sort_%s_%s'", iname, sort_type, varname);
-
 
1125
        sqlite3_prepare(g_workspace, g_sql_buf[1], -1, &stmt, NULL);
-
 
1126
        sqlite3_step(stmt);
-
 
1127
        res = sqlite3_column_int(stmt, 0);
1128
    UNUSE_SDF2(iname_src);
1128
        sqlite3_finalize(stmt);
-
 
1129
 
-
 
1130
        if (res == 0) {
-
 
1131
            sprintf(g_sql_buf[1], "create table [%s].[sort_%s_%s] ([%s] %s)", 
-
 
1132
                    iname, sort_type, varname, varname, g_sql_buf[0]);
-
 
1133
            if (_sqlite_error(_sqlite_exec(g_sql_buf[1]))) 
-
 
1134
                    error("Can't create table: %s", g_sql_buf[1]);
-
 
1135
 
-
 
1136
            /* insert to new sdf ordered */
-
 
1137
            sprintf(g_sql_buf[0], "insert into [%s].[sort_%s_%s] "
-
 
1138
                    "select [%s] from [%s].[%s] order by [%s] %s", 
-
 
1139
                    iname, sort_type, varname, varname, iname, tblname, varname, sort_type);
-
 
1140
                    
-
 
1141
            res = _sqlite_exec(g_sql_buf[0]);
-
 
1142
            if (_sqlite_error(res)) error("Can't insert: %s", g_sql_buf[0]);
-
 
1143
        }
-
 
1144
 
1129
    UNUSE_SDF2(iname);
1145
        UNUSE_SDF2(iname);
-
 
1146
        sprintf(g_sql_buf[0], "sort_%s_%s", sort_type, varname);
-
 
1147
        return _create_svector_sexp(iname, g_sql_buf[0], varname, type);
-
 
1148
    } else {
-
 
1149
        /* create a new sdf table, copy data to that */
-
 
1150
 
-
 
1151
        /* create a sorted column */
-
 
1152
 
-
 
1153
        error("Not yet supported.");
-
 
1154
    }
1130
 
1155
 
1131
    return _create_svector_sexp(iname, "sdf_data", "V1", type);
1156
    return R_NilValue;
1132
}
1157
}
1133
 
1158
 
1134
/****************************************************************************
1159
/****************************************************************************
1135
 * VECTOR MATH/OPS/GROUP OPERATIONS
1160
 * VECTOR MATH/OPS/GROUP OPERATIONS
1136
 ****************************************************************************/
1161
 ****************************************************************************/