mdarray-sol 0.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +35 -0
- data/LICENSE.txt~ +73 -0
- data/README.md +140 -0
- data/README.md~ +290 -0
- data/Rakefile +80 -0
- data/config.rb +223 -0
- data/doc/Nashorn.html +1406 -0
- data/doc/Sol.html +692 -0
- data/doc/Sol/BarChart.html +181 -0
- data/doc/Sol/BaseChart.html +799 -0
- data/doc/Sol/Bootstrap.html +1134 -0
- data/doc/Sol/Bridge.html +448 -0
- data/doc/Sol/Chart.html +1162 -0
- data/doc/Sol/CoordinateChart.html +673 -0
- data/doc/Sol/DCFX.html +807 -0
- data/doc/Sol/Dashboard.html +1967 -0
- data/doc/Sol/ExecMessages.html +332 -0
- data/doc/Sol/GuiCommunication.html +230 -0
- data/doc/Sol/Interval.html +1213 -0
- data/doc/Sol/JS.html +448 -0
- data/doc/Sol/LineChart.html +344 -0
- data/doc/Sol/LinearScale.html +334 -0
- data/doc/Sol/Margins.html +219 -0
- data/doc/Sol/OrdinalScale.html +263 -0
- data/doc/Sol/ReadBuffer.html +302 -0
- data/doc/Sol/Scale.html +462 -0
- data/doc/Sol/Stack.html +199 -0
- data/doc/Sol/TimeScale.html +396 -0
- data/doc/_index.html +362 -0
- data/doc/class_list.html +58 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +339 -0
- data/doc/file.README.html +95 -0
- data/doc/file_list.html +60 -0
- data/doc/frames.html +26 -0
- data/doc/index.html +95 -0
- data/doc/js/app.js +219 -0
- data/doc/js/full_list.js +181 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +849 -0
- data/doc/top-level-namespace.html +135 -0
- data/examples/bar_chart/bar_chart.rb +268 -0
- data/examples/bar_plot.rb +96 -0
- data/examples/charts/area.rb +25 -0
- data/examples/charts/area_script.rb +69 -0
- data/examples/charts/env.rb +8 -0
- data/examples/charts/monthly-move.csv +6725 -0
- data/examples/charts/morley.csv +101 -0
- data/examples/charts/morley2.csv +81 -0
- data/examples/charts/morley3.csv +121 -0
- data/examples/d3_tutorial.rb +98 -0
- data/examples/sc_plot.rb +57 -0
- data/examples/scatterplot/axes.rb +111 -0
- data/examples/scatterplot/scatterplot.rb +221 -0
- data/examples/us_states/map.rb +90 -0
- data/examples/us_states/us-ag-productivity2004.csv +49 -0
- data/examples/us_states/us-cities.csv +51 -0
- data/examples/util/linear_scale.rb +83 -0
- data/examples/util/ordinal_scale.rb +72 -0
- data/init.rb +39 -0
- data/lib/jx/array_handler.js +70 -0
- data/lib/jx/callback.rb +255 -0
- data/lib/jx/hash_handler.js +87 -0
- data/lib/jx/irbobject.rb +121 -0
- data/lib/jx/js.rb +442 -0
- data/lib/jx/js_array.rb +31 -0
- data/lib/jx/js_hash.rb +76 -0
- data/lib/jx/js_init.rb +62 -0
- data/lib/jx/jsarray.rb +66 -0
- data/lib/jx/jsfunction.rb +73 -0
- data/lib/jx/jsobject.rb +188 -0
- data/lib/jx/jsstyle_sheet.rb +231 -0
- data/lib/jx/jsundefined.rb +46 -0
- data/lib/jx/proxy_array.rb +62 -0
- data/lib/jx/rbobject.rb +80 -0
- data/lib/jx/ruby_proxy.js +176 -0
- data/lib/jx/ruby_rich.js +70 -0
- data/lib/jx/sol.rb +109 -0
- data/lib/mdarray-sol.rb +34 -0
- data/lib/mdarray/jsmdarray.rb +39 -0
- data/lib/ruby_rich/bootstrap.rb +230 -0
- data/lib/ruby_rich/config.html +22 -0
- data/lib/ruby_rich/dashboard.rb +299 -0
- data/lib/ruby_rich/ruby_rich.rb +120 -0
- data/lib/sol/bar_chart.rb +35 -0
- data/lib/sol/base_chart.rb +148 -0
- data/lib/sol/chart.rb +138 -0
- data/lib/sol/coordinate_chart.rb +128 -0
- data/lib/sol/interval.rb +156 -0
- data/lib/sol/line_chart.rb +58 -0
- data/lib/sol/margins.rb +52 -0
- data/lib/sol/scale.rb +212 -0
- data/lib/sol/stack.rb +44 -0
- data/node_modules/bootstrap/Gruntfile.js +533 -0
- data/node_modules/bootstrap/dist/js/bootstrap.js +2363 -0
- data/node_modules/bootstrap/dist/js/bootstrap.min.js +7 -0
- data/node_modules/bootstrap/dist/js/npm.js +13 -0
- data/node_modules/bootstrap/grunt/bs-commonjs-generator.js +30 -0
- data/node_modules/bootstrap/grunt/bs-glyphicons-data-generator.js +42 -0
- data/node_modules/bootstrap/grunt/bs-lessdoc-parser.js +237 -0
- data/node_modules/bootstrap/grunt/bs-raw-files-generator.js +44 -0
- data/node_modules/bootstrap/js/affix.js +162 -0
- data/node_modules/bootstrap/js/alert.js +94 -0
- data/node_modules/bootstrap/js/button.js +120 -0
- data/node_modules/bootstrap/js/carousel.js +237 -0
- data/node_modules/bootstrap/js/collapse.js +211 -0
- data/node_modules/bootstrap/js/dropdown.js +165 -0
- data/node_modules/bootstrap/js/modal.js +337 -0
- data/node_modules/bootstrap/js/popover.js +108 -0
- data/node_modules/bootstrap/js/scrollspy.js +172 -0
- data/node_modules/bootstrap/js/tab.js +155 -0
- data/node_modules/bootstrap/js/tooltip.js +514 -0
- data/node_modules/bootstrap/js/transition.js +59 -0
- data/node_modules/chai/chai.js +6142 -0
- data/node_modules/chai/index.js +1 -0
- data/node_modules/chai/karma.conf.js +28 -0
- data/node_modules/chai/karma.sauce.js +41 -0
- data/node_modules/chai/lib/chai.js +93 -0
- data/node_modules/chai/lib/chai/assertion.js +131 -0
- data/node_modules/chai/lib/chai/config.js +55 -0
- data/node_modules/chai/lib/chai/core/assertions.js +1860 -0
- data/node_modules/chai/lib/chai/interface/assert.js +1645 -0
- data/node_modules/chai/lib/chai/interface/expect.js +34 -0
- data/node_modules/chai/lib/chai/interface/should.js +201 -0
- data/node_modules/chai/lib/chai/utils/addChainableMethod.js +112 -0
- data/node_modules/chai/lib/chai/utils/addMethod.js +44 -0
- data/node_modules/chai/lib/chai/utils/addProperty.js +48 -0
- data/node_modules/chai/lib/chai/utils/expectTypes.js +42 -0
- data/node_modules/chai/lib/chai/utils/flag.js +33 -0
- data/node_modules/chai/lib/chai/utils/getActual.js +20 -0
- data/node_modules/chai/lib/chai/utils/getEnumerableProperties.js +26 -0
- data/node_modules/chai/lib/chai/utils/getMessage.js +51 -0
- data/node_modules/chai/lib/chai/utils/getName.js +22 -0
- data/node_modules/chai/lib/chai/utils/getPathInfo.js +111 -0
- data/node_modules/chai/lib/chai/utils/getPathValue.js +43 -0
- data/node_modules/chai/lib/chai/utils/getProperties.js +36 -0
- data/node_modules/chai/lib/chai/utils/hasProperty.js +64 -0
- data/node_modules/chai/lib/chai/utils/index.js +130 -0
- data/node_modules/chai/lib/chai/utils/inspect.js +335 -0
- data/node_modules/chai/lib/chai/utils/objDisplay.js +50 -0
- data/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js +54 -0
- data/node_modules/chai/lib/chai/utils/overwriteMethod.js +52 -0
- data/node_modules/chai/lib/chai/utils/overwriteProperty.js +55 -0
- data/node_modules/chai/lib/chai/utils/test.js +28 -0
- data/node_modules/chai/lib/chai/utils/transferFlags.js +45 -0
- data/node_modules/chai/node_modules/assertion-error/index.js +116 -0
- data/node_modules/chai/node_modules/deep-eql/index.js +1 -0
- data/node_modules/chai/node_modules/deep-eql/karma.conf.js +20 -0
- data/node_modules/chai/node_modules/deep-eql/lib/eql.js +257 -0
- data/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/index.js +1 -0
- data/node_modules/chai/node_modules/deep-eql/node_modules/type-detect/lib/type.js +142 -0
- data/node_modules/chai/node_modules/type-detect/index.js +1 -0
- data/node_modules/chai/node_modules/type-detect/lib/type.js +134 -0
- data/node_modules/chai/sauce.browsers.js +128 -0
- data/node_modules/dc/Gruntfile.js +437 -0
- data/node_modules/dc/dc.js +10477 -0
- data/node_modules/dc/dc.min.js +23 -0
- data/node_modules/dc/docs/coverage.js +203 -0
- data/node_modules/dc/grunt/format-file-list.js +33 -0
- data/node_modules/dc/index.js +5 -0
- data/node_modules/dc/node_modules/crossfilter2/crossfilter.js +1401 -0
- data/node_modules/dc/node_modules/crossfilter2/crossfilter.min.js +1 -0
- data/node_modules/dc/node_modules/crossfilter2/index.js +1 -0
- data/node_modules/dc/node_modules/crossfilter2/src/array.js +46 -0
- data/node_modules/dc/node_modules/crossfilter2/src/bisect.js +44 -0
- data/node_modules/dc/node_modules/crossfilter2/src/crossfilter.js +872 -0
- data/node_modules/dc/node_modules/crossfilter2/src/filter.js +19 -0
- data/node_modules/dc/node_modules/crossfilter2/src/heap.js +44 -0
- data/node_modules/dc/node_modules/crossfilter2/src/heapselect.js +36 -0
- data/node_modules/dc/node_modules/crossfilter2/src/identity.js +3 -0
- data/node_modules/dc/node_modules/crossfilter2/src/insertionsort.js +18 -0
- data/node_modules/dc/node_modules/crossfilter2/src/null.js +3 -0
- data/node_modules/dc/node_modules/crossfilter2/src/permute.js +8 -0
- data/node_modules/dc/node_modules/crossfilter2/src/quicksort.js +283 -0
- data/node_modules/dc/node_modules/crossfilter2/src/reduce.js +19 -0
- data/node_modules/dc/node_modules/crossfilter2/src/zero.js +3 -0
- data/node_modules/dc/node_modules/d3/d3.js +9554 -0
- data/node_modules/dc/node_modules/d3/d3.min.js +5 -0
- data/node_modules/dc/node_modules/d3/package.js +13 -0
- data/node_modules/dc/node_modules/d3/src/arrays/ascending.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/bisect.js +36 -0
- data/node_modules/dc/node_modules/d3/src/arrays/descending.js +3 -0
- data/node_modules/dc/node_modules/d3/src/arrays/deviation.js +6 -0
- data/node_modules/dc/node_modules/d3/src/arrays/entries.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/extent.js +21 -0
- data/node_modules/dc/node_modules/d3/src/arrays/index.js +25 -0
- data/node_modules/dc/node_modules/d3/src/arrays/keys.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/map.js +84 -0
- data/node_modules/dc/node_modules/d3/src/arrays/max.js +14 -0
- data/node_modules/dc/node_modules/d3/src/arrays/mean.js +15 -0
- data/node_modules/dc/node_modules/d3/src/arrays/median.js +16 -0
- data/node_modules/dc/node_modules/d3/src/arrays/merge.js +21 -0
- data/node_modules/dc/node_modules/d3/src/arrays/min.js +14 -0
- data/node_modules/dc/node_modules/d3/src/arrays/nest.js +97 -0
- data/node_modules/dc/node_modules/d3/src/arrays/pairs.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/permute.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/quantile.js +8 -0
- data/node_modules/dc/node_modules/d3/src/arrays/range.js +26 -0
- data/node_modules/dc/node_modules/d3/src/arrays/set.js +27 -0
- data/node_modules/dc/node_modules/d3/src/arrays/shuffle.js +9 -0
- data/node_modules/dc/node_modules/d3/src/arrays/sum.js +14 -0
- data/node_modules/dc/node_modules/d3/src/arrays/transpose.js +15 -0
- data/node_modules/dc/node_modules/d3/src/arrays/values.js +5 -0
- data/node_modules/dc/node_modules/d3/src/arrays/variance.js +29 -0
- data/node_modules/dc/node_modules/d3/src/arrays/zip.js +5 -0
- data/node_modules/dc/node_modules/d3/src/behavior/behavior.js +1 -0
- data/node_modules/dc/node_modules/d3/src/behavior/drag.js +88 -0
- data/node_modules/dc/node_modules/d3/src/behavior/index.js +3 -0
- data/node_modules/dc/node_modules/d3/src/behavior/zoom.js +348 -0
- data/node_modules/dc/node_modules/d3/src/color/color.js +7 -0
- data/node_modules/dc/node_modules/d3/src/color/hcl.js +34 -0
- data/node_modules/dc/node_modules/d3/src/color/hsl.js +56 -0
- data/node_modules/dc/node_modules/d3/src/color/index.js +6 -0
- data/node_modules/dc/node_modules/d3/src/color/lab.js +60 -0
- data/node_modules/dc/node_modules/d3/src/color/rgb.js +301 -0
- data/node_modules/dc/node_modules/d3/src/color/xyz.js +7 -0
- data/node_modules/dc/node_modules/d3/src/compat/array.js +15 -0
- data/node_modules/dc/node_modules/d3/src/compat/date.js +3 -0
- data/node_modules/dc/node_modules/d3/src/compat/index.js +3 -0
- data/node_modules/dc/node_modules/d3/src/compat/style.js +23 -0
- data/node_modules/dc/node_modules/d3/src/core/array.js +2 -0
- data/node_modules/dc/node_modules/d3/src/core/class.js +8 -0
- data/node_modules/dc/node_modules/d3/src/core/document.js +15 -0
- data/node_modules/dc/node_modules/d3/src/core/functor.js +5 -0
- data/node_modules/dc/node_modules/d3/src/core/identity.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/index.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/noop.js +1 -0
- data/node_modules/dc/node_modules/d3/src/core/ns.js +18 -0
- data/node_modules/dc/node_modules/d3/src/core/rebind.js +16 -0
- data/node_modules/dc/node_modules/d3/src/core/source.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/subclass.js +11 -0
- data/node_modules/dc/node_modules/d3/src/core/target.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/true.js +3 -0
- data/node_modules/dc/node_modules/d3/src/core/vendor.js +10 -0
- data/node_modules/dc/node_modules/d3/src/core/zero.js +3 -0
- data/node_modules/dc/node_modules/d3/src/d3.js +23 -0
- data/node_modules/dc/node_modules/d3/src/dsv/csv.js +3 -0
- data/node_modules/dc/node_modules/d3/src/dsv/dsv.js +136 -0
- data/node_modules/dc/node_modules/d3/src/dsv/index.js +3 -0
- data/node_modules/dc/node_modules/d3/src/dsv/tsv.js +3 -0
- data/node_modules/dc/node_modules/d3/src/end.js +4 -0
- data/node_modules/dc/node_modules/d3/src/event/dispatch.js +69 -0
- data/node_modules/dc/node_modules/d3/src/event/drag.js +36 -0
- data/node_modules/dc/node_modules/d3/src/event/event.js +50 -0
- data/node_modules/dc/node_modules/d3/src/event/index.js +6 -0
- data/node_modules/dc/node_modules/d3/src/event/mouse.js +39 -0
- data/node_modules/dc/node_modules/d3/src/event/timer.js +82 -0
- data/node_modules/dc/node_modules/d3/src/event/touch.js +11 -0
- data/node_modules/dc/node_modules/d3/src/event/touches.js +12 -0
- data/node_modules/dc/node_modules/d3/src/format/collapse.js +3 -0
- data/node_modules/dc/node_modules/d3/src/format/format.js +3 -0
- data/node_modules/dc/node_modules/d3/src/format/formatPrefix.js +24 -0
- data/node_modules/dc/node_modules/d3/src/format/index.js +4 -0
- data/node_modules/dc/node_modules/d3/src/format/precision.js +3 -0
- data/node_modules/dc/node_modules/d3/src/format/requote.js +5 -0
- data/node_modules/dc/node_modules/d3/src/format/round.js +5 -0
- data/node_modules/dc/node_modules/d3/src/geo/albers-usa.js +129 -0
- data/node_modules/dc/node_modules/d3/src/geo/albers.js +11 -0
- data/node_modules/dc/node_modules/d3/src/geo/area.js +69 -0
- data/node_modules/dc/node_modules/d3/src/geo/azimuthal-equal-area.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/azimuthal-equidistant.js +13 -0
- data/node_modules/dc/node_modules/d3/src/geo/azimuthal.js +25 -0
- data/node_modules/dc/node_modules/d3/src/geo/bounds.js +168 -0
- data/node_modules/dc/node_modules/d3/src/geo/cartesian.js +47 -0
- data/node_modules/dc/node_modules/d3/src/geo/centroid.js +149 -0
- data/node_modules/dc/node_modules/d3/src/geo/circle.js +81 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip-antimeridian.js +95 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip-circle.js +178 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip-extent.js +196 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip-polygon.js +104 -0
- data/node_modules/dc/node_modules/d3/src/geo/clip.js +149 -0
- data/node_modules/dc/node_modules/d3/src/geo/compose.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/conic-conformal.js +39 -0
- data/node_modules/dc/node_modules/d3/src/geo/conic-equal-area.js +33 -0
- data/node_modules/dc/node_modules/d3/src/geo/conic-equidistant.js +36 -0
- data/node_modules/dc/node_modules/d3/src/geo/conic.js +16 -0
- data/node_modules/dc/node_modules/d3/src/geo/distance.js +13 -0
- data/node_modules/dc/node_modules/d3/src/geo/equirectangular.js +10 -0
- data/node_modules/dc/node_modules/d3/src/geo/geo.js +1 -0
- data/node_modules/dc/node_modules/d3/src/geo/gnomonic.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/graticule.js +103 -0
- data/node_modules/dc/node_modules/d3/src/geo/greatArc.js +42 -0
- data/node_modules/dc/node_modules/d3/src/geo/index.js +33 -0
- data/node_modules/dc/node_modules/d3/src/geo/interpolate.js +38 -0
- data/node_modules/dc/node_modules/d3/src/geo/length.js +44 -0
- data/node_modules/dc/node_modules/d3/src/geo/mercator.js +48 -0
- data/node_modules/dc/node_modules/d3/src/geo/orthographic.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-area.js +41 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-bounds.js +21 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-buffer.js +59 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-centroid.js +78 -0
- data/node_modules/dc/node_modules/d3/src/geo/path-context.js +49 -0
- data/node_modules/dc/node_modules/d3/src/geo/path.js +87 -0
- data/node_modules/dc/node_modules/d3/src/geo/point-in-polygon.js +71 -0
- data/node_modules/dc/node_modules/d3/src/geo/projection.js +121 -0
- data/node_modules/dc/node_modules/d3/src/geo/resample.js +109 -0
- data/node_modules/dc/node_modules/d3/src/geo/rotation.js +79 -0
- data/node_modules/dc/node_modules/d3/src/geo/spherical.js +13 -0
- data/node_modules/dc/node_modules/d3/src/geo/stereographic.js +12 -0
- data/node_modules/dc/node_modules/d3/src/geo/stream.js +71 -0
- data/node_modules/dc/node_modules/d3/src/geo/transform.js +36 -0
- data/node_modules/dc/node_modules/d3/src/geo/transverse-mercator.js +31 -0
- data/node_modules/dc/node_modules/d3/src/geom/clip-line.js +66 -0
- data/node_modules/dc/node_modules/d3/src/geom/delaunay.js +6 -0
- data/node_modules/dc/node_modules/d3/src/geom/geom.js +1 -0
- data/node_modules/dc/node_modules/d3/src/geom/hull.js +91 -0
- data/node_modules/dc/node_modules/d3/src/geom/index.js +6 -0
- data/node_modules/dc/node_modules/d3/src/geom/point.js +7 -0
- data/node_modules/dc/node_modules/d3/src/geom/polygon.js +105 -0
- data/node_modules/dc/node_modules/d3/src/geom/quadtree.js +243 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi.js +110 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/beach.js +186 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/cell.js +64 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/circle.js +73 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/clip.js +80 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/edge.js +50 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/index.js +59 -0
- data/node_modules/dc/node_modules/d3/src/geom/voronoi/red-black.js +235 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/array.js +19 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/ease.js +111 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/hcl.js +20 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/hsl.js +20 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/index.js +14 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/interpolate.js +26 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/lab.js +17 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/number.js +6 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/object.js +25 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/rgb.js +20 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/round.js +6 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/string.js +54 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/transform.js +59 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/uninterpolate.js +9 -0
- data/node_modules/dc/node_modules/d3/src/interpolate/zoom.js +53 -0
- data/node_modules/dc/node_modules/d3/src/layout/bundle.js +59 -0
- data/node_modules/dc/node_modules/d3/src/layout/chord.js +157 -0
- data/node_modules/dc/node_modules/d3/src/layout/cluster.js +92 -0
- data/node_modules/dc/node_modules/d3/src/layout/force.js +372 -0
- data/node_modules/dc/node_modules/d3/src/layout/hierarchy.js +136 -0
- data/node_modules/dc/node_modules/d3/src/layout/histogram.js +110 -0
- data/node_modules/dc/node_modules/d3/src/layout/index.js +13 -0
- data/node_modules/dc/node_modules/d3/src/layout/layout.js +1 -0
- data/node_modules/dc/node_modules/d3/src/layout/pack.js +211 -0
- data/node_modules/dc/node_modules/d3/src/layout/partition.js +51 -0
- data/node_modules/dc/node_modules/d3/src/layout/pie.js +78 -0
- data/node_modules/dc/node_modules/d3/src/layout/stack.js +247 -0
- data/node_modules/dc/node_modules/d3/src/layout/tree.js +240 -0
- data/node_modules/dc/node_modules/d3/src/layout/treemap.js +229 -0
- data/node_modules/dc/node_modules/d3/src/locale/ca-ES.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/de-CH.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/de-DE.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/en-CA.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/en-GB.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/en-US.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/es-ES.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/fi-FI.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/fr-CA.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/fr-FR.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/he-IL.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/hu-HU.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/it-IT.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/ja-JP.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/ko-KR.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/locale.js +9 -0
- data/node_modules/dc/node_modules/d3/src/locale/mk-MK.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/nl-NL.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/number-format.js +155 -0
- data/node_modules/dc/node_modules/d3/src/locale/pl-PL.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/pt-BR.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/ru-RU.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/sv-SE.js +16 -0
- data/node_modules/dc/node_modules/d3/src/locale/time-format.js +370 -0
- data/node_modules/dc/node_modules/d3/src/locale/time-scale.js +0 -0
- data/node_modules/dc/node_modules/d3/src/locale/zh-CN.js +16 -0
- data/node_modules/dc/node_modules/d3/src/math/abs.js +1 -0
- data/node_modules/dc/node_modules/d3/src/math/adder.js +34 -0
- data/node_modules/dc/node_modules/d3/src/math/index.js +2 -0
- data/node_modules/dc/node_modules/d3/src/math/number.js +7 -0
- data/node_modules/dc/node_modules/d3/src/math/random.js +34 -0
- data/node_modules/dc/node_modules/d3/src/math/transform.js +64 -0
- data/node_modules/dc/node_modules/d3/src/math/trigonometry.js +44 -0
- data/node_modules/dc/node_modules/d3/src/scale/bilinear.js +7 -0
- data/node_modules/dc/node_modules/d3/src/scale/category.js +58 -0
- data/node_modules/dc/node_modules/d3/src/scale/identity.js +33 -0
- data/node_modules/dc/node_modules/d3/src/scale/index.js +11 -0
- data/node_modules/dc/node_modules/d3/src/scale/linear.js +160 -0
- data/node_modules/dc/node_modules/d3/src/scale/log.js +92 -0
- data/node_modules/dc/node_modules/d3/src/scale/nice.js +30 -0
- data/node_modules/dc/node_modules/d3/src/scale/ordinal.js +102 -0
- data/node_modules/dc/node_modules/d3/src/scale/polylinear.js +24 -0
- data/node_modules/dc/node_modules/d3/src/scale/pow.js +57 -0
- data/node_modules/dc/node_modules/d3/src/scale/quantile.js +55 -0
- data/node_modules/dc/node_modules/d3/src/scale/quantize.js +44 -0
- data/node_modules/dc/node_modules/d3/src/scale/scale.js +10 -0
- data/node_modules/dc/node_modules/d3/src/scale/sqrt.js +6 -0
- data/node_modules/dc/node_modules/d3/src/scale/threshold.js +36 -0
- data/node_modules/dc/node_modules/d3/src/selection/append.js +28 -0
- data/node_modules/dc/node_modules/d3/src/selection/attr.js +62 -0
- data/node_modules/dc/node_modules/d3/src/selection/call.js +8 -0
- data/node_modules/dc/node_modules/d3/src/selection/classed.js +76 -0
- data/node_modules/dc/node_modules/d3/src/selection/data.js +117 -0
- data/node_modules/dc/node_modules/d3/src/selection/datum.js +7 -0
- data/node_modules/dc/node_modules/d3/src/selection/each.js +16 -0
- data/node_modules/dc/node_modules/d3/src/selection/empty.js +5 -0
- data/node_modules/dc/node_modules/d3/src/selection/enter-insert.js +20 -0
- data/node_modules/dc/node_modules/d3/src/selection/enter-select.js +27 -0
- data/node_modules/dc/node_modules/d3/src/selection/enter.js +21 -0
- data/node_modules/dc/node_modules/d3/src/selection/filter.js +28 -0
- data/node_modules/dc/node_modules/d3/src/selection/html.js +10 -0
- data/node_modules/dc/node_modules/d3/src/selection/index.js +1 -0
- data/node_modules/dc/node_modules/d3/src/selection/insert.js +9 -0
- data/node_modules/dc/node_modules/d3/src/selection/interrupt.js +27 -0
- data/node_modules/dc/node_modules/d3/src/selection/node.js +11 -0
- data/node_modules/dc/node_modules/d3/src/selection/on.js +106 -0
- data/node_modules/dc/node_modules/d3/src/selection/order.js +13 -0
- data/node_modules/dc/node_modules/d3/src/selection/property.js +43 -0
- data/node_modules/dc/node_modules/d3/src/selection/remove.js +13 -0
- data/node_modules/dc/node_modules/d3/src/selection/select.js +32 -0
- data/node_modules/dc/node_modules/d3/src/selection/selectAll.js +27 -0
- data/node_modules/dc/node_modules/d3/src/selection/selection.js +81 -0
- data/node_modules/dc/node_modules/d3/src/selection/size.js +7 -0
- data/node_modules/dc/node_modules/d3/src/selection/sort.js +15 -0
- data/node_modules/dc/node_modules/d3/src/selection/style.js +59 -0
- data/node_modules/dc/node_modules/d3/src/selection/text.js +10 -0
- data/node_modules/dc/node_modules/d3/src/selection/transition.js +21 -0
- data/node_modules/dc/node_modules/d3/src/start.js +2 -0
- data/node_modules/dc/node_modules/d3/src/svg/arc.js +292 -0
- data/node_modules/dc/node_modules/d3/src/svg/area-radial.js +14 -0
- data/node_modules/dc/node_modules/d3/src/svg/area.js +121 -0
- data/node_modules/dc/node_modules/d3/src/svg/axis.js +160 -0
- data/node_modules/dc/node_modules/d3/src/svg/brush.js +429 -0
- data/node_modules/dc/node_modules/d3/src/svg/chord.js +90 -0
- data/node_modules/dc/node_modules/d3/src/svg/diagonal-radial.js +27 -0
- data/node_modules/dc/node_modules/d3/src/svg/diagonal.js +43 -0
- data/node_modules/dc/node_modules/d3/src/svg/index.js +12 -0
- data/node_modules/dc/node_modules/d3/src/svg/line-radial.js +27 -0
- data/node_modules/dc/node_modules/d3/src/svg/line.js +432 -0
- data/node_modules/dc/node_modules/d3/src/svg/svg.js +1 -0
- data/node_modules/dc/node_modules/d3/src/svg/symbol.js +105 -0
- data/node_modules/dc/node_modules/d3/src/time/day.js +21 -0
- data/node_modules/dc/node_modules/d3/src/time/format-iso.js +19 -0
- data/node_modules/dc/node_modules/d3/src/time/format-utc.js +3 -0
- data/node_modules/dc/node_modules/d3/src/time/format.js +4 -0
- data/node_modules/dc/node_modules/d3/src/time/hour.js +14 -0
- data/node_modules/dc/node_modules/d3/src/time/index.js +14 -0
- data/node_modules/dc/node_modules/d3/src/time/interval.js +71 -0
- data/node_modules/dc/node_modules/d3/src/time/minute.js +13 -0
- data/node_modules/dc/node_modules/d3/src/time/month.js +16 -0
- data/node_modules/dc/node_modules/d3/src/time/scale-utc.js +25 -0
- data/node_modules/dc/node_modules/d3/src/time/scale.js +155 -0
- data/node_modules/dc/node_modules/d3/src/time/second.js +13 -0
- data/node_modules/dc/node_modules/d3/src/time/time.js +33 -0
- data/node_modules/dc/node_modules/d3/src/time/week.js +31 -0
- data/node_modules/dc/node_modules/d3/src/time/year.js +16 -0
- data/node_modules/dc/node_modules/d3/src/transition/attr.js +58 -0
- data/node_modules/dc/node_modules/d3/src/transition/delay.js +10 -0
- data/node_modules/dc/node_modules/d3/src/transition/duration.js +10 -0
- data/node_modules/dc/node_modules/d3/src/transition/each.js +26 -0
- data/node_modules/dc/node_modules/d3/src/transition/ease.js +10 -0
- data/node_modules/dc/node_modules/d3/src/transition/filter.js +22 -0
- data/node_modules/dc/node_modules/d3/src/transition/index.js +1 -0
- data/node_modules/dc/node_modules/d3/src/transition/remove.js +9 -0
- data/node_modules/dc/node_modules/d3/src/transition/select.js +28 -0
- data/node_modules/dc/node_modules/d3/src/transition/selectAll.js +31 -0
- data/node_modules/dc/node_modules/d3/src/transition/style.js +53 -0
- data/node_modules/dc/node_modules/d3/src/transition/subtransition.js +25 -0
- data/node_modules/dc/node_modules/d3/src/transition/text.js +11 -0
- data/node_modules/dc/node_modules/d3/src/transition/transition.js +161 -0
- data/node_modules/dc/node_modules/d3/src/transition/tween.js +17 -0
- data/node_modules/dc/node_modules/d3/src/xhr/html.js +12 -0
- data/node_modules/dc/node_modules/d3/src/xhr/index.js +5 -0
- data/node_modules/dc/node_modules/d3/src/xhr/json.js +9 -0
- data/node_modules/dc/node_modules/d3/src/xhr/text.js +5 -0
- data/node_modules/dc/node_modules/d3/src/xhr/xhr.js +126 -0
- data/node_modules/dc/node_modules/d3/src/xhr/xml.js +5 -0
- data/node_modules/dc/regression/inject-serializer.js +6 -0
- data/node_modules/dc/regression/stock-regression-test.js +140 -0
- data/node_modules/dc/spec/bar-chart-spec.js +1230 -0
- data/node_modules/dc/spec/base-mixin-spec.js +611 -0
- data/node_modules/dc/spec/biggish-data-spec.js +136 -0
- data/node_modules/dc/spec/box-plot-spec.js +211 -0
- data/node_modules/dc/spec/bubble-chart-spec.js +450 -0
- data/node_modules/dc/spec/bubble-overlay-spec.js +102 -0
- data/node_modules/dc/spec/color-spec.js +89 -0
- data/node_modules/dc/spec/composite-chart-spec.js +691 -0
- data/node_modules/dc/spec/coordinate-grid-chart-spec.js +962 -0
- data/node_modules/dc/spec/core-spec.js +301 -0
- data/node_modules/dc/spec/data-addition-spec.js +122 -0
- data/node_modules/dc/spec/data-count-spec.js +180 -0
- data/node_modules/dc/spec/data-grid-spec.js +124 -0
- data/node_modules/dc/spec/data-table-spec.js +251 -0
- data/node_modules/dc/spec/event-spec.js +41 -0
- data/node_modules/dc/spec/filter-dates-spec.js +92 -0
- data/node_modules/dc/spec/filters-spec.js +140 -0
- data/node_modules/dc/spec/geo-choropleth-chart-spec.js +225 -0
- data/node_modules/dc/spec/heatmap-spec.js +363 -0
- data/node_modules/dc/spec/helpers/custom_matchers.js +213 -0
- data/node_modules/dc/spec/helpers/fixtures.js +81 -0
- data/node_modules/dc/spec/helpers/geoFixtures.js +113 -0
- data/node_modules/dc/spec/helpers/load-jsreporter.js +37 -0
- data/node_modules/dc/spec/helpers/spec-helper.js +53 -0
- data/node_modules/dc/spec/legend-spec.js +266 -0
- data/node_modules/dc/spec/line-chart-spec.js +709 -0
- data/node_modules/dc/spec/logger-spec.js +80 -0
- data/node_modules/dc/spec/number-display-spec.js +168 -0
- data/node_modules/dc/spec/pie-chart-spec.js +677 -0
- data/node_modules/dc/spec/row-chart-spec.js +362 -0
- data/node_modules/dc/spec/scatter-plot-spec.js +336 -0
- data/node_modules/dc/spec/series-chart-spec.js +133 -0
- data/node_modules/dc/spec/utils-spec.js +110 -0
- data/node_modules/dc/src/banner.js +2 -0
- data/node_modules/dc/src/bar-chart.js +374 -0
- data/node_modules/dc/src/base-mixin.js +1478 -0
- data/node_modules/dc/src/box-plot.js +240 -0
- data/node_modules/dc/src/bubble-chart.js +177 -0
- data/node_modules/dc/src/bubble-mixin.js +244 -0
- data/node_modules/dc/src/bubble-overlay.js +207 -0
- data/node_modules/dc/src/cap-mixin.js +151 -0
- data/node_modules/dc/src/color-mixin.js +172 -0
- data/node_modules/dc/src/composite-chart.js +544 -0
- data/node_modules/dc/src/coordinate-grid-mixin.js +1300 -0
- data/node_modules/dc/src/core.js +425 -0
- data/node_modules/dc/src/d3.box.js +317 -0
- data/node_modules/dc/src/data-count.js +110 -0
- data/node_modules/dc/src/data-grid.js +243 -0
- data/node_modules/dc/src/data-table.js +419 -0
- data/node_modules/dc/src/errors.js +28 -0
- data/node_modules/dc/src/events.js +37 -0
- data/node_modules/dc/src/filters.js +124 -0
- data/node_modules/dc/src/footer.js +35 -0
- data/node_modules/dc/src/geo-choropleth-chart.js +279 -0
- data/node_modules/dc/src/heatmap.js +378 -0
- data/node_modules/dc/src/legend.js +277 -0
- data/node_modules/dc/src/line-chart.js +504 -0
- data/node_modules/dc/src/logger.js +40 -0
- data/node_modules/dc/src/margin-mixin.js +44 -0
- data/node_modules/dc/src/number-display.js +141 -0
- data/node_modules/dc/src/pie-chart.js +571 -0
- data/node_modules/dc/src/row-chart.js +425 -0
- data/node_modules/dc/src/scatter-plot.js +338 -0
- data/node_modules/dc/src/series-chart.js +192 -0
- data/node_modules/dc/src/stack-mixin.js +319 -0
- data/node_modules/dc/src/utils.js +290 -0
- data/node_modules/dc/web/docs/html/scripts/docstrap.lib.js +11 -0
- data/node_modules/dc/web/docs/html/scripts/fulltext-search-ui.js +89 -0
- data/node_modules/dc/web/docs/html/scripts/fulltext-search.js +36 -0
- data/node_modules/dc/web/docs/html/scripts/lunr.min.js +7 -0
- data/node_modules/dc/web/docs/html/scripts/prettify/jquery.min.js +6 -0
- data/node_modules/dc/web/docs/html/scripts/prettify/lang-css.js +21 -0
- data/node_modules/dc/web/docs/html/scripts/prettify/prettify.js +496 -0
- data/node_modules/dc/web/docs/html/scripts/sunlight.js +1157 -0
- data/node_modules/dc/web/docs/html/scripts/toc.js +203 -0
- data/node_modules/dc/web/ep/list.js +106 -0
- data/node_modules/dc/web/examples/lysenko-interval-tree.js +447 -0
- data/node_modules/dc/web/highlighter/shAutoloader.js +17 -0
- data/node_modules/dc/web/highlighter/shBrushJScript.js +52 -0
- data/node_modules/dc/web/highlighter/shBrushXml.js +69 -0
- data/node_modules/dc/web/highlighter/shCore.js +17 -0
- data/node_modules/dc/web/js/colorbrewer.js +1 -0
- data/node_modules/dc/web/js/crossfilter.js +1401 -0
- data/node_modules/dc/web/js/d3.js +9554 -0
- data/node_modules/dc/web/js/dc.js +10477 -0
- data/node_modules/dc/web/js/dc.min.js +23 -0
- data/node_modules/dc/web/js/env-data.js +218 -0
- data/node_modules/dc/web/js/jasmine-jsreporter.js +394 -0
- data/node_modules/dc/web/stock.js +685 -0
- data/node_modules/dc/web/transitions/transition-test.js +45 -0
- data/node_modules/jquery/dist/jquery.js +9814 -0
- data/node_modules/jquery/dist/jquery.min.js +4 -0
- data/node_modules/jquery/external/sizzle/dist/sizzle.js +2143 -0
- data/node_modules/jquery/external/sizzle/dist/sizzle.min.js +3 -0
- data/node_modules/jquery/src/ajax.js +845 -0
- data/node_modules/jquery/src/ajax/jsonp.js +100 -0
- data/node_modules/jquery/src/ajax/load.js +83 -0
- data/node_modules/jquery/src/ajax/parseJSON.js +13 -0
- data/node_modules/jquery/src/ajax/parseXML.js +27 -0
- data/node_modules/jquery/src/ajax/script.js +68 -0
- data/node_modules/jquery/src/ajax/var/location.js +3 -0
- data/node_modules/jquery/src/ajax/var/nonce.js +5 -0
- data/node_modules/jquery/src/ajax/var/rquery.js +3 -0
- data/node_modules/jquery/src/ajax/xhr.js +167 -0
- data/node_modules/jquery/src/attributes.js +11 -0
- data/node_modules/jquery/src/attributes/attr.js +142 -0
- data/node_modules/jquery/src/attributes/classes.js +177 -0
- data/node_modules/jquery/src/attributes/prop.js +125 -0
- data/node_modules/jquery/src/attributes/support.js +36 -0
- data/node_modules/jquery/src/attributes/val.js +177 -0
- data/node_modules/jquery/src/callbacks.js +232 -0
- data/node_modules/jquery/src/core.js +494 -0
- data/node_modules/jquery/src/core/access.js +65 -0
- data/node_modules/jquery/src/core/init.js +134 -0
- data/node_modules/jquery/src/core/parseHTML.js +41 -0
- data/node_modules/jquery/src/core/ready.js +103 -0
- data/node_modules/jquery/src/core/var/rsingleTag.js +5 -0
- data/node_modules/jquery/src/css.js +502 -0
- data/node_modules/jquery/src/css/addGetHookIf.js +24 -0
- data/node_modules/jquery/src/css/adjustCSS.js +65 -0
- data/node_modules/jquery/src/css/curCSS.js +60 -0
- data/node_modules/jquery/src/css/defaultDisplay.js +72 -0
- data/node_modules/jquery/src/css/hiddenVisibleSelectors.js +18 -0
- data/node_modules/jquery/src/css/showHide.js +48 -0
- data/node_modules/jquery/src/css/support.js +121 -0
- data/node_modules/jquery/src/css/var/cssExpand.js +3 -0
- data/node_modules/jquery/src/css/var/getStyles.js +15 -0
- data/node_modules/jquery/src/css/var/isHidden.js +16 -0
- data/node_modules/jquery/src/css/var/rmargin.js +3 -0
- data/node_modules/jquery/src/css/var/rnumnonpx.js +5 -0
- data/node_modules/jquery/src/css/var/swap.js +24 -0
- data/node_modules/jquery/src/data.js +187 -0
- data/node_modules/jquery/src/data/Data.js +200 -0
- data/node_modules/jquery/src/data/var/acceptData.js +18 -0
- data/node_modules/jquery/src/data/var/dataPriv.js +5 -0
- data/node_modules/jquery/src/data/var/dataUser.js +5 -0
- data/node_modules/jquery/src/deferred.js +158 -0
- data/node_modules/jquery/src/deprecated.js +32 -0
- data/node_modules/jquery/src/dimensions.js +54 -0
- data/node_modules/jquery/src/effects.js +629 -0
- data/node_modules/jquery/src/effects/Tween.js +121 -0
- data/node_modules/jquery/src/effects/animatedSelector.js +13 -0
- data/node_modules/jquery/src/event.js +711 -0
- data/node_modules/jquery/src/event/ajax.js +20 -0
- data/node_modules/jquery/src/event/alias.js +27 -0
- data/node_modules/jquery/src/event/focusin.js +53 -0
- data/node_modules/jquery/src/event/support.js +9 -0
- data/node_modules/jquery/src/event/trigger.js +183 -0
- data/node_modules/jquery/src/exports/amd.js +24 -0
- data/node_modules/jquery/src/exports/global.js +26 -0
- data/node_modules/jquery/src/intro.js +44 -0
- data/node_modules/jquery/src/jquery.js +37 -0
- data/node_modules/jquery/src/manipulation.js +481 -0
- data/node_modules/jquery/src/manipulation/_evalUrl.js +20 -0
- data/node_modules/jquery/src/manipulation/buildFragment.js +102 -0
- data/node_modules/jquery/src/manipulation/getAll.js +21 -0
- data/node_modules/jquery/src/manipulation/setGlobalEval.js +20 -0
- data/node_modules/jquery/src/manipulation/support.js +33 -0
- data/node_modules/jquery/src/manipulation/var/rcheckableType.js +3 -0
- data/node_modules/jquery/src/manipulation/var/rscriptType.js +3 -0
- data/node_modules/jquery/src/manipulation/var/rtagName.js +3 -0
- data/node_modules/jquery/src/manipulation/wrapMap.js +27 -0
- data/node_modules/jquery/src/offset.js +218 -0
- data/node_modules/jquery/src/outro.js +2 -0
- data/node_modules/jquery/src/queue.js +143 -0
- data/node_modules/jquery/src/queue/delay.js +22 -0
- data/node_modules/jquery/src/selector-native.js +211 -0
- data/node_modules/jquery/src/selector-sizzle.js +14 -0
- data/node_modules/jquery/src/selector.js +1 -0
- data/node_modules/jquery/src/serialize.js +125 -0
- data/node_modules/jquery/src/traversing.js +175 -0
- data/node_modules/jquery/src/traversing/findFilter.js +100 -0
- data/node_modules/jquery/src/traversing/var/dir.js +20 -0
- data/node_modules/jquery/src/traversing/var/rneedsContext.js +6 -0
- data/node_modules/jquery/src/traversing/var/siblings.js +15 -0
- data/node_modules/jquery/src/var/arr.js +3 -0
- data/node_modules/jquery/src/var/class2type.js +5 -0
- data/node_modules/jquery/src/var/concat.js +5 -0
- data/node_modules/jquery/src/var/document.js +3 -0
- data/node_modules/jquery/src/var/documentElement.js +5 -0
- data/node_modules/jquery/src/var/hasOwn.js +5 -0
- data/node_modules/jquery/src/var/indexOf.js +5 -0
- data/node_modules/jquery/src/var/pnum.js +3 -0
- data/node_modules/jquery/src/var/push.js +5 -0
- data/node_modules/jquery/src/var/rcssNum.js +7 -0
- data/node_modules/jquery/src/var/rnotwhite.js +3 -0
- data/node_modules/jquery/src/var/slice.js +5 -0
- data/node_modules/jquery/src/var/support.js +5 -0
- data/node_modules/jquery/src/var/toString.js +5 -0
- data/node_modules/jquery/src/wrap.js +79 -0
- data/target/mdarray_sol.jar +0 -0
- data/test/jx/test_complete.rb +35 -0
- data/test/jx/test_js.rb +543 -0
- data/test/jx/test_proxy_array.rb +239 -0
- data/test/jx/test_proxy_hash.rb +160 -0
- data/test/jx/test_proxy_lambda.rb +80 -0
- data/test/jx/test_rb_js_compat.rb +135 -0
- data/test/jx/test_style_sheets.rb +90 -0
- data/test/mdarray/test_mdarray.rb +75 -0
- data/util/cacert.pem +4095 -0
- data/util/download.rb +256 -0
- data/vendor/jxbrowser-6.8.jar +0 -0
- data/vendor/licence.jar +0 -0
- data/version.rb +2 -0
- metadata +817 -0
@@ -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(N>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],x=r(m),b=t[a],A=r(b);h>p&&(f=s,s=d,d=f,f=h,h=p,p=f),x>A&&(f=m,m=b,b=f,f=x,x=A,A=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>x&&(f=s,s=m,m=f,f=h,h=x,x=f),y>x&&(f=g,g=m,m=f,f=y,y=x,x=f),p>A&&(f=d,d=b,b=f,f=p,p=A,A=f),p>y&&(f=d,d=g,g=f,f=p,p=y,y=f),x>A&&(f=m,m=b,b=f,f=x,x=A,A=f);var k=d,O=p,w=m,E=x;t[i]=s,t[l]=t[e],t[c]=g,t[v]=t[u-1],t[a]=b;var M=e+1,U=u-2,z=E>=O&&O>=E;if(z)for(var N=M;U>=N;++N){var C=t[N],S=r(C);if(O>S)N!==M&&(t[N]=t[M],t[M]=C),++M;else if(S>O)for(;;){var q=r(t[U]);{if(!(q>O)){if(O>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(O>S)N!==M&&(t[N]=t[M],t[M]=C),++M;else if(S>E)for(;;){var q=r(t[U]);{if(!(q>E)){O>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]=k,t[u-1]=t[U+1],t[U+1]=w,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]))<=O&&F>=O;)++M;for(;(q=r(t[U]))<=E&&q>=E;)--U;for(var N=M;U>=N;N++){var C=t[N],S=r(C);if(O>=S&&S>=O)N!==M&&(t[N]=t[M],t[M]=C),M++;else if(E>=S&&S>=E)for(;;){var q=r(t[U]);{if(!(E>=q&&q>=E)){O>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){for(var n=Array(r),t=-1;++t<r;)n[t]=0;return n}function c(r,n){for(var t=r.length;n>t;)r[t++]=0;return r}function l(r,n){if(n>32)throw Error("invalid array width!");return r}function v(r,n){return function(t){var e=t.length;return[r.left(t,n,0,e),r.right(t,n,0,e)]}}function s(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 h(r){return[0,r.length]}function d(){return null}function p(){return 0}function g(r){return r+1}function y(r){return r-1}function m(r){return function(n,t){return n+ +r(t)}}function x(r){return function(n,t){return n-r(t)}}function b(){function r(r){var n=E,t=r.length;return t&&(b=b.concat(r),z=F(z,E+=t),S.forEach(function(e){e(r,n,t)})),l}function e(){for(var r=A(E,E),n=[],t=0,e=0;E>t;++t)z[t]?r[t]=e++:n.push(t);N.forEach(function(r){r(0,[],n)}),q.forEach(function(n){n(r)});for(var u,t=0,e=0;E>t;++t)(u=z[t])&&(t!==e&&(z[e]=u,b[e]=b[t]),++e);for(b.length=e;E>e;)z[--E]=0}function o(r){function e(n,e,u){T=n.map(r),V=$(k(u),0,u),T=t(T,V);var f,o=_(T),i=o[0],a=o[1];if(W)for(f=0;u>f;++f)W(T[f],f)||(z[V[f]+e]|=Y);else{for(f=0;i>f;++f)z[V[f]+e]|=Y;for(f=a;u>f;++f)z[V[f]+e]|=Y}if(!e)return P=T,Q=V,tn=i,en=a,void 0;var c=P,l=Q,v=0,s=0;for(P=Array(E),Q=A(E,E),f=0;e>v&&u>s;++f)c[v]<T[s]?(P[f]=c[v],Q[f]=l[v++]):(P[f]=T[s],Q[f]=V[s++]+e);for(;e>v;++v,++f)P[f]=c[v],Q[f]=l[v];for(;u>s;++s,++f)P[f]=T[s],Q[f]=V[s]+e;o=_(P),tn=o[0],en=o[1]}function o(r,n,t){rn.forEach(function(r){r(T,V,n,t)}),T=V=null}function a(r){for(var n,t=0,e=0;E>t;++t)z[n=Q[t]]&&(t!==e&&(P[e]=P[t]),Q[e]=r[n],++e);for(P.length=e;E>e;)Q[e++]=0;var u=_(P);tn=u[0],en=u[1]}function c(r){var n=r[0],t=r[1];if(W)return W=null,G(function(r,e){return e>=n&&t>e}),tn=n,en=t,X;var e,u,f,o=[],i=[];if(tn>n)for(e=n,u=Math.min(tn,t);u>e;++e)z[f=Q[e]]^=Y,o.push(f);else if(n>tn)for(e=tn,u=Math.min(n,en);u>e;++e)z[f=Q[e]]^=Y,i.push(f);if(t>en)for(e=Math.max(n,en),u=t;u>e;++e)z[f=Q[e]]^=Y,o.push(f);else if(en>t)for(e=Math.max(tn,t),u=en;u>e;++e)z[f=Q[e]]^=Y,i.push(f);return tn=n,en=t,N.forEach(function(r){r(Y,o,i)}),X}function l(r){return null==r?B():Array.isArray(r)?j(r):"function"==typeof r?D(r):C(r)}function C(r){return c((_=v(w,r))(P))}function j(r){return c((_=s(w,r))(P))}function B(){return c((_=h)(P))}function D(r){return _=h,G(W=r),tn=0,en=E,X}function G(r){var n,t,e,u=[],f=[];for(n=0;E>n;++n)!(z[t=Q[n]]&Y)^!!(e=r(P[n],n))&&(e?(z[t]&=Z,u.push(t)):(z[t]|=Y,f.push(t)));N.forEach(function(r){r(Y,u,f)})}function H(r){for(var n,t=[],e=en;--e>=tn&&r>0;)z[n=Q[e]]||(t.push(b[n]),--r);return t}function I(r){for(var n,t=[],e=tn;en>e&&r>0;)z[n=Q[e]]||(t.push(b[n]),--r),e++;return t}function J(r){function t(n,t,e,u){function f(){++T===L&&(m=R(m,K<<=1),B=R(B,K),L=O(K))}var l,v,s,h,p,g,y=j,m=A(T,L),x=H,k=J,w=T,M=0,U=0;for(X&&(x=k=d),j=Array(T),T=0,B=w>1?F(B,E):A(E,L),w&&(s=(v=y[0]).key);u>U&&!((h=r(n[U]))>=h);)++U;for(;u>U;){for(v&&h>=s?(p=v,g=s,m[M]=T,(v=y[++M])&&(s=v.key)):(p={key:h,value:k()},g=h),j[T]=p;!(h>g||(B[l=t[U]+e]=T,z[l]&Z||(p.value=x(p.value,b[l])),++U>=u));)h=r(n[U]);f()}for(;w>M;)j[m[M]=T]=y[M++],f();if(T>M)for(M=0;e>M;++M)B[M]=m[B[M]];l=N.indexOf(V),T>1?(V=o,W=a):(!T&&$&&(T=1,j=[{key:null,value:k()}]),1===T?(V=i,W=c):(V=d,W=d),B=null),N[l]=V}function e(){if(T>1){for(var r=T,n=j,t=A(r,r),e=0,u=0;E>e;++e)z[e]&&(t[B[u]=B[e]]=1,++u);for(j=[],T=0,e=0;r>e;++e)t[e]&&(t[e]=T++,j.push(n[e]));if(T>1)for(var e=0;u>e;++e)B[e]=t[B[e]];else B=null;N[N.indexOf(V)]=T>1?(W=a,V=o):1===T?(W=c,V=i):W=V=d}else if(1===T){if($)return;for(var e=0;E>e;++e)if(z[e])return;j=[],T=0,N[N.indexOf(V)]=V=W=d}}function o(r,n,t){if(r!==Y&&!X){var e,u,f,o;for(e=0,f=n.length;f>e;++e)z[u=n[e]]&Z||(o=j[B[u]],o.value=H(o.value,b[u]));for(e=0,f=t.length;f>e;++e)(z[u=t[e]]&Z)===r&&(o=j[B[u]],o.value=I(o.value,b[u]))}}function i(r,n,t){if(r!==Y&&!X){var e,u,f,o=j[0];for(e=0,f=n.length;f>e;++e)z[u=n[e]]&Z||(o.value=H(o.value,b[u]));for(e=0,f=t.length;f>e;++e)(z[u=t[e]]&Z)===r&&(o.value=I(o.value,b[u]))}}function a(){var r,n;for(r=0;T>r;++r)j[r].value=J();for(r=0;E>r;++r)z[r]&Z||(n=j[B[r]],n.value=H(n.value,b[r]))}function c(){var r,n=j[0];for(n.value=J(),r=0;E>r;++r)z[r]&Z||(n.value=H(n.value,b[r]))}function l(){return X&&(W(),X=!1),j}function v(r){var n=D(l(),0,j.length,r);return G.sort(n,0,n.length)}function s(r,n,t){return H=r,I=n,J=t,X=!0,S}function h(){return s(g,y,p)}function k(r){return s(m(r),x(r),p)}function w(r){function n(n){return r(n.value)}return D=f(n),G=u(n),S}function M(){return w(n)}function U(){return T}function C(){var r=N.indexOf(V);return r>=0&&N.splice(r,1),r=rn.indexOf(t),r>=0&&rn.splice(r,1),r=q.indexOf(e),r>=0&&q.splice(r,1),S}var S={top:v,all:l,reduce:s,reduceCount:h,reduceSum:k,order:w,orderNatural:M,size:U,dispose:C,remove:C};nn.push(S);var j,B,D,G,H,I,J,K=8,L=O(K),T=0,V=d,W=d,X=!0,$=r===d;return arguments.length<1&&(r=n),N.push(V),rn.push(t),q.push(e),t(P,Q,0,E),h().orderNatural()}function K(){var r=J(d),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 L(){nn.forEach(function(r){r.dispose()});var r=S.indexOf(e);return r>=0&&S.splice(r,1),r=S.indexOf(o),r>=0&&S.splice(r,1),r=q.indexOf(a),r>=0&&q.splice(r,1),M&=Z,B()}var P,Q,T,V,W,X={filter:l,filterExact:C,filterRange:j,filterFunction:D,filterAll:B,top:H,bottom:I,group:J,groupAll:K,dispose:L,remove:L},Y=~M&-~M,Z=~Y,$=i(function(r){return T[r]}),_=h,rn=[],nn=[],tn=0,en=0;return S.unshift(e),S.push(o),q.push(a),M|=Y,(U>=32?!Y:M&-(1<<U))&&(z=R(z,U<<=1)),e(b,0,E),o(b,0,E),X}function a(){function r(r,n){var t;if(!h)for(t=n;E>t;++t)z[t]||(a=c(a,b[t]))}function n(r,n,t){var e,u,f;if(!h){for(e=0,f=n.length;f>e;++e)z[u=n[e]]||(a=c(a,b[u]));for(e=0,f=t.length;f>e;++e)z[u=t[e]]===r&&(a=l(a,b[u]))}}function t(){var r;for(a=v(),r=0;E>r;++r)z[r]||(a=c(a,b[r]))}function e(r,n,t){return c=r,l=n,v=t,h=!0,s}function u(){return e(g,y,p)}function f(r){return e(m(r),x(r),p)}function o(){return h&&(t(),h=!1),a}function i(){var t=N.indexOf(n);return t>=0&&N.splice(t),t=S.indexOf(r),t>=0&&S.splice(t),s}var a,c,l,v,s={reduce:e,reduceCount:u,reduceSum:f,value:o,dispose:i,remove:i},h=!0;return N.push(n),S.push(r),r(b,0,E),u()}function c(){return E}var l={add:r,remove:e,dimension:o,groupAll:a,size:c},b=[],E=0,M=0,U=8,z=C(0),N=[],S=[],q=[];return arguments.length?r(arguments[0]):l}function A(r,n){return(257>n?C:65537>n?S:q)(r)}function k(r){for(var n=A(r,r),t=-1;++t<r;)n[t]=t;return n}function O(r){return 8===r?256:16===r?65536:4294967296}b.version="1.3.14",b.permute=t;var w=b.bisect=e(n);w.by=e;var E=b.heap=u(n);E.by=u;var M=b.heapselect=f(n);M.by=f;var U=b.insertionsort=o(n);U.by=o;var z=b.quicksort=i(n);z.by=i;var N=32,C=a,S=a,q=a,F=c,R=l;"undefined"!=typeof Uint8Array&&(C=function(r){return new Uint8Array(r)},S=function(r){return new Uint16Array(r)},q=function(r){return new Uint32Array(r)},F=function(r,n){if(r.length>=n)return r;var t=new r.constructor(n);return t.set(r),t},R=function(r,n){var t;switch(n){case 16:t=S(r.length);break;case 32:t=q(r.length);break;default:throw Error("invalid array width!")}return t.set(r),t}),r.crossfilter=b}("undefined"!=typeof exports&&exports||this);
|
@@ -0,0 +1 @@
|
|
1
|
+
module.exports = require("./crossfilter").crossfilter;
|
@@ -0,0 +1,46 @@
|
|
1
|
+
var crossfilter_array8 = crossfilter_arrayUntyped,
|
2
|
+
crossfilter_array16 = crossfilter_arrayUntyped,
|
3
|
+
crossfilter_array32 = crossfilter_arrayUntyped,
|
4
|
+
crossfilter_arrayLengthen = crossfilter_arrayLengthenUntyped,
|
5
|
+
crossfilter_arrayWiden = crossfilter_arrayWidenUntyped;
|
6
|
+
|
7
|
+
if (typeof Uint8Array !== "undefined") {
|
8
|
+
crossfilter_array8 = function(n) { return new Uint8Array(n); };
|
9
|
+
crossfilter_array16 = function(n) { return new Uint16Array(n); };
|
10
|
+
crossfilter_array32 = function(n) { return new Uint32Array(n); };
|
11
|
+
|
12
|
+
crossfilter_arrayLengthen = function(array, length) {
|
13
|
+
if (array.length >= length) return array;
|
14
|
+
var copy = new array.constructor(length);
|
15
|
+
copy.set(array);
|
16
|
+
return copy;
|
17
|
+
};
|
18
|
+
|
19
|
+
crossfilter_arrayWiden = function(array, width) {
|
20
|
+
var copy;
|
21
|
+
switch (width) {
|
22
|
+
case 16: copy = crossfilter_array16(array.length); break;
|
23
|
+
case 32: copy = crossfilter_array32(array.length); break;
|
24
|
+
default: throw new Error("invalid array width!");
|
25
|
+
}
|
26
|
+
copy.set(array);
|
27
|
+
return copy;
|
28
|
+
};
|
29
|
+
}
|
30
|
+
|
31
|
+
function crossfilter_arrayUntyped(n) {
|
32
|
+
var array = new Array(n), i = -1;
|
33
|
+
while (++i < n) array[i] = 0;
|
34
|
+
return array;
|
35
|
+
}
|
36
|
+
|
37
|
+
function crossfilter_arrayLengthenUntyped(array, length) {
|
38
|
+
var n = array.length;
|
39
|
+
while (n < length) array[n++] = 0;
|
40
|
+
return array;
|
41
|
+
}
|
42
|
+
|
43
|
+
function crossfilter_arrayWidenUntyped(array, width) {
|
44
|
+
if (width > 32) throw new Error("invalid array width!");
|
45
|
+
return array;
|
46
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
var bisect = crossfilter.bisect = bisect_by(crossfilter_identity);
|
2
|
+
|
3
|
+
bisect.by = bisect_by;
|
4
|
+
|
5
|
+
function bisect_by(f) {
|
6
|
+
|
7
|
+
// Locate the insertion point for x in a to maintain sorted order. The
|
8
|
+
// arguments lo and hi may be used to specify a subset of the array which
|
9
|
+
// should be considered; by default the entire array is used. If x is already
|
10
|
+
// present in a, the insertion point will be before (to the left of) any
|
11
|
+
// existing entries. The return value is suitable for use as the first
|
12
|
+
// argument to `array.splice` assuming that a is already sorted.
|
13
|
+
//
|
14
|
+
// The returned insertion point i partitions the array a into two halves so
|
15
|
+
// that all v < x for v in a[lo:i] for the left side and all v >= x for v in
|
16
|
+
// a[i:hi] for the right side.
|
17
|
+
function bisectLeft(a, x, lo, hi) {
|
18
|
+
while (lo < hi) {
|
19
|
+
var mid = lo + hi >>> 1;
|
20
|
+
if (f(a[mid]) < x) lo = mid + 1;
|
21
|
+
else hi = mid;
|
22
|
+
}
|
23
|
+
return lo;
|
24
|
+
}
|
25
|
+
|
26
|
+
// Similar to bisectLeft, but returns an insertion point which comes after (to
|
27
|
+
// the right of) any existing entries of x in a.
|
28
|
+
//
|
29
|
+
// The returned insertion point i partitions the array into two halves so that
|
30
|
+
// all v <= x for v in a[lo:i] for the left side and all v > x for v in
|
31
|
+
// a[i:hi] for the right side.
|
32
|
+
function bisectRight(a, x, lo, hi) {
|
33
|
+
while (lo < hi) {
|
34
|
+
var mid = lo + hi >>> 1;
|
35
|
+
if (x < f(a[mid])) hi = mid;
|
36
|
+
else lo = mid + 1;
|
37
|
+
}
|
38
|
+
return lo;
|
39
|
+
}
|
40
|
+
|
41
|
+
bisectRight.right = bisectRight;
|
42
|
+
bisectRight.left = bisectLeft;
|
43
|
+
return bisectRight;
|
44
|
+
}
|
@@ -0,0 +1,872 @@
|
|
1
|
+
exports.crossfilter = crossfilter;
|
2
|
+
|
3
|
+
function crossfilter() {
|
4
|
+
var crossfilter = {
|
5
|
+
add: add,
|
6
|
+
remove: removeData,
|
7
|
+
dimension: dimension,
|
8
|
+
groupAll: groupAll,
|
9
|
+
size: size
|
10
|
+
};
|
11
|
+
|
12
|
+
var data = [], // the records
|
13
|
+
n = 0, // the number of records; data.length
|
14
|
+
m = 0, // a bit mask representing which dimensions are in use
|
15
|
+
M = 8, // number of dimensions that can fit in `filters`
|
16
|
+
filters = crossfilter_array8(0), // M bits per record; 1 is filtered out
|
17
|
+
filterListeners = [], // when the filters change
|
18
|
+
dataListeners = [], // when data is added
|
19
|
+
removeDataListeners = []; // when data is removed
|
20
|
+
|
21
|
+
// Adds the specified new records to this crossfilter.
|
22
|
+
function add(newData) {
|
23
|
+
var n0 = n,
|
24
|
+
n1 = newData.length;
|
25
|
+
|
26
|
+
// If there's actually new data to add…
|
27
|
+
// Merge the new data into the existing data.
|
28
|
+
// Lengthen the filter bitset to handle the new records.
|
29
|
+
// Notify listeners (dimensions and groups) that new data is available.
|
30
|
+
if (n1) {
|
31
|
+
data = data.concat(newData);
|
32
|
+
filters = crossfilter_arrayLengthen(filters, n += n1);
|
33
|
+
dataListeners.forEach(function(l) { l(newData, n0, n1); });
|
34
|
+
}
|
35
|
+
|
36
|
+
return crossfilter;
|
37
|
+
}
|
38
|
+
|
39
|
+
// Removes all records that match the current filters.
|
40
|
+
function removeData() {
|
41
|
+
var newIndex = crossfilter_index(n, n),
|
42
|
+
removed = [];
|
43
|
+
for (var i = 0, j = 0; i < n; ++i) {
|
44
|
+
if (filters[i]) newIndex[i] = j++;
|
45
|
+
else removed.push(i);
|
46
|
+
}
|
47
|
+
|
48
|
+
// Remove all matching records from groups.
|
49
|
+
filterListeners.forEach(function(l) { l(0, [], removed); });
|
50
|
+
|
51
|
+
// Update indexes.
|
52
|
+
removeDataListeners.forEach(function(l) { l(newIndex); });
|
53
|
+
|
54
|
+
// Remove old filters and data by overwriting.
|
55
|
+
for (var i = 0, j = 0, k; i < n; ++i) {
|
56
|
+
if (k = filters[i]) {
|
57
|
+
if (i !== j) filters[j] = k, data[j] = data[i];
|
58
|
+
++j;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
data.length = j;
|
62
|
+
while (n > j) filters[--n] = 0;
|
63
|
+
}
|
64
|
+
|
65
|
+
// Adds a new dimension with the specified value accessor function.
|
66
|
+
function dimension(value) {
|
67
|
+
var dimension = {
|
68
|
+
filter: filter,
|
69
|
+
filterExact: filterExact,
|
70
|
+
filterRange: filterRange,
|
71
|
+
filterFunction: filterFunction,
|
72
|
+
filterAll: filterAll,
|
73
|
+
top: top,
|
74
|
+
bottom: bottom,
|
75
|
+
group: group,
|
76
|
+
groupAll: groupAll,
|
77
|
+
dispose: dispose,
|
78
|
+
remove: dispose // for backwards-compatibility
|
79
|
+
};
|
80
|
+
|
81
|
+
var one = ~m & -~m, // lowest unset bit as mask, e.g., 00001000
|
82
|
+
zero = ~one, // inverted one, e.g., 11110111
|
83
|
+
values, // sorted, cached array
|
84
|
+
index, // value rank ↦ object id
|
85
|
+
newValues, // temporary array storing newly-added values
|
86
|
+
newIndex, // temporary array storing newly-added index
|
87
|
+
sort = quicksort_by(function(i) { return newValues[i]; }),
|
88
|
+
refilter = crossfilter_filterAll, // for recomputing filter
|
89
|
+
refilterFunction, // the custom filter function in use
|
90
|
+
indexListeners = [], // when data is added
|
91
|
+
dimensionGroups = [],
|
92
|
+
lo0 = 0,
|
93
|
+
hi0 = 0;
|
94
|
+
|
95
|
+
// Updating a dimension is a two-stage process. First, we must update the
|
96
|
+
// associated filters for the newly-added records. Once all dimensions have
|
97
|
+
// updated their filters, the groups are notified to update.
|
98
|
+
dataListeners.unshift(preAdd);
|
99
|
+
dataListeners.push(postAdd);
|
100
|
+
|
101
|
+
removeDataListeners.push(removeData);
|
102
|
+
|
103
|
+
// Incorporate any existing data into this dimension, and make sure that the
|
104
|
+
// filter bitset is wide enough to handle the new dimension.
|
105
|
+
m |= one;
|
106
|
+
if (M >= 32 ? !one : m & -(1 << M)) {
|
107
|
+
filters = crossfilter_arrayWiden(filters, M <<= 1);
|
108
|
+
}
|
109
|
+
preAdd(data, 0, n);
|
110
|
+
postAdd(data, 0, n);
|
111
|
+
|
112
|
+
// Incorporates the specified new records into this dimension.
|
113
|
+
// This function is responsible for updating filters, values, and index.
|
114
|
+
function preAdd(newData, n0, n1) {
|
115
|
+
|
116
|
+
// Permute new values into natural order using a sorted index.
|
117
|
+
newValues = newData.map(value);
|
118
|
+
newIndex = sort(crossfilter_range(n1), 0, n1);
|
119
|
+
newValues = permute(newValues, newIndex);
|
120
|
+
|
121
|
+
// Bisect newValues to determine which new records are selected.
|
122
|
+
var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1], i;
|
123
|
+
if (refilterFunction) {
|
124
|
+
for (i = 0; i < n1; ++i) {
|
125
|
+
if (!refilterFunction(newValues[i], i)) filters[newIndex[i] + n0] |= one;
|
126
|
+
}
|
127
|
+
} else {
|
128
|
+
for (i = 0; i < lo1; ++i) filters[newIndex[i] + n0] |= one;
|
129
|
+
for (i = hi1; i < n1; ++i) filters[newIndex[i] + n0] |= one;
|
130
|
+
}
|
131
|
+
|
132
|
+
// If this dimension previously had no data, then we don't need to do the
|
133
|
+
// more expensive merge operation; use the new values and index as-is.
|
134
|
+
if (!n0) {
|
135
|
+
values = newValues;
|
136
|
+
index = newIndex;
|
137
|
+
lo0 = lo1;
|
138
|
+
hi0 = hi1;
|
139
|
+
return;
|
140
|
+
}
|
141
|
+
|
142
|
+
var oldValues = values,
|
143
|
+
oldIndex = index,
|
144
|
+
i0 = 0,
|
145
|
+
i1 = 0;
|
146
|
+
|
147
|
+
// Otherwise, create new arrays into which to merge new and old.
|
148
|
+
values = new Array(n);
|
149
|
+
index = crossfilter_index(n, n);
|
150
|
+
|
151
|
+
// Merge the old and new sorted values, and old and new index.
|
152
|
+
for (i = 0; i0 < n0 && i1 < n1; ++i) {
|
153
|
+
if (oldValues[i0] < newValues[i1]) {
|
154
|
+
values[i] = oldValues[i0];
|
155
|
+
index[i] = oldIndex[i0++];
|
156
|
+
} else {
|
157
|
+
values[i] = newValues[i1];
|
158
|
+
index[i] = newIndex[i1++] + n0;
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
// Add any remaining old values.
|
163
|
+
for (; i0 < n0; ++i0, ++i) {
|
164
|
+
values[i] = oldValues[i0];
|
165
|
+
index[i] = oldIndex[i0];
|
166
|
+
}
|
167
|
+
|
168
|
+
// Add any remaining new values.
|
169
|
+
for (; i1 < n1; ++i1, ++i) {
|
170
|
+
values[i] = newValues[i1];
|
171
|
+
index[i] = newIndex[i1] + n0;
|
172
|
+
}
|
173
|
+
|
174
|
+
// Bisect again to recompute lo0 and hi0.
|
175
|
+
bounds = refilter(values), lo0 = bounds[0], hi0 = bounds[1];
|
176
|
+
}
|
177
|
+
|
178
|
+
// When all filters have updated, notify index listeners of the new values.
|
179
|
+
function postAdd(newData, n0, n1) {
|
180
|
+
indexListeners.forEach(function(l) { l(newValues, newIndex, n0, n1); });
|
181
|
+
newValues = newIndex = null;
|
182
|
+
}
|
183
|
+
|
184
|
+
function removeData(reIndex) {
|
185
|
+
for (var i = 0, j = 0, k; i < n; ++i) {
|
186
|
+
if (filters[k = index[i]]) {
|
187
|
+
if (i !== j) values[j] = values[i];
|
188
|
+
index[j] = reIndex[k];
|
189
|
+
++j;
|
190
|
+
}
|
191
|
+
}
|
192
|
+
values.length = j;
|
193
|
+
while (j < n) index[j++] = 0;
|
194
|
+
|
195
|
+
// Bisect again to recompute lo0 and hi0.
|
196
|
+
var bounds = refilter(values);
|
197
|
+
lo0 = bounds[0], hi0 = bounds[1];
|
198
|
+
}
|
199
|
+
|
200
|
+
// Updates the selected values based on the specified bounds [lo, hi].
|
201
|
+
// This implementation is used by all the public filter methods.
|
202
|
+
function filterIndexBounds(bounds) {
|
203
|
+
var lo1 = bounds[0],
|
204
|
+
hi1 = bounds[1];
|
205
|
+
|
206
|
+
if (refilterFunction) {
|
207
|
+
refilterFunction = null;
|
208
|
+
filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; });
|
209
|
+
lo0 = lo1;
|
210
|
+
hi0 = hi1;
|
211
|
+
return dimension;
|
212
|
+
}
|
213
|
+
|
214
|
+
var i,
|
215
|
+
j,
|
216
|
+
k,
|
217
|
+
added = [],
|
218
|
+
removed = [];
|
219
|
+
|
220
|
+
// Fast incremental update based on previous lo index.
|
221
|
+
if (lo1 < lo0) {
|
222
|
+
for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {
|
223
|
+
filters[k = index[i]] ^= one;
|
224
|
+
added.push(k);
|
225
|
+
}
|
226
|
+
} else if (lo1 > lo0) {
|
227
|
+
for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {
|
228
|
+
filters[k = index[i]] ^= one;
|
229
|
+
removed.push(k);
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
// Fast incremental update based on previous hi index.
|
234
|
+
if (hi1 > hi0) {
|
235
|
+
for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {
|
236
|
+
filters[k = index[i]] ^= one;
|
237
|
+
added.push(k);
|
238
|
+
}
|
239
|
+
} else if (hi1 < hi0) {
|
240
|
+
for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {
|
241
|
+
filters[k = index[i]] ^= one;
|
242
|
+
removed.push(k);
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
lo0 = lo1;
|
247
|
+
hi0 = hi1;
|
248
|
+
filterListeners.forEach(function(l) { l(one, added, removed); });
|
249
|
+
return dimension;
|
250
|
+
}
|
251
|
+
|
252
|
+
// Filters this dimension using the specified range, value, or null.
|
253
|
+
// If the range is null, this is equivalent to filterAll.
|
254
|
+
// If the range is an array, this is equivalent to filterRange.
|
255
|
+
// Otherwise, this is equivalent to filterExact.
|
256
|
+
function filter(range) {
|
257
|
+
return range == null
|
258
|
+
? filterAll() : Array.isArray(range)
|
259
|
+
? filterRange(range) : typeof range === "function"
|
260
|
+
? filterFunction(range)
|
261
|
+
: filterExact(range);
|
262
|
+
}
|
263
|
+
|
264
|
+
// Filters this dimension to select the exact value.
|
265
|
+
function filterExact(value) {
|
266
|
+
return filterIndexBounds((refilter = crossfilter_filterExact(bisect, value))(values));
|
267
|
+
}
|
268
|
+
|
269
|
+
// Filters this dimension to select the specified range [lo, hi].
|
270
|
+
// The lower bound is inclusive, and the upper bound is exclusive.
|
271
|
+
function filterRange(range) {
|
272
|
+
return filterIndexBounds((refilter = crossfilter_filterRange(bisect, range))(values));
|
273
|
+
}
|
274
|
+
|
275
|
+
// Clears any filters on this dimension.
|
276
|
+
function filterAll() {
|
277
|
+
return filterIndexBounds((refilter = crossfilter_filterAll)(values));
|
278
|
+
}
|
279
|
+
|
280
|
+
// Filters this dimension using an arbitrary function.
|
281
|
+
function filterFunction(f) {
|
282
|
+
refilter = crossfilter_filterAll;
|
283
|
+
|
284
|
+
filterIndexFunction(refilterFunction = f);
|
285
|
+
|
286
|
+
lo0 = 0;
|
287
|
+
hi0 = n;
|
288
|
+
|
289
|
+
return dimension;
|
290
|
+
}
|
291
|
+
|
292
|
+
function filterIndexFunction(f) {
|
293
|
+
var i,
|
294
|
+
k,
|
295
|
+
x,
|
296
|
+
added = [],
|
297
|
+
removed = [];
|
298
|
+
|
299
|
+
for (i = 0; i < n; ++i) {
|
300
|
+
if (!(filters[k = index[i]] & one) ^ !!(x = f(values[i], i))) {
|
301
|
+
if (x) filters[k] &= zero, added.push(k);
|
302
|
+
else filters[k] |= one, removed.push(k);
|
303
|
+
}
|
304
|
+
}
|
305
|
+
filterListeners.forEach(function(l) { l(one, added, removed); });
|
306
|
+
}
|
307
|
+
|
308
|
+
// Returns the top K selected records based on this dimension's order.
|
309
|
+
// Note: observes this dimension's filter, unlike group and groupAll.
|
310
|
+
function top(k) {
|
311
|
+
var array = [],
|
312
|
+
i = hi0,
|
313
|
+
j;
|
314
|
+
|
315
|
+
while (--i >= lo0 && k > 0) {
|
316
|
+
if (!filters[j = index[i]]) {
|
317
|
+
array.push(data[j]);
|
318
|
+
--k;
|
319
|
+
}
|
320
|
+
}
|
321
|
+
|
322
|
+
return array;
|
323
|
+
}
|
324
|
+
|
325
|
+
// Returns the bottom K selected records based on this dimension's order.
|
326
|
+
// Note: observes this dimension's filter, unlike group and groupAll.
|
327
|
+
function bottom(k) {
|
328
|
+
var array = [],
|
329
|
+
i = lo0,
|
330
|
+
j;
|
331
|
+
|
332
|
+
while (i < hi0 && k > 0) {
|
333
|
+
if (!filters[j = index[i]]) {
|
334
|
+
array.push(data[j]);
|
335
|
+
--k;
|
336
|
+
}
|
337
|
+
i++;
|
338
|
+
}
|
339
|
+
|
340
|
+
return array;
|
341
|
+
}
|
342
|
+
|
343
|
+
// Adds a new group to this dimension, using the specified key function.
|
344
|
+
function group(key) {
|
345
|
+
var group = {
|
346
|
+
top: top,
|
347
|
+
all: all,
|
348
|
+
reduce: reduce,
|
349
|
+
reduceCount: reduceCount,
|
350
|
+
reduceSum: reduceSum,
|
351
|
+
order: order,
|
352
|
+
orderNatural: orderNatural,
|
353
|
+
size: size,
|
354
|
+
dispose: dispose,
|
355
|
+
remove: dispose // for backwards-compatibility
|
356
|
+
};
|
357
|
+
|
358
|
+
// Ensure that this group will be removed when the dimension is removed.
|
359
|
+
dimensionGroups.push(group);
|
360
|
+
|
361
|
+
var groups, // array of {key, value}
|
362
|
+
groupIndex, // object id ↦ group id
|
363
|
+
groupWidth = 8,
|
364
|
+
groupCapacity = crossfilter_capacity(groupWidth),
|
365
|
+
k = 0, // cardinality
|
366
|
+
select,
|
367
|
+
heap,
|
368
|
+
reduceAdd,
|
369
|
+
reduceRemove,
|
370
|
+
reduceInitial,
|
371
|
+
update = crossfilter_null,
|
372
|
+
reset = crossfilter_null,
|
373
|
+
resetNeeded = true,
|
374
|
+
groupAll = key === crossfilter_null;
|
375
|
+
|
376
|
+
if (arguments.length < 1) key = crossfilter_identity;
|
377
|
+
|
378
|
+
// The group listens to the crossfilter for when any dimension changes, so
|
379
|
+
// that it can update the associated reduce values. It must also listen to
|
380
|
+
// the parent dimension for when data is added, and compute new keys.
|
381
|
+
filterListeners.push(update);
|
382
|
+
indexListeners.push(add);
|
383
|
+
removeDataListeners.push(removeData);
|
384
|
+
|
385
|
+
// Incorporate any existing data into the grouping.
|
386
|
+
add(values, index, 0, n);
|
387
|
+
|
388
|
+
// Incorporates the specified new values into this group.
|
389
|
+
// This function is responsible for updating groups and groupIndex.
|
390
|
+
function add(newValues, newIndex, n0, n1) {
|
391
|
+
var oldGroups = groups,
|
392
|
+
reIndex = crossfilter_index(k, groupCapacity),
|
393
|
+
add = reduceAdd,
|
394
|
+
initial = reduceInitial,
|
395
|
+
k0 = k, // old cardinality
|
396
|
+
i0 = 0, // index of old group
|
397
|
+
i1 = 0, // index of new record
|
398
|
+
j, // object id
|
399
|
+
g0, // old group
|
400
|
+
x0, // old key
|
401
|
+
x1, // new key
|
402
|
+
g, // group to add
|
403
|
+
x; // key of group to add
|
404
|
+
|
405
|
+
// If a reset is needed, we don't need to update the reduce values.
|
406
|
+
if (resetNeeded) add = initial = crossfilter_null;
|
407
|
+
|
408
|
+
// Reset the new groups (k is a lower bound).
|
409
|
+
// Also, make sure that groupIndex exists and is long enough.
|
410
|
+
groups = new Array(k), k = 0;
|
411
|
+
groupIndex = k0 > 1 ? crossfilter_arrayLengthen(groupIndex, n) : crossfilter_index(n, groupCapacity);
|
412
|
+
|
413
|
+
// Get the first old key (x0 of g0), if it exists.
|
414
|
+
if (k0) x0 = (g0 = oldGroups[0]).key;
|
415
|
+
|
416
|
+
// Find the first new key (x1), skipping NaN keys.
|
417
|
+
while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;
|
418
|
+
|
419
|
+
// While new keys remain…
|
420
|
+
while (i1 < n1) {
|
421
|
+
|
422
|
+
// Determine the lesser of the two current keys; new and old.
|
423
|
+
// If there are no old keys remaining, then always add the new key.
|
424
|
+
if (g0 && x0 <= x1) {
|
425
|
+
g = g0, x = x0;
|
426
|
+
|
427
|
+
// Record the new index of the old group.
|
428
|
+
reIndex[i0] = k;
|
429
|
+
|
430
|
+
// Retrieve the next old key.
|
431
|
+
if (g0 = oldGroups[++i0]) x0 = g0.key;
|
432
|
+
} else {
|
433
|
+
g = {key: x1, value: initial()}, x = x1;
|
434
|
+
}
|
435
|
+
|
436
|
+
// Add the lesser group.
|
437
|
+
groups[k] = g;
|
438
|
+
|
439
|
+
// Add any selected records belonging to the added group, while
|
440
|
+
// advancing the new key and populating the associated group index.
|
441
|
+
while (!(x1 > x)) {
|
442
|
+
groupIndex[j = newIndex[i1] + n0] = k;
|
443
|
+
if (!(filters[j] & zero)) g.value = add(g.value, data[j]);
|
444
|
+
if (++i1 >= n1) break;
|
445
|
+
x1 = key(newValues[i1]);
|
446
|
+
}
|
447
|
+
|
448
|
+
groupIncrement();
|
449
|
+
}
|
450
|
+
|
451
|
+
// Add any remaining old groups that were greater than all new keys.
|
452
|
+
// No incremental reduce is needed; these groups have no new records.
|
453
|
+
// Also record the new index of the old group.
|
454
|
+
while (i0 < k0) {
|
455
|
+
groups[reIndex[i0] = k] = oldGroups[i0++];
|
456
|
+
groupIncrement();
|
457
|
+
}
|
458
|
+
|
459
|
+
// If we added any new groups before any old groups,
|
460
|
+
// update the group index of all the old records.
|
461
|
+
if (k > i0) for (i0 = 0; i0 < n0; ++i0) {
|
462
|
+
groupIndex[i0] = reIndex[groupIndex[i0]];
|
463
|
+
}
|
464
|
+
|
465
|
+
// Modify the update and reset behavior based on the cardinality.
|
466
|
+
// If the cardinality is less than or equal to one, then the groupIndex
|
467
|
+
// is not needed. If the cardinality is zero, then there are no records
|
468
|
+
// and therefore no groups to update or reset. Note that we also must
|
469
|
+
// change the registered listener to point to the new method.
|
470
|
+
j = filterListeners.indexOf(update);
|
471
|
+
if (k > 1) {
|
472
|
+
update = updateMany;
|
473
|
+
reset = resetMany;
|
474
|
+
} else {
|
475
|
+
if (!k && groupAll) {
|
476
|
+
k = 1;
|
477
|
+
groups = [{key: null, value: initial()}];
|
478
|
+
}
|
479
|
+
if (k === 1) {
|
480
|
+
update = updateOne;
|
481
|
+
reset = resetOne;
|
482
|
+
} else {
|
483
|
+
update = crossfilter_null;
|
484
|
+
reset = crossfilter_null;
|
485
|
+
}
|
486
|
+
groupIndex = null;
|
487
|
+
}
|
488
|
+
filterListeners[j] = update;
|
489
|
+
|
490
|
+
// Count the number of added groups,
|
491
|
+
// and widen the group index as needed.
|
492
|
+
function groupIncrement() {
|
493
|
+
if (++k === groupCapacity) {
|
494
|
+
reIndex = crossfilter_arrayWiden(reIndex, groupWidth <<= 1);
|
495
|
+
groupIndex = crossfilter_arrayWiden(groupIndex, groupWidth);
|
496
|
+
groupCapacity = crossfilter_capacity(groupWidth);
|
497
|
+
}
|
498
|
+
}
|
499
|
+
}
|
500
|
+
|
501
|
+
function removeData() {
|
502
|
+
if (k > 1) {
|
503
|
+
var oldK = k,
|
504
|
+
oldGroups = groups,
|
505
|
+
seenGroups = crossfilter_index(oldK, oldK);
|
506
|
+
|
507
|
+
// Filter out non-matches by copying matching group index entries to
|
508
|
+
// the beginning of the array.
|
509
|
+
for (var i = 0, j = 0; i < n; ++i) {
|
510
|
+
if (filters[i]) {
|
511
|
+
seenGroups[groupIndex[j] = groupIndex[i]] = 1;
|
512
|
+
++j;
|
513
|
+
}
|
514
|
+
}
|
515
|
+
|
516
|
+
// Reassemble groups including only those groups that were referred
|
517
|
+
// to by matching group index entries. Note the new group index in
|
518
|
+
// seenGroups.
|
519
|
+
groups = [], k = 0;
|
520
|
+
for (i = 0; i < oldK; ++i) {
|
521
|
+
if (seenGroups[i]) {
|
522
|
+
seenGroups[i] = k++;
|
523
|
+
groups.push(oldGroups[i]);
|
524
|
+
}
|
525
|
+
}
|
526
|
+
|
527
|
+
if (k > 1) {
|
528
|
+
// Reindex the group index using seenGroups to find the new index.
|
529
|
+
for (var i = 0; i < j; ++i) groupIndex[i] = seenGroups[groupIndex[i]];
|
530
|
+
} else {
|
531
|
+
groupIndex = null;
|
532
|
+
}
|
533
|
+
filterListeners[filterListeners.indexOf(update)] = k > 1
|
534
|
+
? (reset = resetMany, update = updateMany)
|
535
|
+
: k === 1 ? (reset = resetOne, update = updateOne)
|
536
|
+
: reset = update = crossfilter_null;
|
537
|
+
} else if (k === 1) {
|
538
|
+
if (groupAll) return;
|
539
|
+
for (var i = 0; i < n; ++i) if (filters[i]) return;
|
540
|
+
groups = [], k = 0;
|
541
|
+
filterListeners[filterListeners.indexOf(update)] =
|
542
|
+
update = reset = crossfilter_null;
|
543
|
+
}
|
544
|
+
}
|
545
|
+
|
546
|
+
// Reduces the specified selected or deselected records.
|
547
|
+
// This function is only used when the cardinality is greater than 1.
|
548
|
+
function updateMany(filterOne, added, removed) {
|
549
|
+
if (filterOne === one || resetNeeded) return;
|
550
|
+
|
551
|
+
var i,
|
552
|
+
k,
|
553
|
+
n,
|
554
|
+
g;
|
555
|
+
|
556
|
+
// Add the added values.
|
557
|
+
for (i = 0, n = added.length; i < n; ++i) {
|
558
|
+
if (!(filters[k = added[i]] & zero)) {
|
559
|
+
g = groups[groupIndex[k]];
|
560
|
+
g.value = reduceAdd(g.value, data[k]);
|
561
|
+
}
|
562
|
+
}
|
563
|
+
|
564
|
+
// Remove the removed values.
|
565
|
+
for (i = 0, n = removed.length; i < n; ++i) {
|
566
|
+
if ((filters[k = removed[i]] & zero) === filterOne) {
|
567
|
+
g = groups[groupIndex[k]];
|
568
|
+
g.value = reduceRemove(g.value, data[k]);
|
569
|
+
}
|
570
|
+
}
|
571
|
+
}
|
572
|
+
|
573
|
+
// Reduces the specified selected or deselected records.
|
574
|
+
// This function is only used when the cardinality is 1.
|
575
|
+
function updateOne(filterOne, added, removed) {
|
576
|
+
if (filterOne === one || resetNeeded) return;
|
577
|
+
|
578
|
+
var i,
|
579
|
+
k,
|
580
|
+
n,
|
581
|
+
g = groups[0];
|
582
|
+
|
583
|
+
// Add the added values.
|
584
|
+
for (i = 0, n = added.length; i < n; ++i) {
|
585
|
+
if (!(filters[k = added[i]] & zero)) {
|
586
|
+
g.value = reduceAdd(g.value, data[k]);
|
587
|
+
}
|
588
|
+
}
|
589
|
+
|
590
|
+
// Remove the removed values.
|
591
|
+
for (i = 0, n = removed.length; i < n; ++i) {
|
592
|
+
if ((filters[k = removed[i]] & zero) === filterOne) {
|
593
|
+
g.value = reduceRemove(g.value, data[k]);
|
594
|
+
}
|
595
|
+
}
|
596
|
+
}
|
597
|
+
|
598
|
+
// Recomputes the group reduce values from scratch.
|
599
|
+
// This function is only used when the cardinality is greater than 1.
|
600
|
+
function resetMany() {
|
601
|
+
var i,
|
602
|
+
g;
|
603
|
+
|
604
|
+
// Reset all group values.
|
605
|
+
for (i = 0; i < k; ++i) {
|
606
|
+
groups[i].value = reduceInitial();
|
607
|
+
}
|
608
|
+
|
609
|
+
// Add any selected records.
|
610
|
+
for (i = 0; i < n; ++i) {
|
611
|
+
if (!(filters[i] & zero)) {
|
612
|
+
g = groups[groupIndex[i]];
|
613
|
+
g.value = reduceAdd(g.value, data[i]);
|
614
|
+
}
|
615
|
+
}
|
616
|
+
}
|
617
|
+
|
618
|
+
// Recomputes the group reduce values from scratch.
|
619
|
+
// This function is only used when the cardinality is 1.
|
620
|
+
function resetOne() {
|
621
|
+
var i,
|
622
|
+
g = groups[0];
|
623
|
+
|
624
|
+
// Reset the singleton group values.
|
625
|
+
g.value = reduceInitial();
|
626
|
+
|
627
|
+
// Add any selected records.
|
628
|
+
for (i = 0; i < n; ++i) {
|
629
|
+
if (!(filters[i] & zero)) {
|
630
|
+
g.value = reduceAdd(g.value, data[i]);
|
631
|
+
}
|
632
|
+
}
|
633
|
+
}
|
634
|
+
|
635
|
+
// Returns the array of group values, in the dimension's natural order.
|
636
|
+
function all() {
|
637
|
+
if (resetNeeded) reset(), resetNeeded = false;
|
638
|
+
return groups;
|
639
|
+
}
|
640
|
+
|
641
|
+
// Returns a new array containing the top K group values, in reduce order.
|
642
|
+
function top(k) {
|
643
|
+
var top = select(all(), 0, groups.length, k);
|
644
|
+
return heap.sort(top, 0, top.length);
|
645
|
+
}
|
646
|
+
|
647
|
+
// Sets the reduce behavior for this group to use the specified functions.
|
648
|
+
// This method lazily recomputes the reduce values, waiting until needed.
|
649
|
+
function reduce(add, remove, initial) {
|
650
|
+
reduceAdd = add;
|
651
|
+
reduceRemove = remove;
|
652
|
+
reduceInitial = initial;
|
653
|
+
resetNeeded = true;
|
654
|
+
return group;
|
655
|
+
}
|
656
|
+
|
657
|
+
// A convenience method for reducing by count.
|
658
|
+
function reduceCount() {
|
659
|
+
return reduce(crossfilter_reduceIncrement, crossfilter_reduceDecrement, crossfilter_zero);
|
660
|
+
}
|
661
|
+
|
662
|
+
// A convenience method for reducing by sum(value).
|
663
|
+
function reduceSum(value) {
|
664
|
+
return reduce(crossfilter_reduceAdd(value), crossfilter_reduceSubtract(value), crossfilter_zero);
|
665
|
+
}
|
666
|
+
|
667
|
+
// Sets the reduce order, using the specified accessor.
|
668
|
+
function order(value) {
|
669
|
+
select = heapselect_by(valueOf);
|
670
|
+
heap = heap_by(valueOf);
|
671
|
+
function valueOf(d) { return value(d.value); }
|
672
|
+
return group;
|
673
|
+
}
|
674
|
+
|
675
|
+
// A convenience method for natural ordering by reduce value.
|
676
|
+
function orderNatural() {
|
677
|
+
return order(crossfilter_identity);
|
678
|
+
}
|
679
|
+
|
680
|
+
// Returns the cardinality of this group, irrespective of any filters.
|
681
|
+
function size() {
|
682
|
+
return k;
|
683
|
+
}
|
684
|
+
|
685
|
+
// Removes this group and associated event listeners.
|
686
|
+
function dispose() {
|
687
|
+
var i = filterListeners.indexOf(update);
|
688
|
+
if (i >= 0) filterListeners.splice(i, 1);
|
689
|
+
i = indexListeners.indexOf(add);
|
690
|
+
if (i >= 0) indexListeners.splice(i, 1);
|
691
|
+
i = removeDataListeners.indexOf(removeData);
|
692
|
+
if (i >= 0) removeDataListeners.splice(i, 1);
|
693
|
+
return group;
|
694
|
+
}
|
695
|
+
|
696
|
+
return reduceCount().orderNatural();
|
697
|
+
}
|
698
|
+
|
699
|
+
// A convenience function for generating a singleton group.
|
700
|
+
function groupAll() {
|
701
|
+
var g = group(crossfilter_null), all = g.all;
|
702
|
+
delete g.all;
|
703
|
+
delete g.top;
|
704
|
+
delete g.order;
|
705
|
+
delete g.orderNatural;
|
706
|
+
delete g.size;
|
707
|
+
g.value = function() { return all()[0].value; };
|
708
|
+
return g;
|
709
|
+
}
|
710
|
+
|
711
|
+
// Removes this dimension and associated groups and event listeners.
|
712
|
+
function dispose() {
|
713
|
+
dimensionGroups.forEach(function(group) { group.dispose(); });
|
714
|
+
var i = dataListeners.indexOf(preAdd);
|
715
|
+
if (i >= 0) dataListeners.splice(i, 1);
|
716
|
+
i = dataListeners.indexOf(postAdd);
|
717
|
+
if (i >= 0) dataListeners.splice(i, 1);
|
718
|
+
i = removeDataListeners.indexOf(removeData);
|
719
|
+
if (i >= 0) removeDataListeners.splice(i, 1);
|
720
|
+
m &= zero;
|
721
|
+
return filterAll();
|
722
|
+
}
|
723
|
+
|
724
|
+
return dimension;
|
725
|
+
}
|
726
|
+
|
727
|
+
// A convenience method for groupAll on a dummy dimension.
|
728
|
+
// This implementation can be optimized since it always has cardinality 1.
|
729
|
+
function groupAll() {
|
730
|
+
var group = {
|
731
|
+
reduce: reduce,
|
732
|
+
reduceCount: reduceCount,
|
733
|
+
reduceSum: reduceSum,
|
734
|
+
value: value,
|
735
|
+
dispose: dispose,
|
736
|
+
remove: dispose // for backwards-compatibility
|
737
|
+
};
|
738
|
+
|
739
|
+
var reduceValue,
|
740
|
+
reduceAdd,
|
741
|
+
reduceRemove,
|
742
|
+
reduceInitial,
|
743
|
+
resetNeeded = true;
|
744
|
+
|
745
|
+
// The group listens to the crossfilter for when any dimension changes, so
|
746
|
+
// that it can update the reduce value. It must also listen to the parent
|
747
|
+
// dimension for when data is added.
|
748
|
+
filterListeners.push(update);
|
749
|
+
dataListeners.push(add);
|
750
|
+
|
751
|
+
// For consistency; actually a no-op since resetNeeded is true.
|
752
|
+
add(data, 0, n);
|
753
|
+
|
754
|
+
// Incorporates the specified new values into this group.
|
755
|
+
function add(newData, n0) {
|
756
|
+
var i;
|
757
|
+
|
758
|
+
if (resetNeeded) return;
|
759
|
+
|
760
|
+
// Add the added values.
|
761
|
+
for (i = n0; i < n; ++i) {
|
762
|
+
if (!filters[i]) {
|
763
|
+
reduceValue = reduceAdd(reduceValue, data[i]);
|
764
|
+
}
|
765
|
+
}
|
766
|
+
}
|
767
|
+
|
768
|
+
// Reduces the specified selected or deselected records.
|
769
|
+
function update(filterOne, added, removed) {
|
770
|
+
var i,
|
771
|
+
k,
|
772
|
+
n;
|
773
|
+
|
774
|
+
if (resetNeeded) return;
|
775
|
+
|
776
|
+
// Add the added values.
|
777
|
+
for (i = 0, n = added.length; i < n; ++i) {
|
778
|
+
if (!filters[k = added[i]]) {
|
779
|
+
reduceValue = reduceAdd(reduceValue, data[k]);
|
780
|
+
}
|
781
|
+
}
|
782
|
+
|
783
|
+
// Remove the removed values.
|
784
|
+
for (i = 0, n = removed.length; i < n; ++i) {
|
785
|
+
if (filters[k = removed[i]] === filterOne) {
|
786
|
+
reduceValue = reduceRemove(reduceValue, data[k]);
|
787
|
+
}
|
788
|
+
}
|
789
|
+
}
|
790
|
+
|
791
|
+
// Recomputes the group reduce value from scratch.
|
792
|
+
function reset() {
|
793
|
+
var i;
|
794
|
+
|
795
|
+
reduceValue = reduceInitial();
|
796
|
+
|
797
|
+
for (i = 0; i < n; ++i) {
|
798
|
+
if (!filters[i]) {
|
799
|
+
reduceValue = reduceAdd(reduceValue, data[i]);
|
800
|
+
}
|
801
|
+
}
|
802
|
+
}
|
803
|
+
|
804
|
+
// Sets the reduce behavior for this group to use the specified functions.
|
805
|
+
// This method lazily recomputes the reduce value, waiting until needed.
|
806
|
+
function reduce(add, remove, initial) {
|
807
|
+
reduceAdd = add;
|
808
|
+
reduceRemove = remove;
|
809
|
+
reduceInitial = initial;
|
810
|
+
resetNeeded = true;
|
811
|
+
return group;
|
812
|
+
}
|
813
|
+
|
814
|
+
// A convenience method for reducing by count.
|
815
|
+
function reduceCount() {
|
816
|
+
return reduce(crossfilter_reduceIncrement, crossfilter_reduceDecrement, crossfilter_zero);
|
817
|
+
}
|
818
|
+
|
819
|
+
// A convenience method for reducing by sum(value).
|
820
|
+
function reduceSum(value) {
|
821
|
+
return reduce(crossfilter_reduceAdd(value), crossfilter_reduceSubtract(value), crossfilter_zero);
|
822
|
+
}
|
823
|
+
|
824
|
+
// Returns the computed reduce value.
|
825
|
+
function value() {
|
826
|
+
if (resetNeeded) reset(), resetNeeded = false;
|
827
|
+
return reduceValue;
|
828
|
+
}
|
829
|
+
|
830
|
+
// Removes this group and associated event listeners.
|
831
|
+
function dispose() {
|
832
|
+
var i = filterListeners.indexOf(update);
|
833
|
+
if (i >= 0) filterListeners.splice(i);
|
834
|
+
i = dataListeners.indexOf(add);
|
835
|
+
if (i >= 0) dataListeners.splice(i);
|
836
|
+
return group;
|
837
|
+
}
|
838
|
+
|
839
|
+
return reduceCount();
|
840
|
+
}
|
841
|
+
|
842
|
+
// Returns the number of records in this crossfilter, irrespective of any filters.
|
843
|
+
function size() {
|
844
|
+
return n;
|
845
|
+
}
|
846
|
+
|
847
|
+
return arguments.length
|
848
|
+
? add(arguments[0])
|
849
|
+
: crossfilter;
|
850
|
+
}
|
851
|
+
|
852
|
+
// Returns an array of size n, big enough to store ids up to m.
|
853
|
+
function crossfilter_index(n, m) {
|
854
|
+
return (m < 0x101
|
855
|
+
? crossfilter_array8 : m < 0x10001
|
856
|
+
? crossfilter_array16
|
857
|
+
: crossfilter_array32)(n);
|
858
|
+
}
|
859
|
+
|
860
|
+
// Constructs a new array of size n, with sequential values from 0 to n - 1.
|
861
|
+
function crossfilter_range(n) {
|
862
|
+
var range = crossfilter_index(n, n);
|
863
|
+
for (var i = -1; ++i < n;) range[i] = i;
|
864
|
+
return range;
|
865
|
+
}
|
866
|
+
|
867
|
+
function crossfilter_capacity(w) {
|
868
|
+
return w === 8
|
869
|
+
? 0x100 : w === 16
|
870
|
+
? 0x10000
|
871
|
+
: 0x100000000;
|
872
|
+
}
|