fastapi 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/fastapi.rb +157 -25
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91ec2057fc92dc867573e641cf9afbc4cf34908e
|
4
|
+
data.tar.gz: 3ebb509840114634d4279516fc2b939f08910f94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27e8290f2b34ac378c0b6fae534971199299c5277b49131728845ce6427e13df772ee47860515180edfc21b02eb8eefb7c2628d4e1030b4283e7ff960e93723b
|
7
|
+
data.tar.gz: 783b73a2ab2cd26af95cbededc10e887b45c0287a8992f6f65a1788f43d4286c28cdbcf6fe5a5288848be23d936799731c72c37c3cfa9c3464ffe0654e77ab71
|
data/lib/fastapi.rb
CHANGED
@@ -37,7 +37,7 @@ class FastAPI
|
|
37
37
|
|
38
38
|
# Create and execute an optimized SQL query based on specified filters
|
39
39
|
#
|
40
|
-
# @param fields [Array] an array containing fields to whitelist for the SQL query
|
40
|
+
# @param fields [Array] an array containing fields to whitelist for the SQL query. Can also pass in fields as arguments.
|
41
41
|
# @return [FastAPI] the current instance
|
42
42
|
def whitelist(fields = [])
|
43
43
|
|
@@ -312,11 +312,19 @@ class FastAPI
|
|
312
312
|
currow[obj_name] = {}
|
313
313
|
end
|
314
314
|
|
315
|
-
currow[obj_name][field.to_sym] = api_convert_type(
|
315
|
+
currow[obj_name][field.to_sym] = api_convert_type(
|
316
|
+
val,
|
317
|
+
model.columns_hash[field].type,
|
318
|
+
(model.columns_hash[field].respond_to?('array') and model.columns_hash[field].array)
|
319
|
+
)
|
316
320
|
|
317
321
|
elsif @model.columns_hash[field]
|
318
322
|
|
319
|
-
currow[field.to_sym] = api_convert_type(
|
323
|
+
currow[field.to_sym] = api_convert_type(
|
324
|
+
val,
|
325
|
+
@model.columns_hash[field].type,
|
326
|
+
(@model.columns_hash[field].respond_to?('array') and @model.columns_hash[field].array)
|
327
|
+
)
|
320
328
|
|
321
329
|
end
|
322
330
|
|
@@ -340,6 +348,85 @@ class FastAPI
|
|
340
348
|
|
341
349
|
end
|
342
350
|
|
351
|
+
# the two following methods are very similar, can reuse
|
352
|
+
|
353
|
+
def parse_postgres_array(str)
|
354
|
+
|
355
|
+
i = 0
|
356
|
+
len = str.length
|
357
|
+
|
358
|
+
values = []
|
359
|
+
|
360
|
+
i = str.index('{')
|
361
|
+
|
362
|
+
return values unless i
|
363
|
+
|
364
|
+
i = i + 1
|
365
|
+
|
366
|
+
while i < len
|
367
|
+
|
368
|
+
c = str[i]
|
369
|
+
|
370
|
+
if c == '}'
|
371
|
+
|
372
|
+
break
|
373
|
+
|
374
|
+
elsif c == '"'
|
375
|
+
|
376
|
+
i += 1
|
377
|
+
nextIndex = str.index('"', i)
|
378
|
+
|
379
|
+
while str[nextIndex - 1] == '\\'
|
380
|
+
|
381
|
+
j = 1
|
382
|
+
while str[nextIndex - j] == '\\'
|
383
|
+
j += 1
|
384
|
+
end
|
385
|
+
|
386
|
+
if j & 1 == 1
|
387
|
+
break
|
388
|
+
end
|
389
|
+
|
390
|
+
nextIndex = str.index('"', nextIndex + 1)
|
391
|
+
|
392
|
+
end
|
393
|
+
|
394
|
+
values.push str[i...nextIndex]
|
395
|
+
|
396
|
+
i = nextIndex + 1
|
397
|
+
|
398
|
+
else
|
399
|
+
|
400
|
+
if c == ','
|
401
|
+
|
402
|
+
values.push nil
|
403
|
+
i += 1
|
404
|
+
next
|
405
|
+
|
406
|
+
end
|
407
|
+
|
408
|
+
parensIndex = str.index('}', i)
|
409
|
+
nextIndex = str.index(',', i)
|
410
|
+
|
411
|
+
if nextIndex.nil? or nextIndex > parensIndex
|
412
|
+
|
413
|
+
values.push str[i...parensIndex]
|
414
|
+
break
|
415
|
+
|
416
|
+
end
|
417
|
+
|
418
|
+
values.push str[i...nexIndex]
|
419
|
+
|
420
|
+
i = nextIndex + 1
|
421
|
+
|
422
|
+
end
|
423
|
+
|
424
|
+
end
|
425
|
+
|
426
|
+
return values
|
427
|
+
|
428
|
+
end
|
429
|
+
|
343
430
|
def parse_many(str, fields = [], types = [])
|
344
431
|
|
345
432
|
rows = []
|
@@ -432,31 +519,37 @@ class FastAPI
|
|
432
519
|
end
|
433
520
|
|
434
521
|
|
435
|
-
def api_comparison(comparator, value)
|
522
|
+
def api_comparison(comparator, value, field, type, is_array)
|
523
|
+
|
524
|
+
unless is_array
|
525
|
+
field_string = field
|
526
|
+
else
|
527
|
+
field_string = 'ANY(' + field + ')'
|
528
|
+
end
|
436
529
|
|
437
530
|
if comparator == 'is'
|
438
531
|
|
439
|
-
|
532
|
+
ActiveRecord::Base.connection.quote(value.to_s) + ' = ' + field_string
|
440
533
|
|
441
534
|
elsif comparator == 'not'
|
442
535
|
|
443
|
-
|
536
|
+
ActiveRecord::Base.connection.quote(value.to_s) + ' <> ' + field_string
|
444
537
|
|
445
538
|
elsif comparator == 'gt'
|
446
539
|
|
447
|
-
|
540
|
+
ActiveRecord::Base.connection.quote(value.to_s) + ' < ' + field_string
|
448
541
|
|
449
542
|
elsif comparator == 'gte'
|
450
543
|
|
451
|
-
|
544
|
+
ActiveRecord::Base.connection.quote(value.to_s) + ' <= ' + field_string
|
452
545
|
|
453
546
|
elsif comparator == 'lt'
|
454
547
|
|
455
|
-
|
548
|
+
ActiveRecord::Base.connection.quote(value.to_s) + ' > ' + field_string
|
456
549
|
|
457
550
|
elsif comparator == 'lte'
|
458
551
|
|
459
|
-
|
552
|
+
ActiveRecord::Base.connection.quote(value.to_s) + ' >= ' + field_string
|
460
553
|
|
461
554
|
elsif comparator == 'in' or comparator == 'not_in'
|
462
555
|
|
@@ -470,33 +563,61 @@ class FastAPI
|
|
470
563
|
|
471
564
|
end
|
472
565
|
|
473
|
-
if
|
474
|
-
|
566
|
+
if is_array
|
567
|
+
|
568
|
+
type_convert = {
|
569
|
+
boolean: '::boolean',
|
570
|
+
integer: '::integer',
|
571
|
+
float: '::float'
|
572
|
+
}[type]
|
573
|
+
|
574
|
+
type_convert = '::text' if type.nil?
|
575
|
+
|
576
|
+
if comparator == 'in'
|
577
|
+
'ARRAY[' + (value.map { |val| ActiveRecord::Base.connection.quote(val.to_s) }).join(',') + ']' + type_convert + '[] && ' + field
|
578
|
+
else
|
579
|
+
'NOT ARRAY[' + (value.map { |val| ActiveRecord::Base.connection.quote(val.to_s) }).join(',') + ']' + type_convert + '[] && ' + field
|
580
|
+
end
|
581
|
+
|
475
582
|
else
|
476
|
-
|
583
|
+
|
584
|
+
if comparator == 'in'
|
585
|
+
field + ' IN(' + (value.map { |val| ActiveRecord::Base.connection.quote(val.to_s) }).join(',') + ')'
|
586
|
+
else
|
587
|
+
field + ' NOT IN(' + (value.map { |val| ActiveRecord::Base.connection.quote(val.to_s) }).join(',') + ')'
|
588
|
+
end
|
589
|
+
|
477
590
|
end
|
478
591
|
|
479
592
|
elsif comparator == 'contains'
|
480
593
|
|
481
|
-
'
|
594
|
+
'\'%\' || ' + ActiveRecord::Base.connection.quote(value.to_s) + ' || \'%\' LIKE ' + field_string
|
482
595
|
|
483
596
|
elsif comparator == 'icontains'
|
484
597
|
|
485
|
-
'
|
598
|
+
'\'%\' || ' + ActiveRecord::Base.connection.quote(value.to_s) + ' || \'%\' ILIKE ' + field_string
|
486
599
|
|
487
600
|
elsif comparator == 'is_null'
|
488
601
|
|
489
|
-
'
|
602
|
+
'NULL = ' + field_string
|
490
603
|
|
491
604
|
elsif comparator == 'not_null'
|
492
605
|
|
493
|
-
'
|
606
|
+
'NOT NULL = ' + field_string
|
494
607
|
|
495
608
|
end
|
496
609
|
|
497
610
|
end
|
498
611
|
|
499
|
-
def api_convert_type(val, type)
|
612
|
+
def api_convert_type(val, type, is_array = false)
|
613
|
+
|
614
|
+
return api_convert_value(val, type) unless is_array
|
615
|
+
|
616
|
+
return parse_postgres_array(val).map { |inner_value| api_convert_value(inner_value, type) }
|
617
|
+
|
618
|
+
end
|
619
|
+
|
620
|
+
def api_convert_value(val, type)
|
500
621
|
|
501
622
|
if not val.nil?
|
502
623
|
if type == :integer
|
@@ -691,6 +812,17 @@ class FastAPI
|
|
691
812
|
|
692
813
|
elsif self_obj.column_names.include? field
|
693
814
|
|
815
|
+
base_field = self_string_table + '.' + field
|
816
|
+
field_string = base_field
|
817
|
+
is_array = false
|
818
|
+
|
819
|
+
if self_obj.columns_hash[field].respond_to?('array') and self_obj.columns_hash[field].array == true
|
820
|
+
|
821
|
+
field_string = 'ANY(' + field_string + ')'
|
822
|
+
is_array = true
|
823
|
+
|
824
|
+
end
|
825
|
+
|
694
826
|
if self_obj.columns_hash[field].type == :boolean
|
695
827
|
|
696
828
|
if !!value != value
|
@@ -715,9 +847,9 @@ class FastAPI
|
|
715
847
|
if !!value == value
|
716
848
|
|
717
849
|
if comparator == 'is'
|
718
|
-
filter_array <<
|
850
|
+
filter_array << value.to_s.upcase + ' = ' + field_string
|
719
851
|
elsif comparator == 'not'
|
720
|
-
filter_array <<
|
852
|
+
filter_array << 'NOT ' + value.to_s.upcase + ' = ' + field_string
|
721
853
|
end
|
722
854
|
|
723
855
|
end
|
@@ -725,19 +857,19 @@ class FastAPI
|
|
725
857
|
elsif value == nil and comparator != 'is_null' and comparator != 'not_null'
|
726
858
|
|
727
859
|
if comparator == 'is'
|
728
|
-
filter_array <<
|
860
|
+
filter_array << 'NULL = ' + field_string
|
729
861
|
elsif comparator == 'not'
|
730
|
-
filter_array <<
|
862
|
+
filter_array << 'NOT NULL = ' + field_string
|
731
863
|
end
|
732
864
|
|
733
865
|
elsif value.is_a? Range and comparator == 'is'
|
734
866
|
|
735
|
-
filter_array <<
|
736
|
-
filter_array <<
|
867
|
+
filter_array << ActiveRecord::Base.connection.quote(value.first.to_s) + ' <= ' + field_string
|
868
|
+
filter_array << ActiveRecord::Base.connection.quote(value.last.to_s) + ' >= ' + field_string
|
737
869
|
|
738
870
|
else
|
739
871
|
|
740
|
-
filter_array <<
|
872
|
+
filter_array << api_comparison(comparator, value, base_field, self_obj.columns_hash[field].type, is_array)
|
741
873
|
|
742
874
|
end
|
743
875
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Horwood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|