|
Packit |
4b6dd7 |
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
|
|
Packit |
4b6dd7 |
/*
|
|
Packit |
4b6dd7 |
* GData Client
|
|
Packit |
4b6dd7 |
* Copyright (C) 2014 Carlos Garnacho <carlosg@gnome.org>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is free software; you can redistribute it and/or
|
|
Packit |
4b6dd7 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License as published by the Free Software Foundation; either
|
|
Packit |
4b6dd7 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is distributed in the hope that it will be useful,
|
|
Packit |
4b6dd7 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4b6dd7 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
4b6dd7 |
* Lesser General Public License for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License along with GData Client. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* SECTION:gdata-freebase-search-query
|
|
Packit |
4b6dd7 |
* @short_description: GData Freebase query object
|
|
Packit |
4b6dd7 |
* @stability: Stable
|
|
Packit |
4b6dd7 |
* @include: gdata/services/freebase/gdata-freebase-query.h
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* #GDataFreebaseQuery represents a collection of query parameters specific to the Google Freebase service.
|
|
Packit |
4b6dd7 |
* a #GDataFreebaseQuery is built on top of a search term, further filters can be set on the search query
|
|
Packit |
4b6dd7 |
* through gdata_freebase_search_query_add_filter() or gdata_freebase_search_query_add_location(). The filters
|
|
Packit |
4b6dd7 |
* can be nested in sublevels, created through gdata_freebase_search_query_open_filter()
|
|
Packit |
4b6dd7 |
* and gdata_freebase_search_query_close_filter().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details of Google Freebase API, see the <ulink type="http" url="https://developers.google.com/freebase/v1/">
|
|
Packit |
4b6dd7 |
* online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include <config.h>
|
|
Packit |
4b6dd7 |
#include <glib.h>
|
|
Packit |
4b6dd7 |
#include <glib/gi18n-lib.h>
|
|
Packit |
4b6dd7 |
#include <string.h>
|
|
Packit |
4b6dd7 |
#include <json-glib/json-glib.h>
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include "gdata-freebase-search-query.h"
|
|
Packit |
4b6dd7 |
#include "gdata-query.h"
|
|
Packit |
4b6dd7 |
#include "gdata-parser.h"
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void gdata_freebase_search_query_finalize (GObject *self);
|
|
Packit |
4b6dd7 |
static void gdata_freebase_search_query_set_property (GObject *self, guint prop_id, const GValue *value, GParamSpec *pspec);
|
|
Packit |
4b6dd7 |
static void gdata_freebase_search_query_get_property (GObject *self, guint prop_id, GValue *value, GParamSpec *pspec);
|
|
Packit |
4b6dd7 |
static void get_query_uri (GDataQuery *self, const gchar *feed_uri, GString *query_uri, gboolean *params_started);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
typedef enum {
|
|
Packit |
4b6dd7 |
NODE_CONTAINER,
|
|
Packit |
4b6dd7 |
NODE_VALUE,
|
|
Packit |
4b6dd7 |
NODE_LOCATION
|
|
Packit |
4b6dd7 |
} FilterNodeType;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
typedef union {
|
|
Packit |
4b6dd7 |
FilterNodeType type;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
struct {
|
|
Packit |
4b6dd7 |
FilterNodeType type;
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchFilterType filter_type;
|
|
Packit |
4b6dd7 |
GPtrArray *child_nodes; /* Contains owned FilterNode structs */
|
|
Packit |
4b6dd7 |
} container;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
struct {
|
|
Packit |
4b6dd7 |
FilterNodeType type;
|
|
Packit |
4b6dd7 |
gchar *property;
|
|
Packit |
4b6dd7 |
gchar *value;
|
|
Packit |
4b6dd7 |
} value;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
struct {
|
|
Packit |
4b6dd7 |
FilterNodeType type;
|
|
Packit |
4b6dd7 |
guint64 radius;
|
|
Packit |
4b6dd7 |
gdouble lat;
|
|
Packit |
4b6dd7 |
gdouble lon;
|
|
Packit |
4b6dd7 |
} location;
|
|
Packit |
4b6dd7 |
} FilterNode;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
struct _GDataFreebaseSearchQueryPrivate {
|
|
Packit |
4b6dd7 |
FilterNode *filter;
|
|
Packit |
4b6dd7 |
GList *filter_stack; /* Contains unowned FilterNode structs */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gchar *lang;
|
|
Packit |
4b6dd7 |
guint stemmed : 1;
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
enum {
|
|
Packit |
4b6dd7 |
PROP_LANGUAGE = 1,
|
|
Packit |
4b6dd7 |
PROP_STEMMED
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_DEFINE_TYPE (GDataFreebaseSearchQuery, gdata_freebase_search_query, GDATA_TYPE_QUERY)
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_class_init (GDataFreebaseSearchQueryClass *klass)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
4b6dd7 |
GDataQueryClass *query_class = GDATA_QUERY_CLASS (klass);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_type_class_add_private (klass, sizeof (GDataFreebaseSearchQueryPrivate));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gobject_class->finalize = gdata_freebase_search_query_finalize;
|
|
Packit |
4b6dd7 |
gobject_class->set_property = gdata_freebase_search_query_set_property;
|
|
Packit |
4b6dd7 |
gobject_class->get_property = gdata_freebase_search_query_get_property;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
query_class->get_query_uri = get_query_uri;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataFreebaseSearchQuery:language:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Language used for search results, in ISO-639-1 format.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_LANGUAGE,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("language",
|
|
Packit |
4b6dd7 |
"Language used for results",
|
|
Packit |
4b6dd7 |
"Language in ISO-639-1 format.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
|
Packit |
4b6dd7 |
G_PARAM_DEPRECATED));
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataFreebaseSearchQuery:stemmed:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Whether word stemming should happen on the search terms. If this property is enabled,
|
|
Packit |
4b6dd7 |
* words like eg. "natural", "naturally" or "nature" would be all reduced to the root "natur"
|
|
Packit |
4b6dd7 |
* for search purposes.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_STEMMED,
|
|
Packit |
4b6dd7 |
g_param_spec_boolean ("stemmed",
|
|
Packit |
4b6dd7 |
"Stem search terms",
|
|
Packit |
4b6dd7 |
"Whether the search terms should be stemmed",
|
|
Packit |
4b6dd7 |
FALSE,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
|
Packit |
4b6dd7 |
G_PARAM_DEPRECATED));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_init (GDataFreebaseSearchQuery *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_FREEBASE_SEARCH_QUERY, GDataFreebaseSearchQueryPrivate);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
_free_filter_node (FilterNode *node)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
switch (node->type) {
|
|
Packit |
4b6dd7 |
case NODE_CONTAINER:
|
|
Packit |
4b6dd7 |
g_ptr_array_unref (node->container.child_nodes);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case NODE_VALUE:
|
|
Packit |
4b6dd7 |
g_free (node->value.property);
|
|
Packit |
4b6dd7 |
g_free (node->value.value);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case NODE_LOCATION:
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_slice_free (FilterNode, node);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_finalize (GObject *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv = GDATA_FREEBASE_SEARCH_QUERY (self)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (priv->lang);
|
|
Packit |
4b6dd7 |
g_list_free (priv->filter_stack);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->filter != NULL)
|
|
Packit |
4b6dd7 |
_free_filter_node (priv->filter);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
G_OBJECT_CLASS (gdata_freebase_search_query_parent_class)->finalize (self);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_set_property (GObject *self, guint prop_id, const GValue *value, GParamSpec *pspec)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQuery *query = GDATA_FREEBASE_SEARCH_QUERY (self);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
switch (prop_id) {
|
|
Packit |
4b6dd7 |
case PROP_LANGUAGE:
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_set_language (query, g_value_get_string (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_STEMMED:
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_set_stemmed (query, g_value_get_boolean (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_get_property (GObject *self, guint prop_id, GValue *value, GParamSpec *pspec)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv = GDATA_FREEBASE_SEARCH_QUERY (self)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
switch (prop_id) {
|
|
Packit |
4b6dd7 |
case PROP_LANGUAGE:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, priv->lang);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_STEMMED:
|
|
Packit |
4b6dd7 |
g_value_set_boolean (value, priv->stemmed);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
build_filter_string (FilterNode *node,
|
|
Packit |
4b6dd7 |
GString *str)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
switch (node->type) {
|
|
Packit |
4b6dd7 |
case NODE_CONTAINER:
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* Array matches GDataFreebaseSearchFilterType */
|
|
Packit |
4b6dd7 |
const gchar *type_str[] = { "all", "any", "not" };
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_assert (/* node->container.filter_type >= 0 && */
|
|
Packit |
4b6dd7 |
node->container.filter_type < G_N_ELEMENTS (type_str));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_string_append_printf (str, "(%s", type_str[node->container.filter_type]);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < node->container.child_nodes->len; i++)
|
|
Packit |
4b6dd7 |
build_filter_string (g_ptr_array_index (node->container.child_nodes, i), str);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_string_append (str, ")");
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
case NODE_VALUE:
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gchar *escaped;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
escaped = g_strescape (node->value.value, NULL);
|
|
Packit |
4b6dd7 |
g_string_append_printf (str, " %s:\"%s\"", node->value.property, escaped);
|
|
Packit |
4b6dd7 |
g_free (escaped);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
case NODE_LOCATION:
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gchar lon_str[G_ASCII_DTOSTR_BUF_SIZE], lat_str[G_ASCII_DTOSTR_BUF_SIZE];
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_ascii_formatd (lon_str, G_ASCII_DTOSTR_BUF_SIZE, "%.4f", node->location.lon);
|
|
Packit |
4b6dd7 |
g_ascii_formatd (lat_str, G_ASCII_DTOSTR_BUF_SIZE, "%.4f", node->location.lat);
|
|
Packit |
4b6dd7 |
g_string_append_printf (str, "(within radius:%" G_GUINT64_FORMAT "m lon:%s lat:%s)",
|
|
Packit |
4b6dd7 |
node->location.radius, lon_str, lat_str);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
g_assert_not_reached ();
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
get_query_uri (GDataQuery *self, const gchar *feed_uri, GString *query_uri, gboolean *params_started)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv = GDATA_FREEBASE_SEARCH_QUERY (self)->priv;
|
|
Packit |
4b6dd7 |
const gchar *query, *lang = NULL;
|
|
Packit |
4b6dd7 |
gint64 updated_max;
|
|
Packit |
4b6dd7 |
guint cur, limit;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#define APPEND_SEP g_string_append_c (query_uri, (*params_started == FALSE) ? '?' : '&';; *params_started = TRUE;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
query = gdata_query_get_q (self);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (query != NULL) {
|
|
Packit |
4b6dd7 |
APPEND_SEP;
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, "query=");
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, query);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->filter != NULL) {
|
|
Packit |
4b6dd7 |
GString *str = g_string_new (NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
build_filter_string (priv->filter, str);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
APPEND_SEP;
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, "filter=");
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, str->str);
|
|
Packit |
4b6dd7 |
g_string_free (str, TRUE);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
updated_max = gdata_query_get_updated_max (self);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (updated_max != -1) {
|
|
Packit |
4b6dd7 |
gchar *date_str;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
date_str = gdata_parser_int64_to_iso8601 (updated_max);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
APPEND_SEP;
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, "as_of_time=");
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, date_str);
|
|
Packit |
4b6dd7 |
g_free (date_str);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->lang != NULL) {
|
|
Packit |
4b6dd7 |
lang = priv->lang;
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
const gchar * const *user_languages;
|
|
Packit |
4b6dd7 |
GString *lang_str = NULL;
|
|
Packit |
4b6dd7 |
gint i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
user_languages = g_get_language_names ();
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; user_languages[i] != NULL; i++) {
|
|
Packit |
4b6dd7 |
if (strlen (user_languages[i]) != 2)
|
|
Packit |
4b6dd7 |
continue;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (!lang_str)
|
|
Packit |
4b6dd7 |
lang_str = g_string_new (user_languages[i]);
|
|
Packit |
4b6dd7 |
else
|
|
Packit |
4b6dd7 |
g_string_append_printf (lang_str, ",%s", user_languages[i]);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
lang = g_string_free (lang_str, FALSE);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
APPEND_SEP;
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, "lang=");
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, lang);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->stemmed) {
|
|
Packit |
4b6dd7 |
APPEND_SEP;
|
|
Packit |
4b6dd7 |
g_string_append (query_uri, "stemmed=true");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
cur = gdata_query_get_start_index (self);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (cur > 0) {
|
|
Packit |
4b6dd7 |
APPEND_SEP;
|
|
Packit |
4b6dd7 |
g_string_append_printf (query_uri, "cursor=%d", cur);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
limit = gdata_query_get_max_results (self);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (limit > 0) {
|
|
Packit |
4b6dd7 |
APPEND_SEP;
|
|
Packit |
4b6dd7 |
g_string_append_printf (query_uri, "limit=%d", limit);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* We don't chain up with parent class get_query_uri because it uses
|
|
Packit |
4b6dd7 |
* GData protocol parameters and they aren't compatible with newest API family
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
#undef APPEND_SEP
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_new:
|
|
Packit |
4b6dd7 |
* @search_terms: string to search for
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Creates a new #GDataFreebaseSearchQuery prepared to search for Freebase elements that
|
|
Packit |
4b6dd7 |
* match the given @search_terms. Further filters on the query can be set through
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_add_filter() or gdata_freebase_search_query_add_location().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a new #GDataFreebaseSearchQuery; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQuery *
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_new (const gchar *search_terms)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (search_terms != NULL, NULL);
|
|
Packit |
4b6dd7 |
return g_object_new (GDATA_TYPE_FREEBASE_SEARCH_QUERY, "q", search_terms, NULL);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_open_filter:
|
|
Packit |
4b6dd7 |
* @self: a #GDataFreebaseSearchQuery
|
|
Packit |
4b6dd7 |
* @filter_type: filter type
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Opens a container of filter rules, those are applied according to the behavior specified by @filter_type.
|
|
Packit |
4b6dd7 |
* Every call to this function must be paired by a call to gdata_freebase_search_query_close_filter().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_open_filter (GDataFreebaseSearchQuery *self, GDataFreebaseSearchFilterType filter_type)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv;
|
|
Packit |
4b6dd7 |
FilterNode *current_node, *node;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_FREEBASE_SEARCH_QUERY (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = GDATA_FREEBASE_SEARCH_QUERY (self)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
node = g_slice_new0 (FilterNode);
|
|
Packit |
4b6dd7 |
node->type = NODE_CONTAINER;
|
|
Packit |
4b6dd7 |
node->container.filter_type = filter_type;
|
|
Packit |
4b6dd7 |
node->container.child_nodes = g_ptr_array_new_with_free_func ((GDestroyNotify) _free_filter_node);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->filter_stack != NULL) {
|
|
Packit |
4b6dd7 |
current_node = priv->filter_stack->data;
|
|
Packit |
4b6dd7 |
g_ptr_array_add (current_node->container.child_nodes, node);
|
|
Packit |
4b6dd7 |
} else if (priv->filter == NULL) {
|
|
Packit |
4b6dd7 |
priv->filter = node;
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
g_assert_not_reached ();
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv->filter_stack = g_list_prepend (priv->filter_stack, node);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_close_filter:
|
|
Packit |
4b6dd7 |
* @self: a #GDataFreebaseSearchQuery
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Closes a filter level.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_close_filter (GDataFreebaseSearchQuery *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_FREEBASE_SEARCH_QUERY (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = GDATA_FREEBASE_SEARCH_QUERY (self)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->filter_stack == NULL)
|
|
Packit |
4b6dd7 |
g_assert_not_reached ();
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv->filter_stack = g_list_delete_link (priv->filter_stack, priv->filter_stack);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_add_filter:
|
|
Packit |
4b6dd7 |
* @self: a #GDataFreebaseSearchQuery
|
|
Packit |
4b6dd7 |
* @property: Freebase property ID
|
|
Packit |
4b6dd7 |
* @value: match string
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Adds a property filter to the query. property filters are always nested in
|
|
Packit |
4b6dd7 |
* containers, opened and closed through gdata_freebase_search_query_open_filter()
|
|
Packit |
4b6dd7 |
* and gdata_freebase_search_query_close_filter().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_add_filter (GDataFreebaseSearchQuery *self, const gchar *property, const gchar *value)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv;
|
|
Packit |
4b6dd7 |
FilterNode *current_node, *node;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_FREEBASE_SEARCH_QUERY (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (property != NULL && value != NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = GDATA_FREEBASE_SEARCH_QUERY (self)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->filter_stack == NULL) {
|
|
Packit |
4b6dd7 |
g_critical ("A filter container must be opened before through "
|
|
Packit |
4b6dd7 |
"gdata_freebase_search_query_open_filter()");
|
|
Packit |
4b6dd7 |
g_assert_not_reached ();
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
node = g_slice_new0 (FilterNode);
|
|
Packit |
4b6dd7 |
node->type = NODE_VALUE;
|
|
Packit |
4b6dd7 |
node->value.property = g_strdup (property);
|
|
Packit |
4b6dd7 |
node->value.value = g_strdup (value);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
current_node = priv->filter_stack->data;
|
|
Packit |
4b6dd7 |
g_ptr_array_add (current_node->container.child_nodes, node);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_add_location:
|
|
Packit |
4b6dd7 |
* @self: a #GDataFreebaseSearchQuery
|
|
Packit |
4b6dd7 |
* @radius: radius in meters
|
|
Packit |
4b6dd7 |
* @lat: latitude
|
|
Packit |
4b6dd7 |
* @lon: longitude
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Adds a geolocation filter to the query. location filters are always nested in
|
|
Packit |
4b6dd7 |
* containers, opened and closed through gdata_freebase_search_query_open_filter()
|
|
Packit |
4b6dd7 |
* and gdata_freebase_search_query_close_filter().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_add_location (GDataFreebaseSearchQuery *self, guint64 radius, gdouble lat, gdouble lon)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv = GDATA_FREEBASE_SEARCH_QUERY (self)->priv;
|
|
Packit |
4b6dd7 |
FilterNode *current_node, *node;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_FREEBASE_SEARCH_QUERY (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->filter_stack == NULL) {
|
|
Packit |
4b6dd7 |
g_critical ("A filter container must be opened before through "
|
|
Packit |
4b6dd7 |
"gdata_freebase_search_query_open_filter()");
|
|
Packit |
4b6dd7 |
g_assert_not_reached ();
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
node = g_slice_new0 (FilterNode);
|
|
Packit |
4b6dd7 |
node->type = NODE_LOCATION;
|
|
Packit |
4b6dd7 |
node->location.radius = radius;
|
|
Packit |
4b6dd7 |
node->location.lat = lat;
|
|
Packit |
4b6dd7 |
node->location.lon = lon;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
current_node = priv->filter_stack->data;
|
|
Packit |
4b6dd7 |
g_ptr_array_add (current_node->container.child_nodes, node);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_set_language:
|
|
Packit |
4b6dd7 |
* @self: a #GDataFreebaseSearchQuery
|
|
Packit |
4b6dd7 |
* @lang: (allow-none): Language used on the search terms and results, in ISO-639-1 format, or %NULL to unset.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the language used, both on the search terms and the results. If unset,
|
|
Packit |
4b6dd7 |
* the locale preferences will be respected.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_set_language (GDataFreebaseSearchQuery *self,
|
|
Packit |
4b6dd7 |
const gchar *lang)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_FREEBASE_SEARCH_QUERY (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (!lang || strlen (lang) == 2);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = self->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (priv->lang, lang) == 0)
|
|
Packit |
4b6dd7 |
return;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (priv->lang);
|
|
Packit |
4b6dd7 |
priv->lang = g_strdup (lang);
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "language");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_get_language:
|
|
Packit |
4b6dd7 |
* @self: a #GDataFreebaseSearchQuery
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the language set on the search query, or %NULL if unset.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (allow-none): The language used on the query.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_get_language (GDataFreebaseSearchQuery *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_FREEBASE_SEARCH_QUERY (self), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = self->priv;
|
|
Packit |
4b6dd7 |
return priv->lang;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_set_stemmed:
|
|
Packit |
4b6dd7 |
* @self: a #GDataFreebaseSearchQuery
|
|
Packit |
4b6dd7 |
* @stemmed: %TRUE to perform stemming on the search results
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets whether stemming is performed on the provided search terms. If @stemmed is %TRUE,
|
|
Packit |
4b6dd7 |
* words like eg. "natural", "naturally" or "nature" would be all reduced to the root "natur"
|
|
Packit |
4b6dd7 |
* for search purposes.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_set_stemmed (GDataFreebaseSearchQuery *self,
|
|
Packit |
4b6dd7 |
gboolean stemmed)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_FREEBASE_SEARCH_QUERY (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = self->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->stemmed == stemmed)
|
|
Packit |
4b6dd7 |
return;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv->stemmed = stemmed;
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "stemmed");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_freebase_search_query_get_stemmed:
|
|
Packit |
4b6dd7 |
* @self: a #GDataFreebaseSearchQuery
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Returns whether the #GDataFreebaseSearchQuery will perform stemming on the search terms.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: %TRUE if the #GDataFreebaseSearchQuery performs stemming
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.15.1
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.7: Google Freebase has been permanently shut down.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gboolean
|
|
Packit |
4b6dd7 |
gdata_freebase_search_query_get_stemmed (GDataFreebaseSearchQuery *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFreebaseSearchQueryPrivate *priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_FREEBASE_SEARCH_QUERY (self), FALSE);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = self->priv;
|
|
Packit |
4b6dd7 |
return priv->stemmed;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_END_IGNORE_DEPRECATIONS
|