Skip to content
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

Closed
wants to merge 154 commits into from

Conversation

cpcloud
Copy link
Member

@cpcloud cpcloud commented Dec 8, 2017

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.

@cpcloud cpcloud self-assigned this Dec 8, 2017
@cpcloud cpcloud added bigquery bug Incorrect behavior inside of ibis clickhouse The ClickHouse backend feature Features or general enhancements expressions Issues or PRs related to the expression API impala The Apache Impala backend pandas The pandas backend postgres The PostgreSQL backend refactor Issues or PRs related to refactoring the codebase labels Dec 8, 2017
@cpcloud cpcloud added this to the 0.13 milestone Dec 8, 2017
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'
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be __all__

Copy link
Member

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?

Copy link
Member Author

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__).

Copy link
Member

@wesm wesm left a 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

all_exprs = [base] + cases + results + list(filter(
lambda expr: expr is not None,
[default]
))
Copy link
Member

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

Copy link
Member Author

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 :)

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'
Copy link
Member

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)
)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

omg :)

Copy link
Member Author

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.



def _translate_pattern(translator, pattern):
return 'r' * isinstance(pattern.op(), ir.Literal) + translator.translate(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice idiom!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

kszucs added a commit to kszucs/ibis that referenced this pull request Dec 29, 2017
kszucs added a commit to kszucs/ibis that referenced this pull request Dec 29, 2017
@cpcloud cpcloud force-pushed the test-loop branch 4 times, most recently from c79895b to a0bbb2d Compare January 10, 2018 20:29
class StringConcat(ValueOp):

input_type = rules.varargs(rules.string)
output_type = _concat_upcast
Copy link
Member

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')

Copy link
Member Author

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.

Copy link
Member Author

@cpcloud cpcloud left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Notes inline. I'm happy with this. Making some follow up issues now.

@wesm can you give this a once-over when you get a chance? @kszucs has some pending patches that depend on this.

- "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"
Copy link
Member Author

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.

Copy link
Member

@kszucs kszucs Jan 20, 2018

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
Copy link
Member Author

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
Copy link
Member Author

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.



def _translate_pattern(translator, pattern):
return 'r' * isinstance(pattern.op(), ir.Literal) + translator.translate(
Copy link
Member Author

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
Copy link
Member Author

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.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -74,6 +74,8 @@ class PandasTable(ops.DatabaseTable):

class PandasClient(client.Client):

dialect = None # defined in ibis.pandas.api
Copy link
Member Author

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):
Copy link
Member Author

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):
Copy link
Member Author

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.

Copy link
Member

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

Copy link
Member Author

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.

Copy link
Member

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:
Copy link
Member Author

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
Copy link
Member Author

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.

@kszucs
Copy link
Member

kszucs commented Jan 21, 2018

@cpcloud I guess You should just ignore the Nullable(Nothing) clickhouse exception. I have created an issue in clickhouse-driver and also have pinned the clickhouse-server's version in my upcoming PR.

Copy link
Member

@wesm wesm left a 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 =)



def _translate_pattern(translator, pattern):
return 'r' * isinstance(pattern.op(), ir.Literal) + translator.translate(
Copy link
Member

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

Copy link
Member Author

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)
Copy link
Member

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

Copy link
Member Author

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):
Copy link
Member

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

Copy link
Member Author

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()
Copy link
Member

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


class PandasExprTranslator(object):
_registry = frozenset(toolz.concat(
_flatten_subclass_tree(types[0]) for types in execute_node.funcs
Copy link
Member

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)
Copy link
Member

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?

Copy link
Member Author

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):
Copy link
Member

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?

Copy link
Member Author

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)])
)
)
Copy link
Member

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):
Copy link
Member

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

@cpcloud cpcloud changed the title WIP/ENH/TST/BUG: Add lowest common denominator testing ENH/TST/BUG: Add lowest common denominator testing, fill out backend operations Jan 23, 2018
@cpcloud
Copy link
Member Author

cpcloud commented Jan 23, 2018

@wesm @kszucs Thanks for your reviews. Will address comments then merge.

@cpcloud
Copy link
Member Author

cpcloud commented Jan 23, 2018

merging on green

@wesm
Copy link
Member

wesm commented Jan 24, 2018

Bombs away

@cpcloud cpcloud closed this in 5cafaee Jan 24, 2018
@cpcloud cpcloud deleted the test-loop branch January 24, 2018 13:44
kszucs added a commit to kszucs/ibis that referenced this pull request Jan 24, 2018
kszucs added a commit to kszucs/ibis that referenced this pull request Feb 1, 2018
kszucs added a commit to kszucs/ibis that referenced this pull request Feb 4, 2018
cpcloud pushed a commit that referenced this pull request Feb 5, 2018
- [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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Incorrect behavior inside of ibis clickhouse The ClickHouse backend expressions Issues or PRs related to the expression API feature Features or general enhancements impala The Apache Impala backend pandas The pandas backend postgres The PostgreSQL backend refactor Issues or PRs related to refactoring the codebase
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants