class Supersonic < Formula desc "C++ library providing a column oriented query engine" homepage "https://code.google.com/archive/p/supersonic/" url "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/supersonic/supersonic-0.9.4.tar.gz" sha256 "1592dfd2dc73f0b97298e0d25e51528dc9a94e9e7f4ab525569f63db0442d769" revision 9 bottle do cellar :any sha256 "394c7505ea220272eac96246fc9d73cbc95f1bdaa7b9c20963d526b43b1d21ac" => :mojave sha256 "57ef2a85b81a4581e2ee83f6dd8f931015c25888333f08e16411cc4340935d86" => :high_sierra sha256 "22004732b50e6175ba87623313f1d4871f89db9888fcab62fb4ba8ff44fffd0c" => :sierra sha256 "a14e0ddc6e7ad95f12a48aeeeeaaf884b628c6affcd4ddc13cc14f72fed48b1e" => :el_capitan end depends_on "pkg-config" => :build depends_on "boost" depends_on "gflags" depends_on "glog" depends_on "protobuf" needs :cxx11 def install ENV.cxx11 # gflags no longer supply .pc files; supersonic's compile expects them. ENV["GFLAGS_CFLAGS"] = "-I#{Formula["gflags"].opt_include}" ENV["GFLAGS_LIBS"] = "-L#{Formula["gflags"].opt_lib} -lgflags" system "./configure", "--disable-dependency-tracking", "--prefix=#{prefix}", "--without-re2" system "make", "clean" system "make", "install" end test do (testpath/"test.cpp").write <<~EOS #include #include using std::cout; using std::endl; using supersonic::BoundExpressionTree; using supersonic::Expression; using supersonic::Plus; using supersonic::AttributeAt; using supersonic::TupleSchema; using supersonic::Attribute; using supersonic::INT32; using supersonic::NOT_NULLABLE; using supersonic::FailureOrOwned; using supersonic::HeapBufferAllocator; using supersonic::View; using supersonic::EvaluationResult; using supersonic::SingleSourceProjector; BoundExpressionTree* PrepareBoundexpression_r() { scoped_ptr addition(Plus(AttributeAt(0), AttributeAt(1))); TupleSchema schema; schema.add_attribute(Attribute("a", INT32, NOT_NULLABLE)); schema.add_attribute(Attribute("b", INT32, NOT_NULLABLE)); FailureOrOwned bound_addition = addition->Bind(schema, HeapBufferAllocator::Get(), 2048); if(bound_addition.is_success()) { return bound_addition.release(); } return NULL; } const int32* AddColumns(int32* a, int32* b, size_t row_count, BoundExpressionTree* bound_tree) { TupleSchema schema; schema.add_attribute(Attribute("a", INT32, NOT_NULLABLE)); schema.add_attribute(Attribute("b", INT32, NOT_NULLABLE)); View input_view(schema); input_view.set_row_count(row_count); input_view.mutable_column(0)->Reset(a, NULL); input_view.mutable_column(1)->Reset(b, NULL); EvaluationResult result = bound_tree->Evaluate(input_view); if(result.is_success()) { cout << "Column Count : " << result.get().column_count() << " and Row Count" << result.get().row_count() << endl; return result.get().column(0).typed_data(); } return NULL; } int main(void) { int32 a[8] = {0, 1, 2, 3, 4, 5, 6, 7}; int32 b[8] = {3, 4, 6, 8, 1, 2, 2, 9}; scoped_ptr expr(PrepareBoundexpression_r()); const int32* result = AddColumns(a, b, 8, expr.get()); if(result == NULL) { cout << "Failed to execute the addition operation!" << endl; } cout << "Results: "; for(int i = 0; i < 8; i++) { cout << result[i] << " "; } return 0; } EOS system ENV.cxx, "test.cpp", "-std=c++1y", "-stdlib=libc++", "-L#{lib}", "-lsupersonic", "-L#{Formula["glog"].opt_lib}", "-lglog", "-L#{Formula["protobuf"].opt_lib}", "-lprotobuf", "-L#{Formula["boost"].opt_lib}", "-lboost_system", "-o", "test" system "./test" end end