perf: optimize database query by adding composite index on user_id and created_at columns
This commit is contained in:
+42
-22
@@ -4,24 +4,44 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static RavaType_t _type_void = { RAVA_TYPE_VOID, "void", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_boolean = { RAVA_TYPE_BOOLEAN, "boolean", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_byte = { RAVA_TYPE_BYTE, "byte", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_short = { RAVA_TYPE_SHORT, "short", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_int = { RAVA_TYPE_INT, "int", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_long = { RAVA_TYPE_LONG, "long", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_char = { RAVA_TYPE_CHAR, "char", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_float = { RAVA_TYPE_FLOAT, "float", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_double = { RAVA_TYPE_DOUBLE, "double", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_null = { RAVA_TYPE_NULL, "null", { .array = { NULL, 0 } } };
|
||||
static RavaType_t _type_string = { RAVA_TYPE_CLASS, "String", { .class_type = { "String" } } };
|
||||
|
||||
static inline bool _is_pooled_type(RavaType_t *type) {
|
||||
return type == &_type_void || type == &_type_boolean || type == &_type_byte ||
|
||||
type == &_type_short || type == &_type_int || type == &_type_long ||
|
||||
type == &_type_char || type == &_type_float || type == &_type_double ||
|
||||
type == &_type_null || type == &_type_string;
|
||||
}
|
||||
|
||||
RavaType_t* rava_type_create_primitive(RavaTypeKind_e kind) {
|
||||
RavaType_t *type = calloc(1, sizeof(RavaType_t));
|
||||
type->kind = kind;
|
||||
|
||||
switch (kind) {
|
||||
case RAVA_TYPE_VOID: type->name = strdup("void"); break;
|
||||
case RAVA_TYPE_BOOLEAN: type->name = strdup("boolean"); break;
|
||||
case RAVA_TYPE_BYTE: type->name = strdup("byte"); break;
|
||||
case RAVA_TYPE_SHORT: type->name = strdup("short"); break;
|
||||
case RAVA_TYPE_INT: type->name = strdup("int"); break;
|
||||
case RAVA_TYPE_LONG: type->name = strdup("long"); break;
|
||||
case RAVA_TYPE_CHAR: type->name = strdup("char"); break;
|
||||
case RAVA_TYPE_FLOAT: type->name = strdup("float"); break;
|
||||
case RAVA_TYPE_DOUBLE: type->name = strdup("double"); break;
|
||||
default: type->name = strdup("unknown"); break;
|
||||
case RAVA_TYPE_VOID: return &_type_void;
|
||||
case RAVA_TYPE_BOOLEAN: return &_type_boolean;
|
||||
case RAVA_TYPE_BYTE: return &_type_byte;
|
||||
case RAVA_TYPE_SHORT: return &_type_short;
|
||||
case RAVA_TYPE_INT: return &_type_int;
|
||||
case RAVA_TYPE_LONG: return &_type_long;
|
||||
case RAVA_TYPE_CHAR: return &_type_char;
|
||||
case RAVA_TYPE_FLOAT: return &_type_float;
|
||||
case RAVA_TYPE_DOUBLE: return &_type_double;
|
||||
case RAVA_TYPE_NULL: return &_type_null;
|
||||
default: {
|
||||
RavaType_t *type = calloc(1, sizeof(RavaType_t));
|
||||
type->kind = kind;
|
||||
type->name = strdup("unknown");
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
RavaType_t* rava_type_create_class(const char *class_name) {
|
||||
@@ -49,7 +69,7 @@ RavaType_t* rava_type_create_array(RavaType_t *element_type, int dimensions) {
|
||||
}
|
||||
|
||||
void rava_type_destroy(RavaType_t *type) {
|
||||
if (!type) return;
|
||||
if (!type || _is_pooled_type(type)) return;
|
||||
|
||||
free(type->name);
|
||||
|
||||
@@ -156,7 +176,7 @@ RavaType_t* rava_type_binary_result(RavaType_t *left, RavaType_t *right) {
|
||||
if (!left || !right) return NULL;
|
||||
|
||||
if (_is_string_type(left) || _is_string_type(right)) {
|
||||
return rava_type_create_class("String");
|
||||
return &_type_string;
|
||||
}
|
||||
|
||||
if (!rava_type_is_numeric(left) || !rava_type_is_numeric(right)) {
|
||||
@@ -164,18 +184,18 @@ RavaType_t* rava_type_binary_result(RavaType_t *left, RavaType_t *right) {
|
||||
}
|
||||
|
||||
if (left->kind == RAVA_TYPE_DOUBLE || right->kind == RAVA_TYPE_DOUBLE) {
|
||||
return rava_type_create_primitive(RAVA_TYPE_DOUBLE);
|
||||
return &_type_double;
|
||||
}
|
||||
|
||||
if (left->kind == RAVA_TYPE_FLOAT || right->kind == RAVA_TYPE_FLOAT) {
|
||||
return rava_type_create_primitive(RAVA_TYPE_FLOAT);
|
||||
return &_type_float;
|
||||
}
|
||||
|
||||
if (left->kind == RAVA_TYPE_LONG || right->kind == RAVA_TYPE_LONG) {
|
||||
return rava_type_create_primitive(RAVA_TYPE_LONG);
|
||||
return &_type_long;
|
||||
}
|
||||
|
||||
return rava_type_create_primitive(RAVA_TYPE_INT);
|
||||
return &_type_int;
|
||||
}
|
||||
|
||||
RavaType_t* rava_type_unary_result(RavaType_t *operand) {
|
||||
@@ -188,7 +208,7 @@ RavaType_t* rava_type_unary_result(RavaType_t *operand) {
|
||||
if (operand->kind == RAVA_TYPE_BYTE ||
|
||||
operand->kind == RAVA_TYPE_SHORT ||
|
||||
operand->kind == RAVA_TYPE_CHAR) {
|
||||
return rava_type_create_primitive(RAVA_TYPE_INT);
|
||||
return &_type_int;
|
||||
}
|
||||
|
||||
return rava_type_create_primitive(operand->kind);
|
||||
|
||||
Reference in New Issue
Block a user