Commit 281e712a authored by Mathieu Rodic's avatar Mathieu Rodic

[FEATURE] Added a RESTful URL :...

[FEATURE] Added a RESTful URL : /api/corpus/95/data?mesured=ngrams.count&parameters[]=metadata.publication_year&filters[]=ngram.terms|bees
parent 7aadc2db
...@@ -3,7 +3,7 @@ from django.core.exceptions import PermissionDenied, SuspiciousOperation ...@@ -3,7 +3,7 @@ from django.core.exceptions import PermissionDenied, SuspiciousOperation
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db.models import Avg, Max, Min, Count from django.db.models import Avg, Max, Min, Count
from node.models import NodeType, Node, Ngram from node.models import NodeType, Node, Node_Ngram, Ngram
from django.db import connection from django.db import connection
...@@ -81,4 +81,81 @@ def corpus_metadata(request, corpus_id): ...@@ -81,4 +81,81 @@ def corpus_metadata(request, corpus_id):
# response building # response building
return JsonHttpResponse({ return JsonHttpResponse({
"list" : [row[0] for row in cursor.fetchall()], "list" : [row[0] for row in cursor.fetchall()],
}) })
\ No newline at end of file
# ?mesured=documents.count
# &parameters[]=metadata.publication_year
# &filter[]=ngrams.in.test,ht,grf
def corpus_data(request, corpus_id):
# parameters retrieval and control
corpusQuery = Node.objects.filter(id = corpus_id)
if not corpusQuery:
raise Http404("No such corpus.")
corpus = corpusQuery.first()
if corpus.type.name != 'Corpus':
raise Http404("No such corpus.")
# query building: initialization
columns = []
conditions = []
group = []
order = []
join_ngrams = False
# query building: parameters
for parameter in request.GET.getlist('parameters[]'):
c = len(columns)
parameter_array = parameter.split('.')
if len(parameter_array) != 2:
raise ValidationError('Unrecognized "parameter[]=%s"' % (parameter, ))
origin = parameter_array[0]
key = parameter_array[1]
if origin == "metadata":
key = key.replace('\'', '\\\'')
columns.append("node.metadata->'%s' AS c%d" % (key, c, ))
conditions.append("node.metadata ? '%s'" % (key, ))
group.append("c%d" % (c, ))
order.append("c%d" % (c, ))
else:
raise ValidationError('Unrecognized type "%s" in "parameter[]=%s"' % (origin, parameter, ))
# query building: mesured value
mesured = request.GET.get('mesured', '')
c = len(columns)
if mesured == "documents.count":
columns.append("COUNT(node.id) AS c%d " % (c, ))
elif mesured == "ngrams.count":
columns.append("COUNT(ngram.id) AS c%d " % (c, ))
join_ngrams = True
else:
raise ValidationError('The "mesured" parameter should take one of the following values: "documents.count", "ngrams.count"')
# query building: filters
for filter in request.GET.getlist('filters[]', ''):
if '|' in filter:
filter_array = filter.split("|")
key = filter_array[0]
values = filter_array[1].replace("'", "\\'").split(",")
if key == 'ngram.terms':
conditions.append("ngram.terms IN ('%s')" % ("', '".join(values), ))
join_ngrams = True
else:
raise ValidationError('Unrecognized "filter[]=%s"' % (filter, ))
# query building: assembling
sql = "SELECT %s FROM %s AS node" % (', '.join(columns), Node._meta.db_table, )
if join_ngrams:
sql += " INNER JOIN %s AS node_ngram ON node_ngram.node_id = node.id" % (Node_Ngram._meta.db_table, )
sql += " INNER JOIN %s AS ngram ON ngram.id = node_ngram.ngram_id" % (Ngram._meta.db_table, )
if conditions:
sql += " WHERE %s" % (" AND ".join(conditions), )
if group:
sql += " GROUP BY %s" % (", ".join(group), )
if order:
sql += " ORDER BY %s" % (", ".join(order), )
# query execution
# return HttpResponse(sql)
cursor = connection.cursor()
cursor.execute(sql)
# response building
return JsonHttpResponse({
"list": [row for row in cursor.fetchall()],
})
...@@ -42,6 +42,7 @@ urlpatterns = patterns('', ...@@ -42,6 +42,7 @@ urlpatterns = patterns('',
url(r'^api/corpus/(\d+)/ngrams$', gargantext_web.api.corpus_ngrams), url(r'^api/corpus/(\d+)/ngrams$', gargantext_web.api.corpus_ngrams),
url(r'^api/corpus/(\d+)/metadata$', gargantext_web.api.corpus_metadata), url(r'^api/corpus/(\d+)/metadata$', gargantext_web.api.corpus_metadata),
url(r'^api/corpus/(\d+)/data$', gargantext_web.api.corpus_data),
) )
from django.conf import settings from django.conf import settings
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment