For updates follow @implydata on Twitter.
- Transition to better build system
- Support Druid
regexFiltered
andlistFiltered
dim specs
- Respect PlyQL column ordering by generating extra select statements
- SegmentMetadata passes context also
- Upgraded to latest PEG.js
- Fixed bug in OR action
- Support case insensitive RefExpression
- PlyQL
SHOW
query rewriting is case insensitive - Moved methods out of
plywood
and intoimmutable-class
:plywood.find
toSimpleArray.find
plywood.findIndex
toSimpleArray.findIndex
plywood.findByName
toNamedArray.findByName
plywood.findIndexByName
toNamedArray.findIndexByName
plywood.overrideByName
toNamedArray.overrideByName
plywood.overridesByName
toNamedArray.overridesByName
- Fixes in
AttributeInfo#valueOf
- Added
AttributeInfo#change
- Transitioned to newer immutable tester
- Renamed
customExtractionFns
tocustomTransforms
- Using lowercase
alphanumeric
indimensionOrder
- Renamed
customAction
tocustomAggregationAction
- Changed to build to use external modules
- Moved methods out of
plywood.helper
, specifically:helper.parseJSON
toDataset.parseJSON
helper.expressionLookupFromJS
toExpression.expressionLookupFromJS
helper.expressionLookupToJS
toExpression.expressionLookupToJS
helper.find
toplywood.find
helper.findIndex
toplywood.findIndex
helper.findByName
toplywood.findByName
helper.findIndexByName
toplywood.findIndexByName
helper.overrideByName
toplywood.overrideByName
helper.overridesByName
toplywood.overridesByName
helper.shallowCopy
toplywood.shallowCopy
helper.deduplicateSort
toplywood.deduplicateSort
helper.mapLookup
toplywood.mapLookup
helper.emptyLookup
toplywood.emptyLookup
helper.nonEmptyLookup
toplywood.nonEmptyLookup
helper.verboseRequesterFactory
toplywood.verboseRequesterFactory
helper.retryRequesterFactory
toplywood.retryRequesterFactory
helper.concurrentLimitRequesterFactory
toplywood.concurrentLimitRequesterFactory
helper.promiseWhile
toplywood.promiseWhile
- Moved
simpleLocator
out - Removed
retryRequester
which was deprecated
- Expressions can parse pure JSON also
- Updated file notice headers
- Updated dependencies
- Added
STRING_RANGE
type - Core: Support for
.indexOf()
,.transformCase()
action - PlyQL: Support for
LOCATE
,UCASE
,LCASE
- No JS globals in JS functions
- Core: Support for
.cast()
action - PlyQL: Support for
CAST
,FROM_UNIXTIME
,UNIX_TIMESTAMP
actions - DruidExternal: fix for
.cast('number').numberBucket()
- Cleaned up npm package and updated dependencies
- Externals take account of
requester
for comparisons - Misc cleanup
- Made
Range
and abstract class - PlyQL: Fixed
AS
for tables, also"AS"
keyword is now optional (like in MySQL) - Added
.cardinality()
action - Added
CARDINALITY
to PlyQL
- Takes advantage of most features in Druid 0.9.1
- Removed untested RangeAttributeInfo with helpful error message to use numbers instead
- DruidExternal: added
-legacy-lookups
version flag - Trying to secondary filter on
__time
in Druid <= 0.9.1 now throws an error (at planning stage) as it is impossible - Added
.length()
action - Added
LENGTH
,LEN
, andCHAR_LENGTH
to PlyQL
- DruidExternal: Segment metadata works on union dataSource
- Using abstract classes (forces dependency on TypeScript >= 1.6)
- Rename
dataSource
andtable
tosource
- Added
External.getExternalFor
- Fix bug where JS reserved words could not be used in aggregates
- Compute expression HEAD also
- PlyQL: From(sub query) works
- Native quantiles also work
- Added compare to ranges so they sort correctly
- DruidExternal: Fix bug where
$blah / 10
did not work in split - DruidExternal: Fix bug where
1 + $blah
did not cast to number - DruidExternal: Pure
.fallback()
now works - Removed some dead code
- DruidExternal: Ability to split on a secondary time dimension by
PT2H
e.t.c. - PlyQL:
SHOW FULL TABLES
rewrites correctly
- Druid Select query no longer bound to 10000 max limit and will use iterative strategy
- Numeric Dimensions can be aggregated
- Better simplification of
.is(TimeRange)
and.is(NumberRange)
- Removed some dead code
- Druid: Default to JavaScript filter for negative bounds in bound filter
- Druid Fixed number range behaviour in nested splits
- Add tests around negative numbers
- Added PostgresExternal
- Refactored common SQL External functionality into SQLExternal base class
- Fixed timezone bucketing in MySQL External
- Support countDistinct on Theta sketches
- Druid GroupBy will no longer receive arbitrary limit
- Made filters on non primary time dimensions work in DruidExternal
- Added basic tests for legacy Druid versions
timeFloor
andtimeBucket
actions make sure duration is floorable
helper.overrideByName
maintains original order- DruidExternal explicitly sends UTC timestamps
- Ability to define delegates in Externals
- selectAction now type checks and only allows defined attributes to be selected
DruidExternal.getSourceList
now returns the sources in a sorted order- Adding range extent
- New chronoshift fixes bug with flooring
PT12H
- Fixed parsing of
NULL
in set expressions - Added information function to PlyQL
- Allow PlyQL to support
SHOW SESSION VARIABLES WHERE ...
rewriting
- Fix distribution of
SUM(1) => COUNT()
- Added
DruidExternal.getVersion
- Fixed post computation tasks
- Added support for
USE
on PlyQL - PlyQL allows
NULL
in set literal e.g.{'a', 'b', NULL}
- PlyQL describe query now rewrites
- Fixed problem with DruidExternal having filter generating an OR instead of an AND for time ranges
- Fixed problem with filtering on multi-dimensional dimensions with a lookup
- Added
Dataset#findDatumByAttribute
- Fixed bug where flatten would fail on an empty nested dataset.
- Accidentally published again.
- Added
finalizer
option toDataset#toTabular
- Fixed quoting when exporting to CSV or TSV
- Fixed DruidExternal sometimes generating an invalid Druid query when doing a multi-dimensional split that includes time
- Unsuppress datasource when it is limited or selected
- Better show query support
- Made Dataset#apply and Dataset#select truly immutable
- Fix Druid introspection bug on JS ingestion aggregators
- Allow data-less PlyQL queries like
SELECT 1+1
- Default PlyQL
AS
text now matches SQL implementation.
- Removed duplicate entry that killed in strict mode.
- Added ability to do ISO8601 in PlyQL time literals
- Ability to sort in select queries
- Fix
timeFloor
now work with limit
- Fixed bug where select queries including multi value dimensions would sometimes error out in DruidExternal
- Changed
helper.overrideByName
tohelper.overridesByName
,helper.overrideByName
now does a single override - Added
finalLineBreak
option toDataset#toTabular
,Dataset#toCSV
,Dataset#toTSV
(default to 'include' for tabular and 'suppress' for toCSV and toTSV) Dataset
now always has introspected dimensions- Support for zero Intervals in PlyQL
- Support for
DATE_FORMAT
in PlyQL as used in MySQL forTIME_FLOOR
- Dramatically reduced PlyQL parser size
- Added
YEAR
as a possibletimePart
value - Added
CURDATE
,PI
,YEAR
,MONTH
,WEEK_OF_YEAR
,DAY_OF_YEAR
,DAY_OF_MONTH
,DAY_OF_WEEK
,HOUR
,MINUTE
,SECOND
,DATE
,CURRENT_TIMESTAMP
,LOCALTIME
,LOCALTIMESTAMP
,UTC_TIMESTAMP
,SYSDATE
,CURRENT_DATE
,UTC_DATE
,DAY_OF_YEAR
,DOY
,DOW
,DAYOFMONTH
,DAY
,WEEKOFYEAR
, andWEEK
to PlyQL - Fixed bug where
DAY_OF_YEAR
,DAY_OF_MONTH
, andDAY_OF_WEEK
was zero indexed - Added support for
timeFloor
split in Druid external
- Added SET expressions to PlyQL
{'A', 'B', 'C'}
- PlyQL can now parse IN with arbitrary expression on right hand side
- Fix .match() not working on SET/STRING
- Moved date parsing to Chronoshift and updated to latest Chronoshift
- Parser can now configure a timezone within which it will parse 'local' date strings
- Optimized post processing by not calculating the filter for final splits
- Added ability to define the timezone through the environment
- Timezone always defaults to UTC
- Date parsing no longer done by PlyQL parser
- Added tests for legacy Druid versions
- Added convenient filtered aggregators to PlyQL like:
SUM(added WHERE cityName = 'San Francisco')
- Fixed PlyQL incorrectly parsing
SELECT COUNT(page)
- Fixed null handling in extractionFns for Druid 0.8.3
- Fixed overlap on
[null]
- Enabled all Druid 0.9.0 tests (testing using Druid 0.9.0-iap1)
- DruidExternal now supports lookups on SET/STRING dimensions
- Fixed bug where DruidExternal did not work with filtered cardinality aggregator
- New immutable class methods
- Allow derivedAttributes to be specified in ExternalJS
- derivedAttributes can now be used in filters and splits
- Fixed bugs in type inference
- Fixed
.substr()
getJS to work correctly with nulls
- Added (experimental) rollup mode to all Externals, only implemented in DruidExternal
- Derived attributes now work for DruidExternal
- DruidExternal now supports boolean ref filters like:
$wiki.filter($isAnonymous)
- added
getSourceList
to externals - Fixed bug in expression simplification where
$s.contains('A') and $x.is('B') => false
- Respect unsplitable measures in DruidExternal
- DruidExternal timeAttribute now defaults to
__time
- Moved find* methods into helper
- Externals can re-introspect
- Fixed Druid 'select' failing on time interval outside of Druid cluster
- Using Imply Analytics Platform 1.1.1 docker image for Druid tests
- Derived columns in Druid select will now trigger if version is
/^0.9.0-iap/
version
is now a parameter on all External- In Druid external
druidVersion
was renamed toversion
- Fixed MySQL translation of .is() action to use null safe equals (<=>)
- Fixed MySQL translation of .contains()
- Added
<=>
to PlyQL - Druid external now introspects version and does not make broken query
- Support for new features in Druid 0.9.0
- Fix for Druid "bound" / "between" filter
- Much faster PlyQL parsing
- The FROM clause in PlyQL now accepts relaxed table names allowing for:
SELECT * FROM my-table*is:the/best_table
- Set
skipEmptyBuckets: "true"
in timeseries queries to get the Plywood expected behaviour
- Added
.select('attr1', 'attr2', 'attr3')
action allowingSELECT attr1, attr2, attr3 FROM ...
to be expressed in PlyQL - Added support for
.quantile(p)
aggregator in DruidExternal (using approximateHistograms) - Better support for filtered aggregates in DruidExternal
- Custom type guards for all the modal classes
- New 'value' mode in externals.
$wikipedia.sum($added)
is now computable. - More relaxed date literal parsing in PlyQL
- Fix native
overlap
calculation
- Support Date and Timestamp literal as described here: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html
- Upgraded to TypeScript 1.8
- SELECT queries in Druid are now mindful of the attributes and inflate values correctly.
- All cross functional tests now running with rollup.
- Temporary columns are no longer being returned by Druid.
- Fixed issue with
.in(...).not()
in the DruidExternal
overlap
now allows STRING arguments, simplifies toin
- DruidExternal will use topNs for defined small splits even when there is no limit set (like
BOOLEAN
,timeBucket(HOUR_OF_DAY)
) - Fixed bug for MySQLExternal not dealing well with BOOLEAN splits
- Added
overlap
action - Added multi-database query test / example
- Fixed sorting direction when sorting on a split in Druid
- Ability to do filtered aggregations on SQL drivers
== NULL
works correctly with SQL drivers
- MySQL functional tests can now run in docker
- Better checks for expression types in aggregates
- Better handling for filtered attributes now allows filtered attributes on
countDistinct
andcustom
- Fixed sorting for numeric columns in DruidExternal
- Add
absolute
,power
,sqrt
,fallback
action - Corresponding
ABS
,POW/POWER
,EXP
,SQRT
, andIFNULL/FALLBACK
to PlyQL - Fixed type checking in
InAction
- Fixed
match
on nulls to returnnull
- Support
SELECT DISTINCT
syntax in PlyQL
- Add
timeRange
action (TIME_RANGE
in PlyQL) - not supported by DruidExternal yet
- Add
timeFloor
action (TIME_FLOOR
in PlyQL) - not supported by DruidExternal yet - Rename unused
offsetTime
action totimeShift
(TIME_SHIFT
in PlyQL) and addstep
parameter - not supported by DruidExternal yet - Fixed how
concat
works on nulls to return null - Added
.isnt
and.negate
to expression parsing grammar (they were mistakenly excluded) - Added
MATCH
function to PlyQL - Timezone parameter is now optional in all the
time*
functions in Plywood and PlyQL - Added
NOW()
to PlyQL - Better DruidExternal column introspection error detection
- Allow parsing of
DESCRIBE
verb for PlyQL
- Changed
avoidSegmentMetadata
tointrospectionStrategy: 'datasource-get'
defaults to'segment-metadata-fallback'
- Brand new introspection code for
druidExternal
no moreuseSegmentMetadata
flag instead there is aavoidSegmentMetadata
flag - Fix
.lookup()
stringification - PlyQL comments are treated like they are in MySQL:
--
needs to be followed by a space,#
starts a comment, and/* ... */
inline and multiline comments are supported
- Removing d3 dependency and minimizing code size
- Fixed interval conversion to add a millisecond and not a second
- Allow for filtering on exact date in DruidExternal
- Fixed missing error message when invalid interval is given
- In DruidExternal a time attribute will no longer collide with an existing attribute
- Added ability to write
$('time').in('2015-03-03Z', '2015-10-10Z')
- Added ability to parse
$time.in('2015-03-03Z', '2015-10-10Z')
- Fixed bug in
$number.in(1, 2)
syntax
- Native
timePart
now works
- Updated Druid External to use
doubleMin
anddoubleMax
.
- Fixed bug in sorting with
null
in the list - Updated to latest typescript (1.7.5)
- Added the
.lookup('my_lookup')
expression that translates to a query time lookup in Druid - Added the corresponding
LOOKUP
function to PlyQL - Fixed split simplification
- In PlyQL
COUNT(blah)
returns the count where blah is notnull
in accordance with SQL standard. - Added query IDs to
verboseRequester
- Flashed out PlyQL docs
- Fixed bug in parameter parsing with leading numbers
- Added
.extract()
function - Added
EXTRACT
function to PlyQL - Fixed bug in PlyQL where a space before the trailing ) would cause a parse error
- More docs :-)
- DruidExternal supports extractionFn filters such as
.filter($x.substr(0, 1) === 'D')
- added
druidVersion
to DruidExternal to support feature differentiation - added native Druid substring filter support or druidVersion >= 0.9.0
- Added some docs
- Created plywood-proxy
- PlyQL
LIKE
now works to SQL spec (addedESCAPE
clause) - Added
CONTAINS
clause to PlyQL - Added
REGEXP
clause to PlyQL
- Added
firstAction
andlastAction
to all expressions popAction
no longer takes an optional action type (warning added)
- DruidExternal now works with upper/lower time bound only
- Fixed string handling in parser arguments
- Added
contains
to expression parsing grammar
- Added
timePart
to MySQL dialect - Added time part option for
MONTH_OF_YEAR
- Fixed bug to ensure
Dataset#flatten
works with empty datasets
- Added
Set#toggle
- Added simplification rule for
.sort(X).filter(Y) => .filter(Y).sort(X)
- Added simplification rule for
.sort(X).sort(X) => .sort(X)
- Added simplification rule for
.not().not() => nothing
- Added
External#updateAttribute
- Fixed
Dataset#average
- Latest Chronoshift allows for PT15M bucketing, e.t.c.
- Better apply, filter, limit sorting
- Multi-dim group dy uses granularity when it can.
- Fixed bug in
Set#add
- added tonic example: https://tonicdev.com/npm/plywood
- Refactored DruidExternal
- DruidExternal now supports multi-dim splits
- Timezone (2nd argument) in
timeBucket
is now optional, defaults to UTC - Fixed native
dataset.max
- Better docs
- Context is now added passed along in a DruidExternal
- Added
Expression.concat
- Added
CONCAT
to the PlyQL parser
- Paving the road for multi-dimensional splits
.split({ Page: '$page', User: '$user' })
- Fixed problems with SELECT queries
- Allow for SQL parsing of
SELECT *
- Fix support for
sort
andlimit
in SELECT queries - Better escaping in MySQL driver
- Changed JS fallbacks in DruidExternal to use native code generators and removed some null bugs.
- Added more rules to the SQL parser:
IS
,LIKE
, and awareness ofUPDATE
,SET
, e.t.c
- Changed the return type of
Expression.parseSQL
to return and object with the keysverb
,expression
, andtable
Expression.parseSQL(blah)
==>Expression.parseSQL(blah).expression
- In PlyQL changed the meaning of
GROUP BY <number>
to be a reference to a column (just like in MySQL and Postgres)
- Added support for case sensitive (
normal
) / case insensitive (ignoreCase
) contains. - Improved concat action support in Druid
- Chain expression
.toJS()
now returnsaction
instead ofactions
array if there is only one action. Both are still valid to parse. - Misc bug fixes
- Added SortAction DESCENDING, ASCENDING, toggleDirection
- DruidExternal guards against duplicate aggs and postAggs
- Changed attribute definitions to be an array instead of an object and added deprecation message.