Skip to content

Commit 92d5a87

Browse files
committed
Add sql support and correct all tests data
[skip ci]
1 parent 26686b4 commit 92d5a87

File tree

12 files changed

+49416
-53773
lines changed

12 files changed

+49416
-53773
lines changed

pyslicer/api.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def __init__(
2727
use_ssl(bool) -- Define if the request uses verification SSL for
2828
HTTPS requests. Defaults False.(Optional)
2929
timeout(int) -- Define timeout to request,
30-
defaults 30 secs(Optional).
30+
defaults 60 secs(Optional).
3131
"""
3232
self.keys = self._organize_keys(
3333
master_key, custom_key, read_key, write_key)
@@ -78,25 +78,31 @@ def _check_key(self, key_level):
7878
"This key is not allowed to perform this operation.")
7979
return current_key_level[0]
8080

81-
def _make_request(self, url, req_type, key_level, json_data=None):
81+
def _make_request(self, url, req_type, key_level, json_data=None,
82+
string_data=None, content_type='application/json'):
8283
"""Returns a object request result
8384
8485
Keyword arguments:
8586
url(string) -- the url to make a request
8687
req_type(string) -- the request type (POST, PUT, DELETE or GET)
8788
key_level(int) -- Define the key level needed
8889
json_data(json) -- The json to use on request (default None)
90+
content_type(string) -- The content_type to use in the request (default
91+
'application/json')
8992
"""
9093
self._check_key(key_level)
91-
headers = {'Content-Type': 'application/json',
94+
headers = {'Content-Type': content_type,
9295
'Authorization': self._api_key}
9396

97+
data = json_data
98+
if string_data is not None and json_data is None:
99+
data = string_data
94100
req = None
95101

96102
if req_type == "post":
97103
req = self._requester.post(
98104
url,
99-
data=json_data,
105+
data=data,
100106
headers=headers)
101107
elif req_type == "get":
102108
req = self._requester.get(
@@ -111,7 +117,7 @@ def _make_request(self, url, req_type, key_level, json_data=None):
111117
elif req_type == "put":
112118
req = self._requester.put(
113119
url,
114-
data=json_data,
120+
data=data,
115121
headers=headers)
116122

117123
return self._handler_request(req)

pyslicer/client.py

Lines changed: 40 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -79,22 +79,21 @@ class SlicingDice(SlicingDiceAPI):
7979
}
8080
print sd.insert(inserting_json)
8181
"""
82+
8283
def __init__(
83-
self, write_key=None, read_key=None, master_key=None,
84-
custom_key=None, use_ssl=True, timeout=60, uses_test_endpoint=False):
84+
self, write_key=None, read_key=None, master_key=None,
85+
custom_key=None, use_ssl=True, timeout=60):
8586
"""Instantiate a new SlicingDice object.
8687
8788
Keyword arguments:
8889
key(string or SlicerKey obj) -- Key to access API
8990
use_ssl(bool) -- Define if the request uses verification SSL for
9091
HTTPS requests. Defaults False.(Optional)
9192
timeout(int) -- Define timeout to request,
92-
defaults 30 secs(default 30).
93-
test(bool) -- if true will use tests end-point (default False)
93+
defaults 60 secs(default 30).
9494
"""
9595
super(SlicingDice, self).__init__(
9696
master_key, write_key, read_key, custom_key, use_ssl, timeout)
97-
self.uses_test_endpoint = uses_test_endpoint
9897

9998
def _count_query_wrapper(self, url, query):
10099
"""Validate count query and make request.
@@ -126,12 +125,6 @@ def _data_extraction_wrapper(self, url, query):
126125
req_type="post",
127126
key_level=0)
128127

129-
def _wrapper_test(self):
130-
base_url = SlicingDice.BASE_URL
131-
if self.uses_test_endpoint:
132-
base_url += "/test"
133-
return base_url
134-
135128
def _saved_query_wrapper(self, url, query, update=False):
136129
"""Validate saved query and make request.
137130
@@ -151,7 +144,8 @@ def _saved_query_wrapper(self, url, query, update=False):
151144
key_level=2)
152145

153146
def get_database(self):
154-
"""Get a database associated with this client (related to keys passed on construction)"""
147+
"""Get a database associated with this client (related to keys passed
148+
on construction)"""
155149
url = SlicingDice.BASE_URL + URLResources.DATABASE
156150
return self._make_request(
157151
url=url,
@@ -166,10 +160,9 @@ def create_column(self, data):
166160
data -- A dictionary or list on the Slicing Dice column
167161
format.
168162
"""
169-
base_url = self._wrapper_test()
170163
sd_data = validators.ColumnValidator(data)
171164
if sd_data.validator():
172-
url = base_url + URLResources.COLUMN
165+
url = SlicingDice.BASE_URL + URLResources.COLUMN
173166
return self._make_request(
174167
url=url,
175168
req_type="post",
@@ -178,8 +171,7 @@ def create_column(self, data):
178171

179172
def get_columns(self):
180173
"""Get a list of columns"""
181-
base_url = self._wrapper_test()
182-
url = base_url + URLResources.COLUMN
174+
url = SlicingDice.BASE_URL + URLResources.COLUMN
183175
return self._make_request(
184176
url=url,
185177
req_type="get",
@@ -192,10 +184,9 @@ def insert(self, data):
192184
data -- A dictionary in the Slicing Dice data format
193185
format.
194186
"""
195-
base_url = self._wrapper_test()
196187
sd_data = validators.InsertValidator(data)
197188
if sd_data.validator():
198-
url = base_url + URLResources.INSERT
189+
url = SlicingDice.BASE_URL + URLResources.INSERT
199190
return self._make_request(
200191
url=url,
201192
json_data=ujson.dumps(data),
@@ -208,22 +199,20 @@ def count_entity(self, query):
208199
Keyword arguments:
209200
query -- A dictionary in the Slicing Dice query
210201
"""
211-
base_url = self._wrapper_test()
212-
url = base_url + URLResources.QUERY_COUNT_ENTITY
202+
url = SlicingDice.BASE_URL + URLResources.QUERY_COUNT_ENTITY
213203
return self._count_query_wrapper(url, query)
214204

215-
def count_entity_total(self, tables=[]):
205+
def count_entity_total(self, tables=None):
216206
"""Make a count entity total query
217207
218208
Keyword arguments:
219209
tables -- A dictionary containing the tables in which
220210
the total query will be performed
221211
"""
222-
query = {
223-
'tables': tables
224-
}
225-
base_url = self._wrapper_test()
226-
url = base_url + URLResources.QUERY_COUNT_ENTITY_TOTAL
212+
query = {}
213+
if tables is not None:
214+
query['tables'] = tables
215+
url = SlicingDice.BASE_URL + URLResources.QUERY_COUNT_ENTITY_TOTAL
227216
return self._make_request(
228217
url=url,
229218
req_type="post",
@@ -236,8 +225,7 @@ def count_event(self, query):
236225
Keyword arguments:
237226
data -- A dictionary query
238227
"""
239-
base_url = self._wrapper_test()
240-
url = base_url + URLResources.QUERY_COUNT_EVENT
228+
url = SlicingDice.BASE_URL + URLResources.QUERY_COUNT_EVENT
241229
return self._count_query_wrapper(url, query)
242230

243231
def aggregation(self, query):
@@ -246,8 +234,7 @@ def aggregation(self, query):
246234
Keyword arguments:
247235
query -- An aggregation query
248236
"""
249-
base_url = self._wrapper_test()
250-
url = base_url + URLResources.QUERY_AGGREGATION
237+
url = SlicingDice.BASE_URL + URLResources.QUERY_AGGREGATION
251238
if "query" not in query:
252239
raise exceptions.InvalidQueryException(
253240
"The aggregation query must have up the key 'query'.")
@@ -267,8 +254,7 @@ def top_values(self, query):
267254
Keyword arguments:
268255
query -- A dictionary query
269256
"""
270-
base_url = self._wrapper_test()
271-
url = base_url + URLResources.QUERY_TOP_VALUES
257+
url = SlicingDice.BASE_URL + URLResources.QUERY_TOP_VALUES
272258
sd_query_top_values = validators.QueryValidator(query)
273259
if sd_query_top_values.validator():
274260
return self._make_request(
@@ -284,8 +270,7 @@ def exists_entity(self, ids, table=None):
284270
ids -- A list with entities to check if exists
285271
table -- In which table entities check be checked
286272
"""
287-
base_url = self._wrapper_test()
288-
url = base_url + URLResources.QUERY_EXISTS_ENTITY
273+
url = SlicingDice.BASE_URL + URLResources.QUERY_EXISTS_ENTITY
289274
if len(ids) > 100:
290275
raise exceptions.MaxLimitException(
291276
"The query exists entity must have up to 100 ids.")
@@ -306,8 +291,7 @@ def get_saved_query(self, query_name):
306291
Keyword arguments:
307292
query_name(string) -- The name of the saved query
308293
"""
309-
base_url = self._wrapper_test()
310-
url = base_url + URLResources.QUERY_SAVED + query_name
294+
url = SlicingDice.BASE_URL + URLResources.QUERY_SAVED + query_name
311295
return self._make_request(
312296
url=url,
313297
req_type="get",
@@ -319,8 +303,7 @@ def get_saved_queries(self):
319303
Keyword arguments:
320304
query_name(string) -- The name of the saved query
321305
"""
322-
base_url = self._wrapper_test()
323-
url = base_url + URLResources.QUERY_SAVED
306+
url = SlicingDice.BASE_URL + URLResources.QUERY_SAVED
324307
return self._make_request(
325308
url=url,
326309
req_type="get",
@@ -332,8 +315,7 @@ def delete_saved_query(self, query_name):
332315
Keyword arguments:
333316
query_name(string) -- The name of the saved query
334317
"""
335-
base_url = self._wrapper_test()
336-
url = base_url + URLResources.QUERY_SAVED + query_name
318+
url = SlicingDice.BASE_URL + URLResources.QUERY_SAVED + query_name
337319
return self._make_request(
338320
url=url,
339321
req_type="delete",
@@ -346,8 +328,7 @@ def create_saved_query(self, query):
346328
Keyword arguments:
347329
query -- A dictionary query
348330
"""
349-
base_url = self._wrapper_test()
350-
url = base_url + URLResources.QUERY_SAVED
331+
url = SlicingDice.BASE_URL + URLResources.QUERY_SAVED
351332
return self._saved_query_wrapper(url, query)
352333

353334
def update_saved_query(self, name, query):
@@ -357,8 +338,7 @@ def update_saved_query(self, name, query):
357338
name -- The name of the saved query to update
358339
query -- A dictionary query
359340
"""
360-
base_url = self._wrapper_test()
361-
url = base_url + URLResources.QUERY_SAVED + name
341+
url = SlicingDice.BASE_URL + URLResources.QUERY_SAVED + name
362342
return self._saved_query_wrapper(url, query, True)
363343

364344
def result(self, query):
@@ -367,8 +347,7 @@ def result(self, query):
367347
Keyword arguments:
368348
query -- A dictionary query
369349
"""
370-
base_url = self._wrapper_test()
371-
url = base_url + URLResources.QUERY_DATA_EXTRACTION_RESULT
350+
url = SlicingDice.BASE_URL + URLResources.QUERY_DATA_EXTRACTION_RESULT
372351
return self._data_extraction_wrapper(url, query)
373352

374353
def score(self, query):
@@ -377,6 +356,19 @@ def score(self, query):
377356
Keyword arguments:
378357
query -- A dictionary query
379358
"""
380-
base_url = self._wrapper_test()
381-
url = base_url + URLResources.QUERY_DATA_EXTRACTION_SCORE
359+
url = SlicingDice.BASE_URL + URLResources.QUERY_DATA_EXTRACTION_SCORE
382360
return self._data_extraction_wrapper(url, query)
361+
362+
def sql(self, query):
363+
""" Make a sql query to SlicingDice
364+
365+
:param query: the query written in SQL format
366+
:return: The response from the SlicingDice
367+
"""
368+
url = SlicingDice.BASE_URL + URLResources.QUERY_SQL
369+
return self._make_request(
370+
url=url,
371+
string_data=query,
372+
req_type="post",
373+
key_level=0,
374+
content_type='application/sql')

pyslicer/exceptions.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __str__(self):
1818

1919
class InternalException(SlicingDiceException):
2020
def __init__(self, *args, **kwargs):
21-
super(SlicingDiceHTTPError, self).__init__(self, *args, **kwargs)
21+
super(InternalException, self).__init__(self, *args, **kwargs)
2222

2323

2424
# Specific SlicingDice Exceptions
@@ -50,4 +50,16 @@ def __init__(self, *args, **kwargs):
5050

5151
class IndexColumnsLimitException(SlicingDiceException):
5252
def __init__(self, *args, **kwargs):
53-
super(IndexColumnsLimitException, self).__init__(self, *args, **kwargs)
53+
super(IndexColumnsLimitException, self).__init__(self, *args, **kwargs)
54+
55+
# Validation exceptions
56+
57+
58+
class MaxLimitException(SlicingDiceException):
59+
def __init__(self, *args, **kwargs):
60+
super(MaxLimitException, self).__init__(self, *args, **kwargs)
61+
62+
63+
class InvalidQueryException(SlicingDiceException):
64+
def __init__(self, *args, **kwargs):
65+
super(InvalidQueryException, self).__init__(self, *args, **kwargs)

pyslicer/url_resources.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ class URLResources(object):
1515
QUERY_SAVED = "/query/saved/"
1616
QUERY_DATA_EXTRACTION_RESULT = "/data_extraction/result/"
1717
QUERY_DATA_EXTRACTION_SCORE = "/data_extraction/score/"
18+
QUERY_SQL = "/query/sql/"

0 commit comments

Comments
 (0)