Skip to content

Commit

Permalink
Conjunctive filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
spirom committed Nov 11, 2017
1 parent f7a8015 commit 5704664
Show file tree
Hide file tree
Showing 15 changed files with 372 additions and 180 deletions.
2 changes: 1 addition & 1 deletion .idea/.name

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 0 additions & 2 deletions .idea/learning-arrow-cpp.iml

This file was deleted.

4 changes: 2 additions & 2 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

391 changes: 223 additions & 168 deletions .idea/workspace.xml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.3)
project(learning_arrow_cpp)
project(arrow_simpledb)

ADD_SUBDIRECTORY(libdb)
ADD_SUBDIRECTORY(testdb)
Expand Down
2 changes: 1 addition & 1 deletion libdb/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ChunkedColumnCursor.cpp ScanTableCursor.cpp
ColumnCursorWrapper.cpp GenericColumnCursor.cpp TableCursor.cpp
FilterProjectTableCursor.cpp GreaterThanFilter.cpp GreaterThanFilter.h)
FilterProjectTableCursor.cpp filters/GreaterThanFilter.cpp filters/GreaterThanFilter.h filters/LessThanFilter.cpp filters/LessThanFilter.h filters/AndFilter.cpp filters/AndFilter.h)
add_library(libdb STATIC ${SOURCE_FILES})

target_link_libraries(libdb ${ARROW_LIBS} ${CMAKE_THREAD_LIBS_INIT})
Expand Down
2 changes: 1 addition & 1 deletion libdb/FilterProjectTableCursor.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include <arrow/table.h>
#include "ColumnCursorWrapper.h"
#include "TableCursor.h"
#include "Filter.h"
#include "filters/Filter.h"

class FilterProjectTableCursor : public TableCursor {
public:
Expand Down
27 changes: 27 additions & 0 deletions libdb/filters/AndFilter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@

#include "arrow/api.h"

#include "AndFilter.h"

AndFilter::AndFilter(std::string column_name, std::shared_ptr<Filter> left, std::shared_ptr<Filter> right)
: _column_name(column_name), _left(left), _right(right)
{

}

void
AndFilter::initialize(TableCursor& table_cursor) {
_left->initialize(table_cursor);
_right->initialize(table_cursor);
}

bool
AndFilter::evaluate()
{
// short circuit explicitly
if (_left->evaluate()) {
return _right->evaluate();
} else {
return false;
}
}
30 changes: 30 additions & 0 deletions libdb/filters/AndFilter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@


#ifndef ANDFILTER_H
#define ANDFILTER_H

#include <string>
#include "filters/Filter.h"
#include "TableCursor.h"

class AndFilter : public Filter {
public:

AndFilter(std::string column_name, std::shared_ptr<Filter> left, std::shared_ptr<Filter> right);

void initialize(TableCursor& table_cursor) override;

bool evaluate() override;

private:

std::string _column_name;

std::shared_ptr<Filter> _left;

std::shared_ptr<Filter> _right;

};


#endif // ANDFILTER_H
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#include "arrow/api.h"

#include "GreaterThanFilter.h"
#include "TableCursor.h"

GreaterThanFilter::GreaterThanFilter(std::string column_name, double value)
: _column_name(column_name), _value(value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#define GREATERTHANFILTER_H

#include <string>
#include "Filter.h"
#include "filters/Filter.h"
#include "TableCursor.h"
#include "ColumnCursorWrapper.h"

Expand Down
23 changes: 23 additions & 0 deletions libdb/filters/LessThanFilter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@


#include "LessThanFilter.h"

#include "arrow/api.h"

LessThanFilter::LessThanFilter(std::string column_name, double value)
: _column_name(column_name), _value(value)
{

}

void
LessThanFilter::initialize(TableCursor& table_cursor) {
_cursor = std::dynamic_pointer_cast<ColumnCursorWrapper<arrow::DoubleArray>>(
table_cursor.getColumn(_column_name));
}

bool
LessThanFilter::evaluate()
{
return _cursor->get() < _value;
}
30 changes: 30 additions & 0 deletions libdb/filters/LessThanFilter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@


#ifndef LESSTHANFILTER_H
#define LESSTHANFILTER_H

#include <string>
#include "filters/Filter.h"
#include "TableCursor.h"
#include "ColumnCursorWrapper.h"

class LessThanFilter : public Filter {
public:

LessThanFilter(std::string column_name, double value);

void initialize(TableCursor &table_cursor) override;

bool evaluate() override;

private:

std::string _column_name;

double _value;

std::shared_ptr <ColumnCursorWrapper<arrow::DoubleArray>> _cursor;
};


#endif // LESSTHANFILTER_H
34 changes: 32 additions & 2 deletions testdb/TableTest.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@

#include <GreaterThanFilter.h>
#include <filters/GreaterThanFilter.h>
#include <filters/AndFilter.h>
#include <filters/LessThanFilter.h>
#include "arrow/api.h"

#include "TableTest.h"
Expand Down Expand Up @@ -92,7 +94,7 @@ TEST_F(TableTest, ComplexColumns) {
EXPECT_EQ(200, count);
}

TEST_F(TableTest, SingleFilter) {
TEST_F(TableTest, SimpleFilter) {
std::shared_ptr<Table> table;
EXPECT_EQ(Status::OK().code(), Tables::createSmallChunkedColumns(table).code());
EXPECT_EQ(4, table->num_rows());
Expand All @@ -112,4 +114,32 @@ TEST_F(TableTest, SingleFilter) {
EXPECT_EQ(32, id_cursor->get());
EXPECT_EQ(42.9, cost_cursor->get());
EXPECT_FALSE(fptc.hasMore());
}

TEST_F(TableTest, ConjunctiveFilter) {
std::shared_ptr<Table> table;
EXPECT_EQ(Status::OK().code(), Tables::createSmallChunkedColumns(table).code());
EXPECT_EQ(4, table->num_rows());
EXPECT_EQ(2, table->num_columns());
ScanTableCursor tc(table);

std::shared_ptr<Filter> leftFilter = std::make_shared<GreaterThanFilter>("id", 11);
std::shared_ptr<Filter> rightFilter = std::make_shared<LessThanFilter>("cost", 42);
std::shared_ptr<Filter> andFilter =
std::make_shared<AndFilter>("id", leftFilter, rightFilter);

FilterProjectTableCursor fptc(tc, andFilter);

uint64_t count = 0;
auto id_cursor = std::dynamic_pointer_cast<ColumnCursorWrapper<arrow::Int64Array>>(
fptc.getColumn(std::string("id")));
auto cost_cursor = std::dynamic_pointer_cast<ColumnCursorWrapper<arrow::DoubleArray>>(
fptc.getColumn(std::string("cost")));
EXPECT_TRUE(fptc.hasMore());
EXPECT_EQ(12, id_cursor->get());
EXPECT_EQ(22.9, cost_cursor->get());
EXPECT_TRUE(fptc.hasMore());
EXPECT_EQ(31, id_cursor->get());
EXPECT_EQ(41.9, cost_cursor->get());
EXPECT_FALSE(fptc.hasMore());
}

0 comments on commit 5704664

Please sign in to comment.