The R Project SVN R-packages

Rev

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

Rev 3446 Rev 3456
Line 34... Line 34...
34
    /* set list values */
34
    /* set list values */
35
    SET_VECTOR_ELT(ret, 0, mkString(iname));
35
    SET_VECTOR_ELT(ret, 0, mkString(iname));
36
    SET_VECTOR_ELT(ret, 1, mkString(varname));
36
    SET_VECTOR_ELT(ret, 1, mkString(varname));
37
 
37
 
38
    /* set sexp class */
38
    /* set sexp class */
39
    if (strcmp(type, "ordered") == 0) {
-
 
40
        PROTECT(value = NEW_CHARACTER(3)); nprotected++;
-
 
41
        SET_VECTOR_ELT(value, 0, mkChar("sqlite.vector"));
39
    SET_CLASS(ret, mkString("sqlite.vector"));
-
 
40
 
42
        SET_VECTOR_ELT(value, 1, mkChar(type));
41
    /* set sdf.vector.type */
43
        SET_VECTOR_ELT(value, 2, mkChar("factor"));
-
 
44
    } else {
-
 
45
        PROTECT(value = NEW_CHARACTER(2)); nprotected++;
-
 
46
        SET_VECTOR_ELT(value, 0, mkChar("sqlite.vector"));
-
 
47
        SET_VECTOR_ELT(value, 1, mkChar(type));
42
    SET_SDFVECTORTYPE(ret, mkString(type));
48
        SET_CLASS(ret, value);
-
 
49
    }
-
 
50
 
43
 
51
    UNPROTECT(nprotected);
44
    UNPROTECT(nprotected);
52
 
45
 
53
    return ret;
46
    return ret;
54
}
47
}
Line 105... Line 98...
105
 
98
 
106
/****************************************************************************
99
/****************************************************************************
107
 * SVEC FUNCTIONS
100
 * SVEC FUNCTIONS
108
 ****************************************************************************/
101
 ****************************************************************************/
109
SEXP sdf_get_variable(SEXP sdf, SEXP name) {
102
SEXP sdf_get_variable(SEXP sdf, SEXP name) {
-
 
103
    char *iname, *varname, *svec_type = NULL;
-
 
104
    const char *coltype;
-
 
105
    int type = -1, res, nprotected = 0;
-
 
106
    SEXP ret, value;
-
 
107
 
110
    if (!IS_CHARACTER(name)) {
108
    if (!IS_CHARACTER(name)) {
111
        Rprintf("ERROR: argument is not a string.\n");
109
        Rprintf("ERROR: argument is not a string.\n");
112
        return R_NilValue;
110
        return R_NilValue;
113
    }
111
    }
114
 
112
 
115
    char *iname = SDF_INAME(sdf);
113
    iname = SDF_INAME(sdf);
116
    char *varname = CHAR_ELT(name, 0);
114
    varname = CHAR_ELT(name, 0);
117
 
115
 
118
    if (!USE_SDF1(iname, TRUE, FALSE)) return R_NilValue;
116
    if (!USE_SDF1(iname, TRUE, FALSE)) return R_NilValue;
119
 
117
 
120
    /* check if sdf & varname w/in that sdf exists */
118
    /* check if sdf & varname w/in that sdf exists */
121
    sqlite3_stmt *stmt;
119
    sqlite3_stmt *stmt;
122
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data", varname, iname);
120
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data", varname, iname);
123
 
121
 
124
    int res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
122
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
125
 
123
 
126
    if (_sqlite_error(res)) return R_NilValue;
124
    if (_sqlite_error(res)) return R_NilValue;
127
 
125
 
128
    const char *coltype = sqlite3_column_decltype(stmt, 0);
126
    coltype = sqlite3_column_decltype(stmt, 0);
129
    sqlite3_finalize(stmt);
127
    sqlite3_finalize(stmt);
130
 
-
 
131
 
128
    
132
    SEXP ret, value, class = R_NilValue; int nprotected = 0;
-
 
133
    PROTECT(ret = NEW_LIST(2)); nprotected++;
129
    PROTECT(ret = NEW_LIST(2)); nprotected++;
134
 
130
 
135
    /* set list names */
131
    /* set list names */
136
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
132
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
137
    SET_STRING_ELT(value, 0, mkChar("iname"));
133
    SET_STRING_ELT(value, 0, mkChar("iname"));
Line 141... Line 137...
141
    /* set list values */
137
    /* set list values */
142
    SET_VECTOR_ELT(ret, 0, mkString(iname));
138
    SET_VECTOR_ELT(ret, 0, mkString(iname));
143
    SET_VECTOR_ELT(ret, 1, mkString(varname));
139
    SET_VECTOR_ELT(ret, 1, mkString(varname));
144
 
140
 
145
    /* set class */
141
    /* set class */
146
    int type = -1;
-
 
147
    if (strcmp(coltype, "text") == 0) class = mkChar("character");
142
    if (strcmp(coltype, "text") == 0) svec_type = "character";
148
    else if (strcmp(coltype, "double") == 0) class = mkChar("numeric");
143
    else if (strcmp(coltype, "double") == 0) svec_type = "numeric";
149
    else if (strcmp(coltype, "bit") == 0) class = mkChar("logical");
144
    else if (strcmp(coltype, "bit") == 0) svec_type = "logical";
150
    else if (strcmp(coltype, "integer") == 0 || strcmp(coltype, "int") == 0) {
145
    else if (strcmp(coltype, "integer") == 0 || strcmp(coltype, "int") == 0) {
151
        /* determine if int, factor or ordered */
146
        /* determine if int, factor or ordered */
152
        type = _get_factor_levels1(iname, varname, ret);
147
        type = _get_factor_levels1(iname, varname, ret);
153
        switch(type) {
148
        switch(type) {
154
            case VAR_INTEGER: class = mkChar("integer"); break;
149
            case VAR_INTEGER: svec_type = "integer"; break;
155
            case VAR_FACTOR: class = mkChar("factor"); break;
150
            case VAR_FACTOR: svec_type = "factor"; break;
156
            case VAR_ORDERED: class = mkChar("ordered");
151
            case VAR_ORDERED: svec_type = "ordered";
157
        }
152
        }
158
 
153
 
159
    }
154
    }
160
 
155
 
161
    if (type != VAR_ORDERED) {
-
 
162
        PROTECT(value = NEW_CHARACTER(2)); nprotected++;
-
 
163
        SET_STRING_ELT(value, 0, mkChar("sqlite.vector"));
156
    SET_CLASS(ret, mkString("sqlite.vector"));
164
        SET_STRING_ELT(value, 1, class);
-
 
165
    } else {
-
 
166
        PROTECT(value = NEW_CHARACTER(3)); nprotected++;
-
 
167
        SET_STRING_ELT(value, 0, mkChar("sqlite.vector"));
-
 
168
        SET_STRING_ELT(value, 1, class);
-
 
169
        SET_STRING_ELT(value, 2, mkChar("factor"));
157
    SET_SDFVECTORTYPE(ret, mkString(svec_type));
170
    }
-
 
171
    SET_CLASS(ret, value);
-
 
172
 
158
 
173
    UNPROTECT(nprotected);
159
    UNPROTECT(nprotected);
174
    return ret;
160
    return ret;
175
 
161
 
176
}
162
}
Line 312... Line 298...
312
    if (ret != R_NilValue) {
298
    if (ret != R_NilValue) {
313
        ret = _shrink_vector(ret, retlen);
299
        ret = _shrink_vector(ret, retlen);
314
        tmp = GET_LEVELS(svec);
300
        tmp = GET_LEVELS(svec);
315
        if (tmp != R_NilValue) {
301
        if (tmp != R_NilValue) {
316
            SET_LEVELS(ret, duplicate(tmp));
302
            SET_LEVELS(ret, duplicate(tmp));
317
            if (LENGTH(GET_CLASS(svec)) == 2) {
303
            if (TEST_SDFVECTORTYPE(svec, "factor")) {
318
                SET_CLASS(ret, mkString("factor"));
304
                SET_CLASS(ret, mkString("factor"));
319
            } else {
305
            } else {
320
                PROTECT(tmp = NEW_CHARACTER(2));
306
                PROTECT(tmp = NEW_CHARACTER(2));
321
                SET_STRING_ELT(tmp, 0, mkChar("ordered"));
307
                SET_STRING_ELT(tmp, 0, mkChar("ordered"));
322
                SET_STRING_ELT(tmp, 1, mkChar("factor"));
308
                SET_STRING_ELT(tmp, 1, mkChar("factor"));
Line 356... Line 342...
356
 
342
 
357
    iname = SDF_INAME(svec);
343
    iname = SDF_INAME(svec);
358
    varname = SVEC_VARNAME(svec);
344
    varname = SVEC_VARNAME(svec);
359
    USE_SDF1(iname, TRUE, FALSE);
345
    USE_SDF1(iname, TRUE, FALSE);
360
 
346
 
361
    if ((inherits(svec, "ordered") && ((type = "ordered"))) ||
347
    if ((TEST_SDFVECTORTYPE(svec, "ordered") && ((type = "ordered"))) ||
362
            (inherits(svec, "factor") && ((type = "factor")))) {
348
            (TEST_SDFVECTORTYPE(svec, "factor") && ((type = "factor")))) {
363
        int nrows, i, max_rows = INTEGER(maxsum)[0];
349
        int nrows, i, max_rows = INTEGER(maxsum)[0];
364
 
350
 
365
 
351
 
366
        sprintf(g_sql_buf[0], "[%s].[%s %s]", iname, type, varname);
352
        sprintf(g_sql_buf[0], "[%s].[%s %s]", iname, type, varname);
367
        nrows = _get_row_count2(g_sql_buf[0], FALSE);
353
        nrows = _get_row_count2(g_sql_buf[0], FALSE);
Line 390... Line 376...
390
            while (sqlite3_step(stmt) == SQLITE_ROW) {
376
            while (sqlite3_step(stmt) == SQLITE_ROW) {
391
                others_sum += sqlite3_column_int(stmt, 1);
377
                others_sum += sqlite3_column_int(stmt, 1);
392
            }
378
            }
393
            INTEGER(ret)[nrows-1] = others_sum;
379
            INTEGER(ret)[nrows-1] = others_sum;
394
        }
380
        }
395
    } else if (inherits(svec, "logical")) {
381
    } else if (TEST_SDFVECTORTYPE(svec, "logical")) {
396
        sprintf(g_sql_buf[0], "select count(*) from "
382
        sprintf(g_sql_buf[0], "select count(*) from "
397
                "[%s].sdf_data group by [%s] order by [%s]", iname, varname, varname);
383
                "[%s].sdf_data group by [%s] order by [%s]", iname, varname, varname);
398
 
384
 
399
        PROTECT(names = NEW_CHARACTER(3)); nprotected = 1;
385
        PROTECT(names = NEW_CHARACTER(3)); nprotected = 1;
400
        PROTECT(ret = NEW_CHARACTER(3)); nprotected++;
386
        PROTECT(ret = NEW_CHARACTER(3)); nprotected++;
Line 1035... Line 1021...
1035
            "order by [%s] %s", iname, varname_src, iname_src, varname_src,
1021
            "order by [%s] %s", iname, varname_src, iname_src, varname_src,
1036
            (LOGICAL(decreasing)[0]) ? "desc" : "asc");
1022
            (LOGICAL(decreasing)[0]) ? "desc" : "asc");
1037
    res = _sqlite_exec(g_sql_buf[0]);
1023
    res = _sqlite_exec(g_sql_buf[0]);
1038
    _sqlite_error(res);
1024
    _sqlite_error(res);
1039
 
1025
 
1040
    if (inherits(svec, "factor")) { /* copy factor table to iname */
1026
    if (TEST_SDFVECTORTYPE(svec, "factor")) { /* copy factor table to iname */
1041
        if (inherits(svec, "ordered")) type = "ordered";
1027
        if (TEST_SDFVECTORTYPE(svec, "ordered")) type = "ordered";
1042
        else type = "factor";
1028
        else type = "factor";
1043
        _copy_factor_levels2(type, iname_src, varname_src, iname, "V1");
1029
        _copy_factor_levels2(type, iname_src, varname_src, iname, "V1");
1044
    } else type = CHAR_ELT(GET_CLASS(svec), 1);
1030
    } else type = CHAR_ELT(GET_CLASS(svec), 1);
1045
 
1031
 
1046
    UNUSE_SDF2(iname_src);
1032
    UNUSE_SDF2(iname_src);