crossfilter_rails 1.1.3 → 1.2.1.pre1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 44372cfc78bba6d96fc048cea1a6f90263493412
4
+ data.tar.gz: 3d012093e042e40c021df7ec0a33df6d489a1552
5
+ SHA512:
6
+ metadata.gz: 69fc24d38b23a4c1df1f8b38a884fdefc1ab74936d06f71a7913680c94d703d146a3171e903ba40afa7ff168b9b0c7fe6791f48a04e73787d9f20d6ee646941c
7
+ data.tar.gz: 99f39462432291fb70bc52f55f7741ab3e478123a26437ff1766f07793fdaf6a0b89b0f46e7b40ff2a91e44ad301e9bf4e262879deeb1c86d6d1a51f2ee6489e
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Version
6
6
 
7
- The current version of crossfilter included in this gem is version 1.1.3.
7
+ The current crossfilter version used in this gem is 1.2.0.
8
8
 
9
9
  ## Installation
10
10
 
@@ -1,5 +1,5 @@
1
1
  (function(exports){
2
- crossfilter.version = "1.1.3";
2
+ crossfilter.version = "1.2.0";
3
3
  function crossfilter_identity(d) {
4
4
  return d;
5
5
  }
@@ -23,18 +23,15 @@ function bisect_by(f) {
23
23
  // present in a, the insertion point will be before (to the left of) any
24
24
  // existing entries. The return value is suitable for use as the first
25
25
  // argument to `array.splice` assuming that a is already sorted.
26
- // Incomparable values such as NaN and undefined are assumed to be at the end
27
- // of the array.
28
26
  //
29
27
  // The returned insertion point i partitions the array a into two halves so
30
28
  // that all v < x for v in a[lo:i] for the left side and all v >= x for v in
31
29
  // a[i:hi] for the right side.
32
30
  function bisectLeft(a, x, lo, hi) {
33
31
  while (lo < hi) {
34
- var mid = lo + hi >>> 1,
35
- y = f(a[mid]);
36
- if (x <= y || !(y <= y)) hi = mid;
37
- else lo = mid + 1;
32
+ var mid = lo + hi >>> 1;
33
+ if (f(a[mid]) < x) lo = mid + 1;
34
+ else hi = mid;
38
35
  }
39
36
  return lo;
40
37
  }
@@ -47,9 +44,8 @@ function bisect_by(f) {
47
44
  // a[i:hi] for the right side.
48
45
  function bisectRight(a, x, lo, hi) {
49
46
  while (lo < hi) {
50
- var mid = lo + hi >>> 1,
51
- y = f(a[mid]);
52
- if (x < y || !(y <= y)) hi = mid;
47
+ var mid = lo + hi >>> 1;
48
+ if (x < f(a[mid])) hi = mid;
53
49
  else lo = mid + 1;
54
50
  }
55
51
  return lo;
@@ -147,7 +143,7 @@ function insertionsort_by(f) {
147
143
 
148
144
  function insertionsort(a, lo, hi) {
149
145
  for (var i = lo + 1; i < hi; ++i) {
150
- for (var j = i, t = a[i], x = f(t), y; j > lo && ((y = f(a[j - 1])) > x || !(y <= y)); --j) {
146
+ for (var j = i, t = a[i], x = f(t); j > lo && f(a[j - 1]) > x; --j) {
151
147
  a[j] = a[j - 1];
152
148
  }
153
149
  a[j] = t;
@@ -174,17 +170,6 @@ function quicksort_by(f) {
174
170
  }
175
171
 
176
172
  function quicksort(a, lo, hi) {
177
- // First move NaN and undefined to the end.
178
- var x, y;
179
- while (lo < hi && !((x = f(a[hi - 1])) <= x)) hi--;
180
- for (var i = hi; --i >= lo; ) {
181
- x = f(y = a[i]);
182
- if (!(x <= x)) {
183
- a[i] = a[--hi];
184
- a[hi] = y;
185
- }
186
- }
187
-
188
173
  // Compute the two pivots by looking at 5 elements.
189
174
  var sixth = (hi - lo) / 6 | 0,
190
175
  i1 = lo + sixth,
@@ -539,7 +524,7 @@ function crossfilter() {
539
524
 
540
525
  var data = [], // the records
541
526
  n = 0, // the number of records; data.length
542
- m = 0, // number of dimensions in use
527
+ m = 0, // a bit mask representing which dimensions are in use
543
528
  M = 8, // number of dimensions that can fit in `filters`
544
529
  filters = crossfilter_array8(0), // M bits per record; 1 is filtered out
545
530
  filterListeners = [], // when the filters change
@@ -569,14 +554,16 @@ function crossfilter() {
569
554
  filter: filter,
570
555
  filterExact: filterExact,
571
556
  filterRange: filterRange,
557
+ filterFunction: filterFunction,
572
558
  filterAll: filterAll,
573
559
  top: top,
574
560
  bottom: bottom,
575
561
  group: group,
576
- groupAll: groupAll
562
+ groupAll: groupAll,
563
+ remove: remove
577
564
  };
578
565
 
579
- var one = 1 << m++, // bit mask, e.g., 00001000
566
+ var one = ~m & -~m, // lowest unset bit as mask, e.g., 00001000
580
567
  zero = ~one, // inverted one, e.g., 11110111
581
568
  values, // sorted, cached array
582
569
  index, // value rank ↦ object id
@@ -584,7 +571,9 @@ function crossfilter() {
584
571
  newIndex, // temporary array storing newly-added index
585
572
  sort = quicksort_by(function(i) { return newValues[i]; }),
586
573
  refilter = crossfilter_filterAll, // for recomputing filter
574
+ refilterFunction, // the custom filter function in use
587
575
  indexListeners = [], // when data is added
576
+ dimensionGroups = [],
588
577
  lo0 = 0,
589
578
  hi0 = 0;
590
579
 
@@ -596,7 +585,10 @@ function crossfilter() {
596
585
 
597
586
  // Incorporate any existing data into this dimension, and make sure that the
598
587
  // filter bitset is wide enough to handle the new dimension.
599
- if (m > M) filters = crossfilter_arrayWiden(filters, M <<= 1);
588
+ m |= one;
589
+ if (M >= 32 ? !one : m & (1 << M) - 1) {
590
+ filters = crossfilter_arrayWiden(filters, M <<= 1);
591
+ }
600
592
  preAdd(data, 0, n);
601
593
  postAdd(data, 0, n);
602
594
 
@@ -610,9 +602,15 @@ function crossfilter() {
610
602
  newValues = permute(newValues, newIndex);
611
603
 
612
604
  // Bisect newValues to determine which new records are selected.
613
- var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1], i;
614
- for (i = 0; i < lo1; ++i) filters[newIndex[i] + n0] |= one;
615
- for (i = hi1; i < n1; ++i) filters[newIndex[i] + n0] |= one;
605
+ var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1], i, k;
606
+ if (refilterFunction) {
607
+ for (i = 0; i < n1; ++i) {
608
+ if (!refilterFunction(newValues[i], k = newIndex[i] + n0)) filters[k] |= one;
609
+ }
610
+ } else {
611
+ for (i = 0; i < lo1; ++i) filters[newIndex[i] + n0] |= one;
612
+ for (i = hi1; i < n1; ++i) filters[newIndex[i] + n0] |= one;
613
+ }
616
614
 
617
615
  // If this dimension previously had no data, then we don't need to do the
618
616
  // more expensive merge operation; use the new values and index as-is.
@@ -668,12 +666,21 @@ function crossfilter() {
668
666
 
669
667
  // Updates the selected values based on the specified bounds [lo, hi].
670
668
  // This implementation is used by all the public filter methods.
671
- function filterIndex(bounds) {
669
+ function filterIndexBounds(bounds) {
670
+ var lo1 = bounds[0],
671
+ hi1 = bounds[1];
672
+
673
+ if (refilterFunction) {
674
+ refilterFunction = null;
675
+ filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; });
676
+ lo0 = lo1;
677
+ hi0 = hi1;
678
+ return dimension;
679
+ }
680
+
672
681
  var i,
673
682
  j,
674
683
  k,
675
- lo1 = bounds[0],
676
- hi1 = bounds[1],
677
684
  added = [],
678
685
  removed = [];
679
686
 
@@ -716,24 +723,53 @@ function crossfilter() {
716
723
  function filter(range) {
717
724
  return range == null
718
725
  ? filterAll() : Array.isArray(range)
719
- ? filterRange(range)
726
+ ? filterRange(range) : typeof range === "function"
727
+ ? filterFunction(range)
720
728
  : filterExact(range);
721
729
  }
722
730
 
723
731
  // Filters this dimension to select the exact value.
724
732
  function filterExact(value) {
725
- return filterIndex((refilter = crossfilter_filterExact(bisect, value))(values));
733
+ return filterIndexBounds((refilter = crossfilter_filterExact(bisect, value))(values));
726
734
  }
727
735
 
728
736
  // Filters this dimension to select the specified range [lo, hi].
729
737
  // The lower bound is inclusive, and the upper bound is exclusive.
730
738
  function filterRange(range) {
731
- return filterIndex((refilter = crossfilter_filterRange(bisect, range))(values));
739
+ return filterIndexBounds((refilter = crossfilter_filterRange(bisect, range))(values));
732
740
  }
733
741
 
734
742
  // Clears any filters on this dimension.
735
743
  function filterAll() {
736
- return filterIndex((refilter = crossfilter_filterAll)(values));
744
+ return filterIndexBounds((refilter = crossfilter_filterAll)(values));
745
+ }
746
+
747
+ // Filters this dimension using an arbitrary function.
748
+ function filterFunction(f) {
749
+ refilter = crossfilter_filterAll;
750
+
751
+ filterIndexFunction(refilterFunction = f);
752
+
753
+ lo0 = 0;
754
+ hi0 = n;
755
+
756
+ return dimension;
757
+ }
758
+
759
+ function filterIndexFunction(f) {
760
+ var i,
761
+ k,
762
+ x,
763
+ added = [],
764
+ removed = [];
765
+
766
+ for (i = 0; i < n; ++i) {
767
+ if (!(filters[k = index[i]] & one) ^ (x = f(values[i], k))) {
768
+ if (x) filters[k] &= zero, added.push(k);
769
+ else filters[k] |= one, removed.push(k);
770
+ }
771
+ }
772
+ filterListeners.forEach(function(l) { l(one, added, removed); });
737
773
  }
738
774
 
739
775
  // Returns the top K selected records based on this dimension's order.
@@ -781,9 +817,13 @@ function crossfilter() {
781
817
  reduceSum: reduceSum,
782
818
  order: order,
783
819
  orderNatural: orderNatural,
784
- size: size
820
+ size: size,
821
+ remove: remove
785
822
  };
786
823
 
824
+ // Ensure that this group will be removed when the dimension is removed.
825
+ dimensionGroups.push(group);
826
+
787
827
  var groups, // array of {key, value}
788
828
  groupIndex, // object id ↦ group id
789
829
  groupWidth = 8,
@@ -837,8 +877,8 @@ function crossfilter() {
837
877
  // Get the first old key (x0 of g0), if it exists.
838
878
  if (k0) x0 = (g0 = oldGroups[0]).key;
839
879
 
840
- // Find the first new key (x1).
841
- x1 = key(newValues[i1]);
880
+ // Find the first new key (x1), skipping NaN keys.
881
+ while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;
842
882
 
843
883
  // While new keys remain…
844
884
  while (i1 < n1) {
@@ -862,7 +902,7 @@ function crossfilter() {
862
902
 
863
903
  // Add any selected records belonging to the added group, while
864
904
  // advancing the new key and populating the associated group index.
865
- while (x1 <= x || !(x1 <= x1) && !(x <= x)) {
905
+ while (!(x1 > x)) {
866
906
  groupIndex[j = newIndex[i1] + n0] = k;
867
907
  if (!(filters[j] & zero)) g.value = add(g.value, data[j]);
868
908
  if (++i1 >= n1) break;
@@ -1057,6 +1097,15 @@ function crossfilter() {
1057
1097
  return k;
1058
1098
  }
1059
1099
 
1100
+ // Removes this group and associated event listeners.
1101
+ function remove() {
1102
+ var i = filterListeners.indexOf(update);
1103
+ if (i >= 0) filterListeners.splice(i, 1);
1104
+ i = indexListeners.indexOf(add);
1105
+ if (i >= 0) indexListeners.splice(i, 1);
1106
+ return group;
1107
+ }
1108
+
1060
1109
  return reduceCount().orderNatural();
1061
1110
  }
1062
1111
 
@@ -1072,17 +1121,29 @@ function crossfilter() {
1072
1121
  return g;
1073
1122
  }
1074
1123
 
1124
+ function remove() {
1125
+ dimensionGroups.forEach(function(group) { group.remove(); });
1126
+ var i = dataListeners.indexOf(preAdd);
1127
+ if (i >= 0) dataListeners.splice(i, 1);
1128
+ i = dataListeners.indexOf(postAdd);
1129
+ if (i >= 0) dataListeners.splice(i, 1);
1130
+ for (i = 0; i < n; ++i) filters[i] &= zero;
1131
+ m &= zero;
1132
+ return dimension;
1133
+ }
1134
+
1075
1135
  return dimension;
1076
1136
  }
1077
1137
 
1078
1138
  // A convenience method for groupAll on a dummy dimension.
1079
- // This implementation can be optimized since it is always cardinality 1.
1139
+ // This implementation can be optimized since it always has cardinality 1.
1080
1140
  function groupAll() {
1081
1141
  var group = {
1082
1142
  reduce: reduce,
1083
1143
  reduceCount: reduceCount,
1084
1144
  reduceSum: reduceSum,
1085
- value: value
1145
+ value: value,
1146
+ remove: remove
1086
1147
  };
1087
1148
 
1088
1149
  var reduceValue,
@@ -1176,6 +1237,15 @@ function crossfilter() {
1176
1237
  return reduceValue;
1177
1238
  }
1178
1239
 
1240
+ // Removes this group and associated event listeners.
1241
+ function remove() {
1242
+ var i = filterListeners.indexOf(update);
1243
+ if (i >= 0) filterListeners.splice(i);
1244
+ i = dataListeners.indexOf(add);
1245
+ if (i >= 0) dataListeners.splice(i);
1246
+ return group;
1247
+ }
1248
+
1179
1249
  return reduceCount();
1180
1250
  }
1181
1251
 
@@ -0,0 +1 @@
1
+ (function(r){function n(r){return r}function t(r,n){for(var t=0,e=n.length,u=Array(e);e>t;++t)u[t]=r[n[t]];return u}function e(r){function n(n,t,e,u){for(;u>e;){var f=e+u>>>1;r(n[f])<t?e=f+1:u=f}return e}function t(n,t,e,u){for(;u>e;){var f=e+u>>>1;t<r(n[f])?u=f:e=f+1}return e}return t.right=t,t.left=n,t}function u(r){function n(r,n,t){for(var u=t-n,f=(u>>>1)+1;--f>0;)e(r,f,u,n);return r}function t(r,n,t){for(var u,f=t-n;--f>0;)u=r[n],r[n]=r[n+f],r[n+f]=u,e(r,1,f,n);return r}function e(n,t,e,u){for(var f,o=n[--u+t],i=r(o);(f=t<<1)<=e&&(e>f&&r(n[u+f])>r(n[u+f+1])&&f++,!(i<=r(n[u+f])));)n[u+t]=n[u+f],t=f;n[u+t]=o}return n.sort=t,n}function f(r){function n(n,e,u,f){var o,i,a,c,l=Array(f=Math.min(u-e,f));for(i=0;f>i;++i)l[i]=n[e++];if(t(l,0,f),u>e){o=r(l[0]);do(a=r(c=n[e])>o)&&(l[0]=c,o=r(t(l,0,f)[0]));while(++e<u)}return l}var t=u(r);return n}function o(r){function n(n,t,e){for(var u=t+1;e>u;++u){for(var f=u,o=n[u],i=r(o);f>t&&r(n[f-1])>i;--f)n[f]=n[f-1];n[f]=o}return n}return n}function i(r){function n(r,n,u){return(U>u-n?e:t)(r,n,u)}function t(t,e,u){var f,o=0|(u-e)/6,i=e+o,a=u-1-o,c=e+u-1>>1,l=c-o,v=c+o,s=t[i],h=r(s),d=t[l],p=r(d),g=t[c],y=r(g),m=t[v],b=r(m),A=t[a],k=r(A);h>p&&(f=s,s=d,d=f,f=h,h=p,p=f),b>k&&(f=m,m=A,A=f,f=b,b=k,k=f),h>y&&(f=s,s=g,g=f,f=h,h=y,y=f),p>y&&(f=d,d=g,g=f,f=p,p=y,y=f),h>b&&(f=s,s=m,m=f,f=h,h=b,b=f),y>b&&(f=g,g=m,m=f,f=y,y=b,b=f),p>k&&(f=d,d=A,A=f,f=p,p=k,k=f),p>y&&(f=d,d=g,g=f,f=p,p=y,y=f),b>k&&(f=m,m=A,A=f,f=b,b=k,k=f);var x=d,w=p,E=m,O=b;t[i]=s,t[l]=t[e],t[c]=g,t[v]=t[u-1],t[a]=A;var M=e+1,U=u-2,z=O>=w&&w>=O;if(z)for(var N=M;U>=N;++N){var C=t[N],S=r(C);if(w>S)N!==M&&(t[N]=t[M],t[M]=C),++M;else if(S>w)for(;;){var q=r(t[U]);{if(!(q>w)){if(w>q){t[N]=t[M],t[M++]=t[U],t[U--]=C;break}t[N]=t[U],t[U--]=C;break}U--}}}else for(var N=M;U>=N;N++){var C=t[N],S=r(C);if(w>S)N!==M&&(t[N]=t[M],t[M]=C),++M;else if(S>O)for(;;){var q=r(t[U]);{if(!(q>O)){w>q?(t[N]=t[M],t[M++]=t[U],t[U--]=C):(t[N]=t[U],t[U--]=C);break}if(U--,N>U)break}}}if(t[e]=t[M-1],t[M-1]=x,t[u-1]=t[U+1],t[U+1]=E,n(t,e,M-1),n(t,U+2,u),z)return t;if(i>M&&U>a){for(var F,q;(F=r(t[M]))<=w&&F>=w;)++M;for(;(q=r(t[U]))<=O&&q>=O;)--U;for(var N=M;U>=N;N++){var C=t[N],S=r(C);if(w>=S&&S>=w)N!==M&&(t[N]=t[M],t[M]=C),M++;else if(O>=S&&S>=O)for(;;){var q=r(t[U]);{if(!(O>=q&&q>=O)){w>q?(t[N]=t[M],t[M++]=t[U],t[U--]=C):(t[N]=t[U],t[U--]=C);break}if(U--,N>U)break}}}}return n(t,M,U+1)}var e=o(r);return n}function a(r){return Array(r)}function c(r,n){return function(t){var e=t.length;return[r.left(t,n,0,e),r.right(t,n,0,e)]}}function l(r,n){var t=n[0],e=n[1];return function(n){var u=n.length;return[r.left(n,t,0,u),r.left(n,e,0,u)]}}function v(r){return[0,r.length]}function s(){return null}function h(){return 0}function d(r){return r+1}function p(r){return r-1}function g(r){return function(n,t){return n+ +r(t)}}function y(r){return function(n,t){return n-r(t)}}function m(){function r(r){var n=E,t=r.length;return t&&(w=w.concat(r),U=S(U,E+=t),C.forEach(function(e){e(r,n,t)})),m}function e(r){function e(n,e,u){P=n.map(r),Q=Y(A(u),0,u),P=t(P,Q);var f,o,i=Z(P),a=i[0],c=i[1];if(T)for(f=0;u>f;++f)T(P[f],o=Q[f]+e)||(U[o]|=W);else{for(f=0;a>f;++f)U[Q[f]+e]|=W;for(f=c;u>f;++f)U[Q[f]+e]|=W}if(!e)return K=P,L=Q,rn=a,nn=c,void 0;var l=K,v=L,s=0,h=0;for(K=Array(E),L=b(E,E),f=0;e>s&&u>h;++f)l[s]<P[h]?(K[f]=l[s],L[f]=v[s++]):(K[f]=P[h],L[f]=Q[h++]+e);for(;e>s;++s,++f)K[f]=l[s],L[f]=v[s];for(;u>h;++h,++f)K[f]=P[h],L[f]=Q[h]+e;i=Z(K),rn=i[0],nn=i[1]}function o(r,n,t){$.forEach(function(r){r(P,Q,n,t)}),P=Q=null}function a(r){var n=r[0],t=r[1];if(T)return T=null,B(function(r,e){return e>=n&&t>e}),rn=n,nn=t,V;var e,u,f,o=[],i=[];if(rn>n)for(e=n,u=Math.min(rn,t);u>e;++e)U[f=L[e]]^=W,o.push(f);else if(n>rn)for(e=rn,u=Math.min(n,nn);u>e;++e)U[f=L[e]]^=W,i.push(f);if(t>nn)for(e=Math.max(n,nn),u=t;u>e;++e)U[f=L[e]]^=W,o.push(f);else if(nn>t)for(e=Math.max(rn,t),u=nn;u>e;++e)U[f=L[e]]^=W,i.push(f);return rn=n,nn=t,N.forEach(function(r){r(W,o,i)}),V}function m(r){return null==r?R():Array.isArray(r)?F(r):"function"==typeof r?j(r):z(r)}function z(r){return a((Z=c(x,r))(K))}function F(r){return a((Z=l(x,r))(K))}function R(){return a((Z=v)(K))}function j(r){return Z=v,B(T=r),rn=0,nn=E,V}function B(r){var n,t,e,u=[],f=[];for(n=0;E>n;++n)!(U[t=L[n]]&W)^(e=r(K[n],t))&&(e?(U[t]&=X,u.push(t)):(U[t]|=W,f.push(t)));N.forEach(function(r){r(W,u,f)})}function D(r){for(var n,t=[],e=nn;--e>=rn&&r>0;)U[n=L[e]]||(t.push(w[n]),--r);return t}function G(r){for(var n,t=[],e=rn;nn>e&&r>0;)U[n=L[e]]||(t.push(w[n]),--r),e++;return t}function H(r){function t(n,t,u,f){function c(){++P===J&&(m=q(m,I<<=1),R=q(R,I),J=k(I))}var l,v,h,d,p,g,y=F,m=b(P,J),A=D,x=H,O=P,M=0,z=0;for(V&&(A=x=s),F=Array(P),P=0,R=O>1?S(R,E):b(E,J),O&&(h=(v=y[0]).key);f>z&&!((d=r(n[z]))>=d);)++z;for(;f>z;){for(v&&d>=h?(p=v,g=h,m[M]=P,(v=y[++M])&&(h=v.key)):(p={key:d,value:x()},g=d),F[P]=p;!(d>g||(R[l=t[z]+u]=P,U[l]&X||(p.value=A(p.value,w[l])),++z>=f));)d=r(n[z]);c()}for(;O>M;)F[m[M]=P]=y[M++],c();if(P>M)for(M=0;u>M;++M)R[M]=m[R[M]];l=N.indexOf(Q),P>1?(Q=e,T=i):(1===P?(Q=o,T=a):(Q=s,T=s),R=null),N[l]=Q}function e(r,n,t){if(r!==W&&!V){var e,u,f,o;for(e=0,f=n.length;f>e;++e)U[u=n[e]]&X||(o=F[R[u]],o.value=D(o.value,w[u]));for(e=0,f=t.length;f>e;++e)(U[u=t[e]]&X)===r&&(o=F[R[u]],o.value=G(o.value,w[u]))}}function o(r,n,t){if(r!==W&&!V){var e,u,f,o=F[0];for(e=0,f=n.length;f>e;++e)U[u=n[e]]&X||(o.value=D(o.value,w[u]));for(e=0,f=t.length;f>e;++e)(U[u=t[e]]&X)===r&&(o.value=G(o.value,w[u]))}}function i(){var r,n;for(r=0;P>r;++r)F[r].value=H();for(r=0;E>r;++r)U[r]&X||(n=F[R[r]],n.value=D(n.value,w[r]))}function a(){var r,n=F[0];for(n.value=H(),r=0;E>r;++r)U[r]&X||(n.value=D(n.value,w[r]))}function c(){return V&&(T(),V=!1),F}function l(r){var n=j(c(),0,F.length,r);return B.sort(n,0,n.length)}function v(r,n,t){return D=r,G=n,H=t,V=!0,C}function m(){return v(d,p,h)}function A(r){return v(g(r),y(r),h)}function x(r){function n(n){return r(n.value)}return j=f(n),B=u(n),C}function O(){return x(n)}function M(){return P}function z(){var r=N.indexOf(Q);return r>=0&&N.splice(r,1),r=$.indexOf(t),r>=0&&$.splice(r,1),C}var C={top:l,all:c,reduce:v,reduceCount:m,reduceSum:A,order:x,orderNatural:O,size:M,remove:z};_.push(C);var F,R,j,B,D,G,H,I=8,J=k(I),P=0,Q=s,T=s,V=!0;return arguments.length<1&&(r=n),N.push(Q),$.push(t),t(K,L,0,E),m().orderNatural()}function I(){var r=H(s),n=r.all;return delete r.all,delete r.top,delete r.order,delete r.orderNatural,delete r.size,r.value=function(){return n()[0].value},r}function J(){_.forEach(function(r){r.remove()});var r=C.indexOf(e);for(r>=0&&C.splice(r,1),r=C.indexOf(o),r>=0&&C.splice(r,1),r=0;E>r;++r)U[r]&=X;return O&=X,V}var K,L,P,Q,T,V={filter:m,filterExact:z,filterRange:F,filterFunction:j,filterAll:R,top:D,bottom:G,group:H,groupAll:I,remove:J},W=~O&-~O,X=~W,Y=i(function(r){return P[r]}),Z=v,$=[],_=[],rn=0,nn=0;return C.unshift(e),C.push(o),O|=W,(M>=32?!W:O&(1<<M)-1)&&(U=q(U,M<<=1)),e(w,0,E),o(w,0,E),V}function o(){function r(r,n){var t;if(!m)for(t=n;E>t;++t)U[t]||(a=c(a,w[t]))}function n(r,n,t){var e,u,f;if(!m){for(e=0,f=n.length;f>e;++e)U[u=n[e]]||(a=c(a,w[u]));for(e=0,f=t.length;f>e;++e)U[u=t[e]]===r&&(a=l(a,w[u]))}}function t(){var r;for(a=v(),r=0;E>r;++r)U[r]||(a=c(a,w[r]))}function e(r,n,t){return c=r,l=n,v=t,m=!0,s}function u(){return e(d,p,h)}function f(r){return e(g(r),y(r),h)}function o(){return m&&(t(),m=!1),a}function i(){var t=N.indexOf(n);return t>=0&&N.splice(t),t=C.indexOf(r),t>=0&&C.splice(t),s}var a,c,l,v,s={reduce:e,reduceCount:u,reduceSum:f,value:o,remove:i},m=!0;return N.push(n),C.push(r),r(w,0,E),u()}function a(){return E}var m={add:r,dimension:e,groupAll:o,size:a},w=[],E=0,O=0,M=8,U=z(0),N=[],C=[];return arguments.length?r(arguments[0]):m}function b(r,n){return(257>n?z:65537>n?N:C)(r)}function A(r){for(var n=b(r,r),t=-1;++t<r;)n[t]=t;return n}function k(r){return 8===r?256:16===r?65536:4294967296}m.version="1.2.0",m.permute=t;var x=m.bisect=e(n);x.by=e;var w=m.heap=u(n);w.by=u;var E=m.heapselect=f(n);E.by=f;var O=m.insertionsort=o(n);O.by=o;var M=m.quicksort=i(n);M.by=i;var U=32,z=a,N=a,C=a,S=n,q=n;"undefined"!=typeof Uint8Array&&(z=function(r){return new Uint8Array(r)},N=function(r){return new Uint16Array(r)},C=function(r){return new Uint32Array(r)},S=function(r,n){var t=new r.constructor(n);return t.set(r),t},q=function(r,n){var t;switch(n){case 16:t=N(r.length);break;case 32:t=C(r.length);break;default:throw Error("invalid array width!")}return t.set(r),t}),r.crossfilter=m})(this);
@@ -12,9 +12,9 @@ Gem::Specification.new do |gem|
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
14
  gem.name = "crossfilter_rails"
15
- gem.require_paths = ["lib", "vendor"]
15
+ gem.require_paths = ["lib", "app"]
16
16
  gem.version = CrossfilterRails::VERSION
17
17
  gem.add_dependency "railties", ">= 3.1.0"
18
18
  gem.add_development_dependency "bundler", ">= 1.0.0"
19
- gem.add_development_dependency "rails", "~> 3.1"
19
+ gem.add_development_dependency "rails", ">= 3.1"
20
20
  end
@@ -1,3 +1,3 @@
1
1
  module CrossfilterRails
2
- VERSION = "1.1.3"
2
+ VERSION = "1.2.1.pre1"
3
3
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crossfilter_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
5
- prerelease:
4
+ version: 1.2.1.pre1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Michael Bostock
@@ -10,57 +9,51 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-03-05 00:00:00.000000000 Z
12
+ date: 2013-08-26 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: railties
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - '>='
21
19
  - !ruby/object:Gem::Version
22
20
  version: 3.1.0
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
- - - ! '>='
25
+ - - '>='
29
26
  - !ruby/object:Gem::Version
30
27
  version: 3.1.0
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: bundler
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - '>='
37
33
  - !ruby/object:Gem::Version
38
34
  version: 1.0.0
39
35
  type: :development
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
- - - ! '>='
39
+ - - '>='
45
40
  - !ruby/object:Gem::Version
46
41
  version: 1.0.0
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: rails
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
- - - ~>
46
+ - - '>='
53
47
  - !ruby/object:Gem::Version
54
48
  version: '3.1'
55
49
  type: :development
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
- - - ~>
53
+ - - '>='
61
54
  - !ruby/object:Gem::Version
62
55
  version: '3.1'
63
- description: ! ' Rails gem for easily adding the crossfilter javascript library, which
56
+ description: ' Rails gem for easily adding the crossfilter javascript library, which
64
57
  is great for exploring multivariate datasets '
65
58
  email:
66
59
  - han@logicallsat.com
@@ -69,42 +62,39 @@ extensions: []
69
62
  extra_rdoc_files: []
70
63
  files:
71
64
  - .gitignore
65
+ - CROSSFILTER_LICENSE
72
66
  - Gemfile
73
67
  - LICENSE
74
68
  - README.md
75
69
  - Rakefile
70
+ - app/assets/javascripts/crossfilter.js
71
+ - app/assets/javascripts/crossfilter.min.js
76
72
  - crossfilter_rails.gemspec
77
73
  - lib/crossfilter_rails.rb
78
74
  - lib/crossfilter_rails/engine.rb
79
75
  - lib/crossfilter_rails/version.rb
80
- - vendor/assets/.DS_Store
81
- - vendor/assets/javascripts/.DS_Store
82
- - vendor/assets/javascripts/LICENSE
83
- - vendor/assets/javascripts/crossfilter.js
84
- - vendor/assets/javascripts/crossfilter.min.js
85
76
  homepage: ''
86
77
  licenses: []
78
+ metadata: {}
87
79
  post_install_message:
88
80
  rdoc_options: []
89
81
  require_paths:
90
82
  - lib
91
- - vendor
83
+ - app
92
84
  required_ruby_version: !ruby/object:Gem::Requirement
93
- none: false
94
85
  requirements:
95
- - - ! '>='
86
+ - - '>='
96
87
  - !ruby/object:Gem::Version
97
88
  version: '0'
98
89
  required_rubygems_version: !ruby/object:Gem::Requirement
99
- none: false
100
90
  requirements:
101
- - - ! '>='
91
+ - - '>'
102
92
  - !ruby/object:Gem::Version
103
- version: '0'
93
+ version: 1.3.1
104
94
  requirements: []
105
95
  rubyforge_project:
106
- rubygems_version: 1.8.24
96
+ rubygems_version: 2.0.5
107
97
  signing_key:
108
- specification_version: 3
98
+ specification_version: 4
109
99
  summary: Crossfilter javascript library for use with the asset pipeline in Rails 3.1+
110
100
  test_files: []
Binary file
Binary file
@@ -1 +0,0 @@
1
- (function(r){function n(r){return r}function t(r,n){for(var t=0,u=n.length,e=Array(u);u>t;++t)e[t]=r[n[t]];return e}function u(r){function n(n,t,u,e){for(;e>u;){var f=u+e>>>1,o=r(n[f]);o>=t||!(o>=o)?e=f:u=f+1}return u}function t(n,t,u,e){for(;e>u;){var f=u+e>>>1,o=r(n[f]);o>t||!(o>=o)?e=f:u=f+1}return u}return t.right=t,t.left=n,t}function e(r){function n(r,n,t){for(var e=t-n,f=(e>>>1)+1;--f>0;)u(r,f,e,n);return r}function t(r,n,t){for(var e,f=t-n;--f>0;)e=r[n],r[n]=r[n+f],r[n+f]=e,u(r,1,f,n);return r}function u(n,t,u,e){for(var f,o=n[--e+t],i=r(o);(f=t<<1)<=u&&(u>f&&r(n[e+f])>r(n[e+f+1])&&f++,!(i<=r(n[e+f])));)n[e+t]=n[e+f],t=f;n[e+t]=o}return n.sort=t,n}function f(r){function n(n,u,e,f){var o,i,a,c,l=Array(f=Math.min(e-u,f));for(i=0;f>i;++i)l[i]=n[u++];if(t(l,0,f),e>u){o=r(l[0]);do(a=r(c=n[u])>o)&&(l[0]=c,o=r(t(l,0,f)[0]));while(++u<e)}return l}var t=e(r);return n}function o(r){function n(n,t,u){for(var e=t+1;u>e;++e){for(var f,o=e,i=n[e],a=r(i);o>t&&((f=r(n[o-1]))>a||!(f>=f));--o)n[o]=n[o-1];n[o]=i}return n}return n}function i(r){function n(r,n,e){return(z>e-n?u:t)(r,n,e)}function t(t,u,e){for(var f,o;e>u&&!((f=r(t[e-1]))<=f);)e--;for(var i=e;--i>=u;)f=r(o=t[i]),f>=f||(t[i]=t[--e],t[e]=o);var a,c=0|(e-u)/6,l=u+c,v=e-1-c,h=u+e-1>>1,s=h-c,d=h+c,g=t[l],p=r(g),y=t[s],b=r(y),m=t[h],A=r(m),k=t[d],w=r(k),E=t[v],M=r(E);p>b&&(a=g,g=y,y=a,a=p,p=b,b=a),w>M&&(a=k,k=E,E=a,a=w,w=M,M=a),p>A&&(a=g,g=m,m=a,a=p,p=A,A=a),b>A&&(a=y,y=m,m=a,a=b,b=A,A=a),p>w&&(a=g,g=k,k=a,a=p,p=w,w=a),A>w&&(a=m,m=k,k=a,a=A,A=w,w=a),b>M&&(a=y,y=E,E=a,a=b,b=M,M=a),b>A&&(a=y,y=m,m=a,a=b,b=A,A=a),w>M&&(a=k,k=E,E=a,a=w,w=M,M=a);var x=y,U=b,z=k,N=w;t[l]=g,t[s]=t[u],t[h]=m,t[d]=t[e-1],t[v]=E;var C=u+1,S=e-2,q=N>=U&&U>=N;if(q)for(var O=C;S>=O;++O){var R=t[O],j=r(R);if(U>j)O!==C&&(t[O]=t[C],t[C]=R),++C;else if(j>U)for(;;){var B=r(t[S]);{if(!(B>U)){if(U>B){t[O]=t[C],t[C++]=t[S],t[S--]=R;break}t[O]=t[S],t[S--]=R;break}S--}}}else for(var O=C;S>=O;O++){var R=t[O],j=r(R);if(U>j)O!==C&&(t[O]=t[C],t[C]=R),++C;else if(j>N)for(;;){var B=r(t[S]);{if(!(B>N)){U>B?(t[O]=t[C],t[C++]=t[S],t[S--]=R):(t[O]=t[S],t[S--]=R);break}if(S--,O>S)break}}}if(t[u]=t[C-1],t[C-1]=x,t[e-1]=t[S+1],t[S+1]=z,n(t,u,C-1),n(t,S+2,e),q)return t;if(l>C&&S>v){for(var D,B;(D=r(t[C]))<=U&&D>=U;)++C;for(;(B=r(t[S]))<=N&&B>=N;)--S;for(var O=C;S>=O;O++){var R=t[O],j=r(R);if(U>=j&&j>=U)O!==C&&(t[O]=t[C],t[C]=R),C++;else if(N>=j&&j>=N)for(;;){var B=r(t[S]);{if(!(N>=B&&B>=N)){U>B?(t[O]=t[C],t[C++]=t[S],t[S--]=R):(t[O]=t[S],t[S--]=R);break}if(S--,O>S)break}}}}return n(t,C,S+1)}var u=o(r);return n}function a(r){return Array(r)}function c(r,n){return function(t){var u=t.length;return[r.left(t,n,0,u),r.right(t,n,0,u)]}}function l(r,n){var t=n[0],u=n[1];return function(n){var e=n.length;return[r.left(n,t,0,e),r.left(n,u,0,e)]}}function v(r){return[0,r.length]}function h(){return null}function s(){return 0}function d(r){return r+1}function g(r){return r-1}function p(r){return function(n,t){return n+ +r(t)}}function y(r){return function(n,t){return n-r(t)}}function b(){function r(r){var n=M,t=r.length;return t&&(E=E.concat(r),z=q(z,M+=t),S.forEach(function(u){u(r,n,t)})),b}function u(r){function u(n,u,e){J=n.map(r),K=T(A(e),0,e),J=t(J,K);var f,o=V(J),i=o[0],a=o[1];for(f=0;i>f;++f)z[K[f]+u]|=P;for(f=a;e>f;++f)z[K[f]+u]|=P;if(!u)return H=J,I=K,X=i,Y=a,void 0;var c=H,l=I,v=0,h=0;for(H=Array(M),I=m(M,M),f=0;u>v&&e>h;++f)c[v]<J[h]?(H[f]=c[v],I[f]=l[v++]):(H[f]=J[h],I[f]=K[h++]+u);for(;u>v;++v,++f)H[f]=c[v],I[f]=l[v];for(;e>h;++h,++f)H[f]=J[h],I[f]=K[h]+u;o=V(H),X=o[0],Y=o[1]}function o(r,n,t){W.forEach(function(r){r(J,K,n,t)}),J=K=null}function a(r){var n,t,u,e=r[0],f=r[1],o=[],i=[];if(X>e)for(n=e,t=Math.min(X,f);t>n;++n)z[u=I[n]]^=P,o.push(u);else if(e>X)for(n=X,t=Math.min(e,Y);t>n;++n)z[u=I[n]]^=P,i.push(u);if(f>Y)for(n=Math.max(e,Y),t=f;t>n;++n)z[u=I[n]]^=P,o.push(u);else if(Y>f)for(n=Math.max(X,f),t=Y;t>n;++n)z[u=I[n]]^=P,i.push(u);return X=e,Y=f,C.forEach(function(r){r(P,o,i)}),L}function b(r){return null==r?j():Array.isArray(r)?R(r):N(r)}function N(r){return a((V=c(w,r))(H))}function R(r){return a((V=l(w,r))(H))}function j(){return a((V=v)(H))}function B(r){for(var n,t=[],u=Y;--u>=X&&r>0;)z[n=I[u]]||(t.push(E[n]),--r);return t}function D(r){for(var n,t=[],u=X;Y>u&&r>0;)z[n=I[u]]||(t.push(E[n]),--r),u++;return t}function F(r){function t(n,t,e,f){function c(){++L===K&&(b=O(b,J<<=1),S=O(S,J),K=k(J))}var l,v,s,d,g,p,y=N,b=m(L,K),A=B,w=F,x=L,U=0,R=0;for(X&&(A=w=h),N=Array(L),L=0,S=x>1?q(S,M):m(M,K),x&&(s=(v=y[0]).key),d=r(n[R]);f>R;){for(v&&d>=s?(g=v,p=s,b[U]=L,(v=y[++U])&&(s=v.key)):(g={key:d,value:w()},p=d),N[L]=g;!(!(p>=d)&&(d>=d||p>=p)||(S[l=t[R]+e]=L,z[l]&Q||(g.value=A(g.value,E[l])),++R>=f));)d=r(n[R]);c()}for(;x>U;)N[b[U]=L]=y[U++],c();if(L>U)for(U=0;e>U;++U)S[U]=b[S[U]];l=C.indexOf(T),L>1?(T=u,V=i):(1===L?(T=o,V=a):(T=h,V=h),S=null),C[l]=T}function u(r,n,t){if(r!==P&&!X){var u,e,f,o;for(u=0,f=n.length;f>u;++u)z[e=n[u]]&Q||(o=N[S[e]],o.value=B(o.value,E[e]));for(u=0,f=t.length;f>u;++u)(z[e=t[u]]&Q)===r&&(o=N[S[e]],o.value=D(o.value,E[e]))}}function o(r,n,t){if(r!==P&&!X){var u,e,f,o=N[0];for(u=0,f=n.length;f>u;++u)z[e=n[u]]&Q||(o.value=B(o.value,E[e]));for(u=0,f=t.length;f>u;++u)(z[e=t[u]]&Q)===r&&(o.value=D(o.value,E[e]))}}function i(){var r,n;for(r=0;L>r;++r)N[r].value=F();for(r=0;M>r;++r)z[r]&Q||(n=N[S[r]],n.value=B(n.value,E[r]))}function a(){var r,n=N[0];for(n.value=F(),r=0;M>r;++r)z[r]&Q||(n.value=B(n.value,E[r]))}function c(){return X&&(V(),X=!1),N}function l(r){var n=R(c(),0,N.length,r);return j.sort(n,0,n.length)}function v(r,n,t){return B=r,D=n,F=t,X=!0,G}function b(){return v(d,g,s)}function A(r){return v(p(r),y(r),s)}function w(r){function n(n){return r(n.value)}return R=f(n),j=e(n),G}function x(){return w(n)}function U(){return L}var N,S,R,j,B,D,F,G={top:l,all:c,reduce:v,reduceCount:b,reduceSum:A,order:w,orderNatural:x,size:U},J=8,K=k(J),L=0,T=h,V=h,X=!0;return arguments.length<1&&(r=n),C.push(T),W.push(t),t(H,I,0,M),b().orderNatural()}function G(){var r=F(h),n=r.all;return delete r.all,delete r.top,delete r.order,delete r.orderNatural,delete r.size,r.value=function(){return n()[0].value},r}var H,I,J,K,L={filter:b,filterExact:N,filterRange:R,filterAll:j,top:B,bottom:D,group:F,groupAll:G},P=1<<x++,Q=~P,T=i(function(r){return J[r]}),V=v,W=[],X=0,Y=0;return S.unshift(u),S.push(o),x>U&&(z=O(z,U<<=1)),u(E,0,M),o(E,0,M),L}function o(){function r(r,n){var t;if(!h)for(t=n;M>t;++t)z[t]||(i=a(i,E[t]))}function n(r,n,t){var u,e,f;if(!h){for(u=0,f=n.length;f>u;++u)z[e=n[u]]||(i=a(i,E[e]));for(u=0,f=t.length;f>u;++u)z[e=t[u]]===r&&(i=c(i,E[e]))}}function t(){var r;for(i=l(),r=0;M>r;++r)z[r]||(i=a(i,E[r]))}function u(r,n,t){return a=r,c=n,l=t,h=!0,v}function e(){return u(d,g,s)}function f(r){return u(p(r),y(r),s)}function o(){return h&&(t(),h=!1),i}var i,a,c,l,v={reduce:u,reduceCount:e,reduceSum:f,value:o},h=!0;return C.push(n),S.push(r),r(E,0,M),e()}function a(){return M}var b={add:r,dimension:u,groupAll:o,size:a},E=[],M=0,x=0,U=8,z=N(0),C=[],S=[];return arguments.length?r(arguments[0]):b}function m(r,n){return(257>n?N:65537>n?C:S)(r)}function A(r){for(var n=m(r,r),t=-1;++t<r;)n[t]=t;return n}function k(r){return 8===r?256:16===r?65536:4294967296}b.version="1.1.3",b.permute=t;var w=b.bisect=u(n);w.by=u;var E=b.heap=e(n);E.by=e;var M=b.heapselect=f(n);M.by=f;var x=b.insertionsort=o(n);x.by=o;var U=b.quicksort=i(n);U.by=i;var z=32,N=a,C=a,S=a,q=n,O=n;"undefined"!=typeof Uint8Array&&(N=function(r){return new Uint8Array(r)},C=function(r){return new Uint16Array(r)},S=function(r){return new Uint32Array(r)},q=function(r,n){var t=new r.constructor(n);return t.set(r),t},O=function(r,n){var t;switch(n){case 16:t=C(r.length);break;case 32:t=S(r.length);break;default:throw Error("invalid array width!")}return t.set(r),t}),r.crossfilter=b})(this);