[anjuta/sdb-queries] symbol-db: Implemented group by and order by in query
- From: Naba Kumar <naba src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [anjuta/sdb-queries] symbol-db: Implemented group by and order by in query
- Date: Tue, 15 Jun 2010 16:26:55 +0000 (UTC)
commit 5aad07db7d226344bf801cb434511fafad301fcc
Author: Naba Kumar <naba gnome org>
Date: Tue Jun 15 19:26:45 2010 +0300
symbol-db: Implemented group by and order by in query
libanjuta/interfaces/libanjuta.idl | 2 +
.../language-support-cpp-java/cpp-java-assist.c | 6 +
plugins/symbol-db/symbol-db-query.c | 101 ++++++++++++++-----
plugins/symbol-db/symbol-db-query.h | 3 +-
4 files changed, 83 insertions(+), 29 deletions(-)
---
diff --git a/libanjuta/interfaces/libanjuta.idl b/libanjuta/interfaces/libanjuta.idl
index 8951a86..ef28d54 100644
--- a/libanjuta/interfaces/libanjuta.idl
+++ b/libanjuta/interfaces/libanjuta.idl
@@ -5376,6 +5376,8 @@ interface IAnjutaSymbolQuery
void set_file_scope (IAnjutaSymbolQueryFileScope filescope_search);
void set_offset (gint offset);
void set_limit (gint limit);
+ void set_group_by (IAnjutaSymbolField field);
+ void set_order_by (IAnjutaSymbolField field);
void cancel ();
IAnjutaIterable* search (const gchar *pattern);
diff --git a/plugins/language-support-cpp-java/cpp-java-assist.c b/plugins/language-support-cpp-java/cpp-java-assist.c
index d68e3d4..3c44e28 100644
--- a/plugins/language-support-cpp-java/cpp-java-assist.c
+++ b/plugins/language-support-cpp-java/cpp-java-assist.c
@@ -1406,6 +1406,8 @@ cpp_java_assist_new (IAnjutaEditor *ieditor,
IANJUTA_SYMBOL_QUERY_SEARCH_FILE,
IANJUTA_SYMBOL_QUERY_DB_PROJECT,
NULL);
+ ianjuta_symbol_query_set_group_by (assist->priv->ac_query_file,
+ IANJUTA_SYMBOL_FIELD_NAME, NULL);
ianjuta_symbol_query_set_fields (assist->priv->ac_query_file,
G_N_ELEMENTS (ac_fields),
ac_fields, NULL);
@@ -1421,6 +1423,8 @@ cpp_java_assist_new (IAnjutaEditor *ieditor,
IANJUTA_SYMBOL_QUERY_SEARCH,
IANJUTA_SYMBOL_QUERY_DB_PROJECT,
NULL);
+ ianjuta_symbol_query_set_group_by (assist->priv->ac_query_project,
+ IANJUTA_SYMBOL_FIELD_NAME, NULL);
ianjuta_symbol_query_set_fields (assist->priv->ac_query_project,
G_N_ELEMENTS (ac_fields),
ac_fields, NULL);
@@ -1436,6 +1440,8 @@ cpp_java_assist_new (IAnjutaEditor *ieditor,
IANJUTA_SYMBOL_QUERY_SEARCH,
IANJUTA_SYMBOL_QUERY_DB_SYSTEM,
NULL);
+ ianjuta_symbol_query_set_group_by (assist->priv->ac_query_system,
+ IANJUTA_SYMBOL_FIELD_NAME, NULL);
ianjuta_symbol_query_set_fields (assist->priv->ac_query_system,
G_N_ELEMENTS (ac_fields),
ac_fields, NULL);
diff --git a/plugins/symbol-db/symbol-db-query.c b/plugins/symbol-db/symbol-db-query.c
index c4c90bb..3ea5000 100644
--- a/plugins/symbol-db/symbol-db-query.c
+++ b/plugins/symbol-db/symbol-db-query.c
@@ -41,6 +41,8 @@ enum
PROP_STATEMENT,
PROP_LIMIT,
PROP_OFFSET,
+ PROP_ORDER_BY,
+ PROP_GROUP_BY,
PROP_DB_ENGINE_SYSTEM,
PROP_DB_ENGINE_PROJECT,
PROP_DB_ENGINE_SELECTED
@@ -56,8 +58,9 @@ struct _SymbolDBQueryPriv {
IAnjutaSymbolField fields[IANJUTA_SYMBOL_FIELD_END];
IAnjutaSymbolType filters;
IAnjutaSymbolQueryFileScope file_scope;
+ IAnjutaSymbolField group_by;
+ IAnjutaSymbolField order_by;
- gboolean async;
SymbolDBEngine *dbe_system;
SymbolDBEngine *dbe_project;
SymbolDBEngine *dbe_selected;
@@ -273,30 +276,6 @@ sdb_query_build_sql_kind_filter (SymbolDBQuery *query, GString *sql)
}
}
-static void
-sdb_query_build_sql_file_scope (SymbolDBQuery *query, GString *sql)
-{
- SymbolDBQueryPriv *priv;
-
- g_return_if_fail (SYMBOL_DB_IS_QUERY (query));
- g_return_if_fail (sql != NULL);
-
- priv = SYMBOL_DB_QUERY (query)->priv;
-
- switch (priv->file_scope)
- {
- case IANJUTA_SYMBOL_QUERY_SEARCH_FS_IGNORE:
- return;
- case IANJUTA_SYMBOL_QUERY_SEARCH_FS_PRIVATE:
- g_string_append (sql, "AND (symbol.is_file_scope = 1) ");
- return;
- case IANJUTA_SYMBOL_QUERY_SEARCH_FS_PUBLIC:
- g_string_append (sql, "AND (symbol.is_file_scope = 0) ");
- return;
- }
- g_warn_if_reached ();
-}
-
/**
* sdb_query_add_field:
* @query: The query.
@@ -442,7 +421,27 @@ sdb_query_update (SymbolDBQuery *query)
sdb_query_build_sql_kind_filter (query, sql);
/* Add filter for file scope */
- sdb_query_build_sql_file_scope (query, sql);
+ switch (priv->file_scope)
+ {
+ case IANJUTA_SYMBOL_QUERY_SEARCH_FS_IGNORE:
+ break;
+ case IANJUTA_SYMBOL_QUERY_SEARCH_FS_PRIVATE:
+ g_string_append (sql, "AND (symbol.is_file_scope = 1) ");
+ break;
+ case IANJUTA_SYMBOL_QUERY_SEARCH_FS_PUBLIC:
+ g_string_append (sql, "AND (symbol.is_file_scope = 0) ");
+ break;
+ default:
+ g_warn_if_reached ();
+ }
+
+ /* Group by clause */
+ if (priv->group_by != IANJUTA_SYMBOL_FIELD_END)
+ g_string_append_printf (sql, "GROUP BY %s ", field_specs[priv->group_by].column);
+
+ /* Order by clause */
+ if (priv->order_by != IANJUTA_SYMBOL_FIELD_END)
+ g_string_append_printf (sql, "ORDER BY %s ", field_specs[priv->order_by].column);
/* Add tail of the SQL statement */
g_string_append (sql, "LIMIT ## /* name:'limit' type:gint */ ");
@@ -687,6 +686,9 @@ sdb_query_init (SymbolDBQuery *query)
priv->fields[0] = IANJUTA_SYMBOL_FIELD_ID;
priv->fields[1] = IANJUTA_SYMBOL_FIELD_NAME;
priv->fields[2] = IANJUTA_SYMBOL_FIELD_END;
+
+ priv->group_by = IANJUTA_SYMBOL_FIELD_END;
+ priv->order_by = IANJUTA_SYMBOL_FIELD_END;
/* Prepare sql parameter holders */
param = priv->param_pattern = gda_holder_new_string ("pattern", "");
@@ -815,6 +817,14 @@ sdb_query_set_property (GObject *object, guint prop_id, const GValue *value, GPa
case PROP_OFFSET:
gda_holder_set_value (priv->param_offset, value, NULL);
break;
+ case PROP_GROUP_BY:
+ priv->group_by = g_value_get_enum (value);
+ sdb_query_update (query);
+ break;
+ case PROP_ORDER_BY:
+ priv->group_by = g_value_get_enum (value);
+ sdb_query_update (query);
+ break;
case PROP_DB_ENGINE_SYSTEM:
g_assert (priv->dbe_system == NULL);
priv->dbe_system = g_value_get_object (value);
@@ -881,6 +891,12 @@ sdb_query_get_property (GObject *object, guint prop_id, GValue *value, GParamSpe
case PROP_OFFSET:
g_value_copy (gda_holder_get_value (priv->param_offset), value);
break;
+ case PROP_GROUP_BY:
+ g_value_set_enum (value, priv->group_by);
+ break;
+ case PROP_ORDER_BY:
+ g_value_set_enum (value, priv->order_by);
+ break;
case PROP_DB_ENGINE_SYSTEM:
g_value_set_object (value, priv->dbe_system);
break;
@@ -980,7 +996,24 @@ sdb_query_class_init (SymbolDBQueryClass *klass)
0, INT_MAX, 0,
G_PARAM_READABLE |
G_PARAM_WRITABLE));
-
+ g_object_class_install_property (object_class,
+ PROP_GROUP_BY,
+ g_param_spec_enum ("group-by",
+ "Query group by",
+ "Group by given field",
+ IANJUTA_TYPE_SYMBOL_FIELD,
+ IANJUTA_SYMBOL_FIELD_END,
+ G_PARAM_READABLE |
+ G_PARAM_WRITABLE));
+ g_object_class_install_property (object_class,
+ PROP_ORDER_BY,
+ g_param_spec_enum ("order-by",
+ "Query order by",
+ "Query order by given field",
+ IANJUTA_TYPE_SYMBOL_FIELD,
+ IANJUTA_SYMBOL_FIELD_END,
+ G_PARAM_READABLE |
+ G_PARAM_WRITABLE));
g_object_class_install_property (object_class,
PROP_DB_ENGINE_SYSTEM,
g_param_spec_object ("db-engine-system",
@@ -1056,6 +1089,18 @@ sdb_query_set_offset (IAnjutaSymbolQuery *query, gint offset, GError **err)
}
static void
+sdb_query_set_group_by (IAnjutaSymbolQuery *query, IAnjutaSymbolField field, GError **err)
+{
+ g_object_set (query, "group-by", field, NULL);
+}
+
+static void
+sdb_query_set_order_by (IAnjutaSymbolQuery *query, IAnjutaSymbolField field, GError **err)
+{
+ g_object_set (query, "order-by", field, NULL);
+}
+
+static void
sdb_query_set_file_scope (IAnjutaSymbolQuery *query,
IAnjutaSymbolQueryFileScope file_scope,
GError **err)
@@ -1230,6 +1275,8 @@ ianjuta_symbol_query_iface_init (IAnjutaSymbolQueryIface *iface)
iface->set_file_scope = sdb_query_set_file_scope;
iface->set_limit = sdb_query_set_limit;
iface->set_offset = sdb_query_set_offset;
+ iface->set_group_by = sdb_query_set_group_by;
+ iface->set_order_by = sdb_query_set_order_by;
iface->cancel = sdb_query_async_cancel;
iface->search = sdb_query_search;
iface->search_all = sdb_query_search_all;
diff --git a/plugins/symbol-db/symbol-db-query.h b/plugins/symbol-db/symbol-db-query.h
index 84e1bdc..679e74f 100644
--- a/plugins/symbol-db/symbol-db-query.h
+++ b/plugins/symbol-db/symbol-db-query.h
@@ -21,7 +21,6 @@
#define _SYMBOL_DB_QUERY_H_
#include <glib-object.h>
-#include <libanjuta/anjuta-async-command.h>
#include <libanjuta/interfaces/ianjuta-iterable.h>
#include <libanjuta/interfaces/ianjuta-symbol-query.h>
@@ -40,7 +39,7 @@ typedef struct _SymbolDBQueryPriv SymbolDBQueryPriv;
struct _SymbolDBQueryClass
{
- GObject parent_class;
+ GObjectClass parent_class;
};
struct _SymbolDBQuery
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]