-
Notifications
You must be signed in to change notification settings - Fork 590
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ENH/TST/BUG: Add lowest common denominator testing, fill out backend operations #1256
Conversation
ibis/pandas/api.py
Outdated
| from ibis.pandas.client import PandasClient | ||
| from ibis.pandas.decimal import execute_node # noqa: F401 | ||
| from ibis.pandas.execution import execute # noqa: F401 | ||
|
|
||
|
|
||
| __api__ = 'connect', 'execute' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be __all__
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this need to be a list?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It can be, but I'm going to leave it as a tuple (after renaming to __all__).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice to see all this stuff, and the backend fixtures
ibis/expr/operations.py
Outdated
| all_exprs = [base] + cases + results + list(filter( | ||
| lambda expr: expr is not None, | ||
| [default] | ||
| )) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a lot of fu for conditionally appending an element to a list =) but all one expression
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah this needs to be cleaned up :)
ibis/pandas/api.py
Outdated
| from ibis.pandas.client import PandasClient | ||
| from ibis.pandas.decimal import execute_node # noqa: F401 | ||
| from ibis.pandas.execution import execute # noqa: F401 | ||
|
|
||
|
|
||
| __api__ = 'connect', 'execute' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this need to be a list?
| ), | ||
| 1, | ||
| length - f.length(arg) | ||
| ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
omg :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll remove this in a follow up patch.
ibis/bigquery/compiler.py
Outdated
|
|
||
|
|
||
| def _translate_pattern(translator, pattern): | ||
| return 'r' * isinstance(pattern.op(), ir.Literal) + translator.translate( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice idiom!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
c79895b
to
a0bbb2d
Compare
ibis/expr/operations.py
Outdated
| class StringConcat(ValueOp): | ||
|
|
||
| input_type = rules.varargs(rules.string) | ||
| output_type = _concat_upcast |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
_concat_upcast seems like an equivalent of rules.shape_like_args(self.args, 'string')
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let me give that a try.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| - "python testing\\datamgr.py download" | ||
| - "python testing\\datamgr.py sqlite" | ||
| - "python testing\\datamgr.py postgres" | ||
| - "pytest --tb=short -m \"not impala and not hdfs\" ibis" | ||
|
|
||
| - "pytest --tb=short -m \"not backend and not clickhouse and not impala and not hdfs and not bigquery\" -rs ibis" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Eventually we want to enable everything that isn't docker based and run those backend tests on appveyor.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A lot actually, so please be gentle with the modifications :)
| @@ -18,6 +18,7 @@ dependencies: | |||
| - pytables | |||
| - pathlib2 | |||
| - pyarrow>=0.6.0 | |||
| - regex | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note that I added this library to allow POSIX character classes in regexen in the pandas backend. This made testing every backend with the same regex much easier.
| @@ -89,6 +89,7 @@ class BigQueryClient(SQLClient): | |||
| sync_query = BigQuery | |||
| database_class = BigQueryDatabase | |||
| proxy_class = BigQueryAPIProxy | |||
| dialect = comp.BigQueryDialect | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The Dialect abstraction was introduced to hide some of the details of translation. Right now it doesn't do much except provide a translator property.
I expect to follow up with some patches that implement a generic quote method and add some additional properties that give information about the specifics of the backend.
ibis/bigquery/compiler.py
Outdated
|
|
||
|
|
||
| def _translate_pattern(translator, pattern): | ||
| return 'r' * isinstance(pattern.op(), ir.Literal) + translator.translate( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
| @@ -1,6 +1,9 @@ | |||
| import ibis.expr.datatypes as dt | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are no backwards compatible changes in this module, only additional functionality was added.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cc @tsdlovell
| @@ -74,6 +74,8 @@ class PandasTable(ops.DatabaseTable): | |||
|
|
|||
| class PandasClient(client.Client): | |||
|
|
|||
| dialect = None # defined in ibis.pandas.api | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I define in the API so that we can pickup the implemented operations. There's a better way to do this. I'll do this in a follow up patch.
| return PandasDatabase(name, self) | ||
|
|
||
|
|
||
| class PandasDatabase(client.Database): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll add tests for this in a follow up patch.
|
|
||
|
|
||
| @compiles(array_search) | ||
| def postgresql_array_search(element, compiler, **kw): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Slightly less cryptic hack for finding an element in a postgres array.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yikes, didn't see this before
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Later versions of postgres have a function to do this (I think starting in 9.5 or 9.6), and there isn't really a way to get the client or server version without executing a query so I wrote this to work on all versions.
We could can this monster by not supporting older versions of postgres, but I don't think this one function is really enough reason to abandon all older versions of postgres.
We should probably just follow whatever the postgres people do regarding supporting particular versions. I think 9.3 is the oldest version they support ATM.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
BTW I've introduced a client.version property for each backend in the upcoming PR, it's alchemy dialect.server_version_info in case of postgres which if queried once per connection.
| @@ -48,6 +49,36 @@ def udaf(f): | |||
| return f | |||
|
|
|||
|
|
|||
| @udf | |||
| def _ibis_sqlite_reverse(string): | |||
| if string is not None: | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Follow up here is to wrap these in another function call that checks all arguments for NULL and if any are NULL then return a NULL, otherwise call the function. This will clean up some code a bit.
|
|
||
| def _lpad(t, expr): | ||
| arg, length, pad = map(t.translate, expr.op().args) | ||
| return _generic_pad(arg, length, pad) + arg |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These should really be just python UDFs using str.ljust/str.rjust.
|
@cpcloud I guess You should just ignore the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor comments, but gave this a pretty good read through. Maybe revise the PR title and description to address the very large scope of this change =)
ibis/bigquery/compiler.py
Outdated
|
|
||
|
|
||
| def _translate_pattern(translator, pattern): | ||
| return 'r' * isinstance(pattern.op(), ir.Literal) + translator.translate( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
May want a comment here explaining that this r is to prevent user-supplied regexen from getting mangled in subsequent string interpolations
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't for that, it's to indicate to bigquery that the string is a regex and to interpret single backslashes as double backslashes, similar to python's raw strings.
we might want to not have this prefix and if people want raw strings they can simply do it in python.
|
|
||
| def _literal(translator, expr): | ||
| try: | ||
| return impala_compiler._literal(translator, expr) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There may be a todo to factor as much of the Impala SQL compiler into a base SQL string (non-sqlalchemy) compiler at some point
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I think I have an issue about this. If we don't I'll create one.
| @@ -52,6 +56,7 @@ class ParquetTable(ops.DatabaseTable): | |||
|
|
|||
|
|
|||
| class ParquetClient(FileClient): | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Something doesn't quite feel right about the "Client" abstraction (or, applying the same concepts as databases) when it comes to files. May be worth revisiting at some point
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My feeling here was that a ParquetClient is a dictionary mapping table names to parquet files (which map to tables AFAIU, i.e., one table per file), which coincides nicely with database concepts. I'm not tied to that necessarily, but the abstraction does fit well within ibis.
| @@ -189,7 +189,11 @@ def __init__(self, cursor, con, impyla_con, database, | |||
| self.con.connection_pool_size += 1 | |||
|
|
|||
| def __del__(self): | |||
| self._close_cursor() | |||
| try: | |||
| self._close_cursor() | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I'm not sure what are the consequences to leaving dangling lots of HS2 sessions; many users are not conscientious enough to always shut down their session
ibis/pandas/api.py
Outdated
|
|
||
| class PandasExprTranslator(object): | ||
| _registry = frozenset(toolz.concat( | ||
| _flatten_subclass_tree(types[0]) for types in execute_node.funcs |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A code comment or two here might be helpful to explain this :)
| return expr | ||
|
|
||
| def database(self, name=None): | ||
| return PandasDatabase(name, self) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What would be the semantics of this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A database is a dictionary mapping table names to dataframes.
| ) | ||
| def execute_string_like(op, data, pattern, **kwargs): | ||
| return data.str.contains(pattern, regex=True) | ||
| def execute_string_split(op, data, delimiter, **kwargs): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On any operator with unused **kwargs, if it is non-empty, should it raise an exception?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, kwargs is always non-empty because we pass context around everywhere. All aggregations use the context argument. We'd have to filter out unused arguments using inspect before calling execute_node which seems like a lot of code and hassle for not much benefit.
I suppose one nice thing about doing that is that you wouldn't have to include **kwargs in every signature. When I wrote this I didn't think that would be a huge inconvenience.
| lambda elements, needle=needle, index=itertools.count(): ( | ||
| ibis.util.safe_index(elements, needle.iat[next(index)]) | ||
| ) | ||
| ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm having to squint real hard at this one. Could you add a small example explaining what haystack comes in as, and what pieces is after?
|
|
||
|
|
||
| @compiles(array_search) | ||
| def postgresql_array_search(element, compiler, **kw): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yikes, didn't see this before
|
merging on green |
|
Bombs away |
- [x] MySQL backend, including a couple of window operations if the server supports (resolves #1224) - [x] Interval implementations (resolves #1251) - [x] Temporal truncate implementations (resolves #1260) - [x] Deprecate timedelta API (resolves #1249) - [x] Clickhouse external tables (resolves #1164) - [x] Clickhouse table insert (resolves #1323) - [x] IsInf / IsNan implementations (partially resolves #1262) - [x] Client version property - [x] `dtype.to_pandas()`, `schema.to_pandas()` - [x] Csv reading improvements - [x] Numpy and Pandas datatype handling moved under pandas (except for [this](#12 92/files#diff-0b9f3a78e49f59ac30cc4ca44949b25fR1169) one) - Started to move tests cases under `all` (numeric, param) - Condensed backend test suite (I hope @cpcloud doesn't mind) - Minor test fixes, caused mostly by incorrect dtypes - Reduced duplicated code in alchemy backends | | Csv | Parquet | Pandas | Sqlite | MySQL | Postgres | Clickhouse | Impala | BigQuery | | --: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | Interval | X | X | X | | | X | X | X | | | IntegerToInterval | X | X | X | | | X | X | X | | | DateTruncate | X | X | X | X | X | X | X | X | | | IsInf / IsNan | X | X | X | | | X | X | X | | Author: Krisztián Szűcs <szucs.krisztian@gmail.com> Closes #1292 from kszucs/slave and squashes the following commits: e513f20 [Krisztián Szűcs] missing parse_version import 9621d70 [Krisztián Szűcs] mysql version match 7c041e1 [Krisztián Szűcs] omit missing pyarrow on appveyor 4b35916 [Krisztián Szűcs] include expr in halt_ordering block dabdfe4 [Krisztián Szűcs] extend multipledispatch halt_ordering 47f4bf8 [Krisztián Szűcs] remove mkdir exist_ok statement f9e440f [Krisztián Szűcs] factor out common postgres and mysql operations 76fd1dd [Krisztián Szűcs] ooh, I'm missing a compiler 4e769ac [Krisztián Szűcs] failing tests cases for clickhouse table insert 71e386f [Krisztián Szűcs] wrong argument for datamgr.py parquet aa24264 [Krisztián Szűcs] simplify isnan and isinf pandas execution; use numeric_types instead of float + integer_types 914e1b4 [Krisztián Szűcs] fallback to previous directory exists due to exist_ok is added in python 3.5 a77be07 [Krisztián Szűcs] ignore missing pyarrow dependency flag for datamgr b097e4d [Krisztián Szűcs] fix pandas interval from integer e7d8baa [Krisztián Szűcs] resolve review issues 740611b [Krisztián Szűcs] test data directory under ci instead of testing dc7459b [Krisztián Szűcs] remove cityhash dependency on 3.4 builds 30bfd1d [Krisztián Szűcs] clickhouse connections default lz4 compression if installed 2c500de [Krisztián Szűcs] run mysql on docs build d198ec0 [Krisztián Szűcs] clickhouse table insert 8f0b4f3 [Krisztián Szűcs] force compression; run_sql 58aa9d1 [Krisztián Szűcs] clickhouse table insert 96abcef [Krisztián Szűcs] deprecate timedelta api 618a4c5 [Krisztián Szűcs] python 3.4 misses urllib3 for bigquery 30db668 [Krisztián Szűcs] mysql doctest 945202f [Krisztián Szűcs] fix path exists 10a4c1d [Krisztián Szűcs] start mysql 2695df3 [Krisztián Szűcs] corrected mysql host 5b2f9e5 [Krisztián Szűcs] wrong datamgr path on appveyor 1220877 [Krisztián Szűcs] mysql env variables 35a597a [Krisztián Szűcs] postgres load error 7a592b2 [Krisztián Szűcs] datadir 0ab7947 [Krisztián Szűcs] fix minor rebase issues 70cb7d3 [Krisztián Szűcs] mysql setup 053b952 [Krisztián Szűcs] don't panic just warn when mysql timezone b33c818 [Krisztián Szűcs] appveyor hangs... 8aaf981 [Krisztián Szűcs] appveyor host / port for postgres and mysql 5109a38 [Krisztián Szűcs] ensure ibis schema on pandas dataframe bb73104 [Krisztián Szűcs] resolve maketrans test on py27 6eea58e [Krisztián Szűcs] datamgr: pass sqlite database path as str in cee6e01 [Krisztián Szűcs] finalize rebase 11e3c64 [Krisztián Szűcs] disable column type check in clickhouse external table test fa7058b [Krisztián Szűcs] datamgr handle missing arrow dependency c145d2b [Krisztián Szűcs] parquet bytes 0411a75 [Krisztián Szűcs] remove category cardinality 9e1159e [Krisztián Szűcs] fix catgory cardinality test 5d92ef9 [Krisztián Szűcs] category cardinality compat 2cb7d14 [Krisztián Szűcs] categoriy cardinality 5a5f922 [Krisztián Szűcs] attempt to load bigquery on py34 7a2b441 [Krisztián Szűcs] refactor impala pandas_interop 2111125 [Krisztián Szűcs] debug build errors 946016b [Krisztián Szűcs] debug py34 tests f3e9317 [Krisztián Szűcs] flake8 20d6c92 [Krisztián Szűcs] resolve missing backend import issues c476542 [Krisztián Szűcs] explicitly register numpy int and float type to dt.infer 5388052 [Krisztián Szűcs] fix test boolean summary 711b7a0 [Krisztián Szűcs] correct expected type in tests 99ae348 [Krisztián Szűcs] client versions; appveyor mysql 15f7caf [Krisztián Szűcs] mysql doctest df16cbb [Krisztián Szűcs] fix pandas tests 49e1264 [Krisztián Szűcs] fix parquet tests 8e698a2 [Krisztián Szűcs] refactor parquet type mappings 896e823 [Krisztián Szűcs] fix type mappings for csv backend; fixed tests f039fc1 [Krisztián Szűcs] flake8 1389d06 [Krisztián Szűcs] cast pandas extract timestamp field as int32 5f506a6 [Krisztián Szűcs] alchemy dtype mappings 6aaebc4 [Krisztián Szűcs] fix clickhouse import erorr 68a2c8a [Krisztián Szűcs] fix csv hdf5 backends 542eaf8 [Krisztián Szűcs] refactor pandas and clickhouse dtype mappings ad1dc4c [Krisztián Szűcs] mark clickhouse null tests as xfail a813959 [Krisztián Szűcs] pin clickhouse and mariadb versions 40ad29c [Krisztián Szűcs] fix row_number arity abeab30 [Krisztián Szűcs] switch to mariadb from mysql 5.7; mysql window operations; factored out common parts from postgres and mysql to alchemy dbde5d5 [Krisztián Szűcs] refactored clickhouse external tables; read csv kwargs; fixed mysql schema d3bb711 [Krisztián Szűcs] fix doctest for mysql client d7a9dce [Krisztián Szűcs] fix appveyor duplicate key error 0fc7458 [Krisztián Szűcs] remove test_schema d818376 [Krisztián Szűcs] create mysql schema with tinyint instead of smallint 779d366 [Krisztián Szűcs] Mysql types to alchemy 6ff4b57 [Krisztián Szűcs] Fix sqlalchemy to ibis type isinstance checking 91a874c [Krisztián Szűcs] fixed external table creation in clickhouse test_select 68f2df4 [Krisztián Szűcs] load mysql data on ci servers ac45538 [Krisztián Szűcs] importorskip clickhouse_driver d666a99 [Krisztián Szűcs] mysql configuration for appveyor and circleci 3cb3a23 [Krisztián Szűcs] attempt to fix recipe e35c259 [Krisztián Szűcs] unbound external_table from clickhouse client eb7c6dc [Krisztián Szűcs] fix test errors 61ab19d [Krisztián Szűcs] Cleanup MySQL; strftime, identicalto operations; generic backend tests 01ad304 [Krisztián Szűcs] MySQL backend with string, numeric operations; misc fixes 189340d [Krisztián Szűcs] MySQL ci setup 07d1acf [Krisztián Szűcs] fix for accidental return in a generator function 2cd484f [Krisztián Szűcs] param backend tests; fixed impala param bindings and implemented for clickhouse a64d2b3 [Krisztián Szűcs] clickhouse external tables; resolves #1164 22f29c4 [Krisztián Szűcs] Pandas IntervalAdd 71783a7 [Krisztián Szűcs] IntervalFromInteger backend tests are corrected to use an arithmetic operator ada0ec2 [Krisztián Szűcs] Date, DateTruncate for Impala 2c6c93e [Krisztián Szűcs] IntervalFromInteger for pandas, csv, parquet 92c5e90 [Krisztián Szűcs] Reenable BigQuery backend 97f0583 [Krisztián Szűcs] Fix Alchemy<->pandas timezone handling; silent AsyncImpalaQuery's __del__ exception 93edf25 [Krisztián Szűcs] Date, DateTruncate, TimestempTruncate for Postgres 9a9bee2 [Krisztián Szűcs] DateTruncate and TimestampTruncate for sqlite f47f05d [Krisztián Szűcs] Isnan, Isinf for postgres d8dfb8e [Krisztián Szűcs] IsInf, IsNan for impala f1b0022 [Krisztián Szűcs] IsInf, IsNan for clickhouse a528435 [Krisztián Szűcs] IsInf, IsNan backend implementation for pandas; deleted dead test code efb7264 [Krisztián Szűcs] DateTruncate tests f97b10c [Krisztián Szűcs] finnished timestamp truncate backend tests; remapped temporal units 7e2afe9 [Krisztián Szűcs] flake8 8f5402f [Krisztián Szűcs] backend test for timestamp truncate; improved pandas date and timestamp parsing; truncate for pandas c3aaf51 [Krisztián Szűcs] enable time support on py2 b7e82d8 [Krisztián Szűcs] flake8 4f63d16 [Krisztián Szűcs] DateTruncate and TimeTruncate operations; resolves #1260 7a31f19 [Krisztián Szűcs] mark translate tests as xfail 479f677 [Krisztián Szűcs] resolve postgres unicode <-> bytest compat problem on string_col.translate 51d8bb3 [Krisztián Szűcs] correct backend 946c4d6 [Krisztián Szűcs] skip pyarrow import on python3.4 b258631 [Krisztián Szűcs] save string columns in parquet tables with string type instead of binary c2063e0 [Krisztián Szűcs] moved conftest inside ibis.tests.all c592acf [Krisztián Szűcs] refactored LCD test suite a bit 7a84695 [Krisztián Szűcs] ensure correct dtypes for bool and string cols in datamgr a814555 [Krisztián Szűcs] pyarrow for python3.5 build 1448715 [Krisztián Szűcs] pyarrow for python3.5 build e90306a [Krisztián Szűcs] flake8 dd9ae3a [Krisztián Szűcs] remove pyarrow from 3.4 build 19d3e1d [Krisztián Szűcs] attempt to fix builds 776abf1 [Krisztián Szűcs] attempt to fix builds 42e7170 [Krisztián Szűcs] convert path to str again f7c6884 [Krisztián Szűcs] convert path to str before passing tarfile 0193bfa [Krisztián Szűcs] flake8 f533886 [Krisztián Szűcs] datamgr parquet 2bbb47a [Krisztián Szűcs] Attempt to resolve LCD-testing build issue c722aca [Krisztián Szűcs] Add lowest common denominator testing #1256
This is a large PR that adds a test loop for a large class of operations for every backend with the ultimate goal being to remove the copy pasted execution tests that are sitting inside each individual backends
tests/directory.I also took the liberty of bringing the backends up to par with each other on many operations (most missing operations were string ops).
Notably, we are still missing coverage on window functions; there are tests but they are all xfailed (some backends are xpassing, others truly failing). I need to work out the details of what exactly is missing from analytic function support from each backend.