arrow-datafusion 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ [package]
2
+ name = "datafusion_ruby"
3
+ version = "0.0.1"
4
+ authors = ["Datafusion Contrib Developers"]
5
+ edition = "2018"
6
+
7
+ [lib]
8
+ crate-type = ["cdylib"]
9
+
10
+ [dependencies]
11
+ magnus = "0.3"
12
+ datafusion = { version = "^8.0.0" }
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "shellwords"
4
+
5
+ class RakeCargoHelper
6
+ attr_reader :gem_name, :crate_name
7
+
8
+ def initialize(gem_name:, crate_name:)
9
+ @gem_name = gem_name
10
+ @crate_name = crate_name
11
+ end
12
+
13
+ def self.command?(name)
14
+ exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
15
+ ENV["PATH"].split(File::PATH_SEPARATOR).any? do |path|
16
+ exts.any? do |ext|
17
+ exe = File.join(path, "#{name}#{ext}")
18
+ File.executable?(exe) && !File.directory?(exe)
19
+ end
20
+ end
21
+ end
22
+
23
+ def self.rust_toolchain
24
+ str = `rustc --version --verbose`
25
+ info = str.lines.map { |l| l.chomp.split(/:\s+/, 2) }.drop(1).to_h
26
+ info["host"]
27
+ end
28
+
29
+ def self.cargo_target_dir
30
+ return @cargo_target_dir if defined? @cargo_target_dir
31
+
32
+ str = `cargo metadata --format-version 1 --offline --no-deps --quiet`
33
+ begin
34
+ require "json"
35
+ dir = JSON.parse(str)["target_directory"]
36
+ rescue LoadError # json is usually part of the stdlib, but just in case
37
+ /"target_directory"\s*:\s*"(?<dir>[^"]*)"/ =~ str
38
+ end
39
+ @cargo_target_dir = dir || "target"
40
+ end
41
+
42
+ def self.flags
43
+ cc_flags = Shellwords.split(RbConfig.expand(RbConfig::MAKEFILE_CONFIG["CC"].dup))
44
+
45
+ ["-C", "linker=#{cc_flags.shift}",
46
+ *cc_flags.flat_map { |a| ["-C", "link-arg=#{a}"] },
47
+ "-L", "native=#{RbConfig::CONFIG["libdir"]}",
48
+ *dld_flags,
49
+ *platform_flags]
50
+ end
51
+
52
+ def self.dld_flags
53
+ Shellwords.split(RbConfig::CONFIG["DLDFLAGS"]).flat_map do |arg|
54
+ arg = arg.gsub(/\$\((\w+)\)/) do
55
+ $1 == "DEFFILE" ? nil : RbConfig::CONFIG[name]
56
+ end.strip
57
+ next [] if arg.empty?
58
+
59
+ transform_flag(arg)
60
+ end
61
+ end
62
+
63
+ def self.platform_flags
64
+ return unless RbConfig::CONFIG["target_os"] =~ /mingw/i
65
+
66
+ [*Shellwords.split(RbConfig::CONFIG["LIBRUBYARG"]).flat_map { |arg| transform_flag(arg) },
67
+ "-C", "link-arg=-Wl,--dynamicbase",
68
+ "-C", "link-arg=-Wl,--disable-auto-image-base",
69
+ "-C", "link-arg=-static-libgcc"]
70
+ end
71
+
72
+ def self.transform_flag(arg)
73
+ k, v = arg.split(/(?<=..)/, 2)
74
+ case k
75
+ when "-L"
76
+ [k, "native=#{v}"]
77
+ when "-l"
78
+ [k, v]
79
+ when "-F"
80
+ ["-l", "framework=#{v}"]
81
+ else
82
+ ["-C", "link_arg=#{k}#{v}"]
83
+ end
84
+ end
85
+
86
+ def install_dir
87
+ File.expand_path(File.join("..", "..", "lib", gem_name), __dir__)
88
+ end
89
+
90
+ def rust_name
91
+ prefix = "lib" unless Gem.win_platform?
92
+ suffix = if RbConfig::CONFIG["target_os"] =~ /darwin/i
93
+ ".dylib"
94
+ elsif Gem.win_platform?
95
+ ".dll"
96
+ else
97
+ ".so"
98
+ end
99
+ "#{prefix}#{crate_name}#{suffix}"
100
+ end
101
+
102
+ def ruby_name
103
+ "#{crate_name}.#{RbConfig::CONFIG["DLEXT"]}"
104
+ end
105
+ end
106
+
107
+ task default: [:install, :clean]
108
+
109
+ desc "set dev mode for subsequent task, run like `rake dev install`"
110
+ task :dev do
111
+ @dev = true
112
+ end
113
+
114
+ desc "build gem native extension and copy to lib"
115
+ task install: [:cd, :build] do
116
+ helper = RakeCargoHelper.new(gem_name: "datafusion", crate_name: "datafusion_ruby")
117
+ profile_dir = @dev ? "debug" : "release"
118
+ source = File.join(RakeCargoHelper.cargo_target_dir, profile_dir, helper.rust_name)
119
+ dest = File.join(helper.install_dir, helper.ruby_name)
120
+ mkdir_p(helper.install_dir)
121
+ rm(dest) if File.exist?(dest)
122
+ cp(source, dest)
123
+ end
124
+
125
+ desc "build gem native extension"
126
+ task build: [:cargo, :cd] do
127
+ sh "cargo", "rustc", *(["--locked", "--release"] unless @dev), "--", *RakeCargoHelper.flags
128
+ end
129
+
130
+ desc "clean up release build artifacts"
131
+ task clean: [:cargo, :cd] do
132
+ sh "cargo clean --release"
133
+ end
134
+
135
+ desc "clean up build artifacts"
136
+ task clobber: [:cargo, :cd] do
137
+ sh "cargo clean"
138
+ end
139
+
140
+ desc "check for cargo"
141
+ task :cargo do
142
+ raise <<-MSG unless RakeCargoHelper.command?("cargo")
143
+
144
+ This gem requires a Rust compiler and the `cargo' build tool to build the
145
+ gem's native extension. See https://www.rust-lang.org/tools/install for
146
+ how to install Rust. `cargo' is usually part of the Rust installation.
147
+ MSG
148
+
149
+ raise <<-MSG if Gem.win_platform? && RakeCargoHelper.rust_toolchain !~ /gnu/
150
+
151
+ Found Rust toolchain `#{RakeCargoHelper.rust_toolchain}' but the gem native
152
+ extension requires the gnu toolchain on Windows.
153
+ MSG
154
+ end
155
+
156
+ # ensure task is running in the right dir
157
+ task :cd do
158
+ cd(__dir__) unless __dir__ == pwd
159
+ end
@@ -0,0 +1,14 @@
1
+ use datafusion::execution::context::SessionContext;
2
+
3
+ #[magnus::wrap(class = "Datafusion::SessionContext")]
4
+ pub(crate) struct RbSessionContext {
5
+ ctx: SessionContext,
6
+ }
7
+
8
+ impl RbSessionContext {
9
+ pub(crate) fn new() -> Self {
10
+ Self {
11
+ ctx: SessionContext::new(),
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,11 @@
1
+ use magnus::{define_module, function, prelude::*, Error};
2
+
3
+ mod context;
4
+
5
+ #[magnus::init]
6
+ fn init() -> Result<(), Error> {
7
+ let module = define_module("Datafusion")?;
8
+ let class = module.define_class("SessionContext", Default::default())?;
9
+ class.define_singleton_method("new", function!(context::RbSessionContext::new, 0))?;
10
+ Ok(())
11
+ }
@@ -0,0 +1,3 @@
1
+ module Datafusion
2
+ VERSION = "0.0.1"
3
+ end
data/lib/datafusion.rb ADDED
@@ -0,0 +1 @@
1
+ require_relative "datafusion/datafusion_ruby"
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arrow-datafusion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Datafusion Contrib Developers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-07-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ description: DataFusion is an extensible query execution framework, written in Rust,
28
+ that uses Apache Arrow as its in-memory format.
29
+ email:
30
+ executables: []
31
+ extensions:
32
+ - ext/datafusion_ruby/Rakefile
33
+ extra_rdoc_files: []
34
+ files:
35
+ - LICENSE
36
+ - README.md
37
+ - arrow-datafusion.gemspec
38
+ - ext/datafusion_ruby/Cargo.lock
39
+ - ext/datafusion_ruby/Cargo.toml
40
+ - ext/datafusion_ruby/Rakefile
41
+ - ext/datafusion_ruby/src/context.rs
42
+ - ext/datafusion_ruby/src/lib.rs
43
+ - lib/datafusion.rb
44
+ - lib/datafusion/version.rb
45
+ homepage: https://github.com/datafusion-contrib/datafusion-ruby
46
+ licenses:
47
+ - Apache-2.0
48
+ metadata: {}
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubygems_version: 3.1.6
65
+ signing_key:
66
+ specification_version: 4
67
+ summary: Ruby bindings of Apache Arrow Datafusion
68
+ test_files: []