Skip to content

Commit 2c3b5d9

Browse files
committed
Add fromBytes and fromFile static "make" methods to arrow.io.ipc.RecordBatchStreamReader MATLAB class.
1 parent 8b75373 commit 2c3b5d9

File tree

3 files changed

+64
-19
lines changed

3 files changed

+64
-19
lines changed

matlab/src/cpp/arrow/matlab/io/ipc/proxy/record_batch_stream_reader.cc

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
#include "arrow/matlab/buffer/matlab_buffer.h"
1819
#include "arrow/matlab/io/ipc/proxy/record_batch_stream_reader.h"
1920
#include "arrow/io/file.h"
21+
#include "arrow/io/memory.h"
2022
#include "arrow/matlab/error/error.h"
2123
#include "arrow/matlab/tabular/proxy/record_batch.h"
2224
#include "arrow/matlab/tabular/proxy/schema.h"
@@ -36,6 +38,35 @@ RecordBatchStreamReader::RecordBatchStreamReader(
3638
REGISTER_METHOD(RecordBatchStreamReader, readTable);
3739
}
3840

41+
libmexclass::proxy::MakeResult RecordBatchStreamReader::fromFile(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
42+
const mda::StructArray opts = constructor_arguments[0];
43+
const mda::StringArray filename_mda = opts[0]["Filename"];
44+
const auto filename_utf16 = std::u16string(filename_mda[0]);
45+
MATLAB_ASSIGN_OR_ERROR(const auto filename_utf8,
46+
arrow::util::UTF16StringToUTF8(filename_utf16),
47+
error::UNICODE_CONVERSION_ERROR_ID);
48+
49+
MATLAB_ASSIGN_OR_ERROR(auto input_stream, arrow::io::ReadableFile::Open(filename_utf8),
50+
error::FAILED_TO_OPEN_FILE_FOR_READ);
51+
52+
MATLAB_ASSIGN_OR_ERROR(auto reader,
53+
arrow::ipc::RecordBatchStreamReader::Open(input_stream),
54+
error::IPC_RECORD_BATCH_READER_OPEN_FAILED);
55+
56+
return std::make_shared<RecordBatchStreamReaderProxy>(std::move(reader));
57+
}
58+
59+
libmexclass::proxy::MakeResult RecordBatchStreamReader::fromBytes(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
60+
const mda::StructArray opts = constructor_arguments[0];
61+
const ::matlab::data::TypedArray<uint8_t> bytes_mda = opts[0]["Bytes"];
62+
const auto matlab_buffer = std::make_shared<matlab::arrow::MatlabBuffer>(bytes_mda);
63+
auto buffer_reader = std::make_shared<arrow::io::memory::BufferReader>(matlab_buffer);
64+
MATLAB_ASSIGN_OR_ERROR(auto reader,
65+
arrow::ipc::RecordBatchStreamReader::Open(buffer_reader),
66+
error::IPC_RECORD_BATCH_READER_OPEN_FAILED);
67+
return std::make_shared<RecordBatchStreamReaderProxy>(std::move(reader));
68+
}
69+
3970
libmexclass::proxy::MakeResult RecordBatchStreamReader::make(
4071
const libmexclass::proxy::FunctionArguments& constructor_arguments) {
4172
namespace mda = ::matlab::data;
@@ -44,20 +75,18 @@ libmexclass::proxy::MakeResult RecordBatchStreamReader::make(
4475

4576
const mda::StructArray opts = constructor_arguments[0];
4677

47-
const mda::StringArray filename_mda = opts[0]["Filename"];
48-
const auto filename_utf16 = std::u16string(filename_mda[0]);
49-
MATLAB_ASSIGN_OR_ERROR(const auto filename_utf8,
50-
arrow::util::UTF16StringToUTF8(filename_utf16),
51-
error::UNICODE_CONVERSION_ERROR_ID);
52-
53-
MATLAB_ASSIGN_OR_ERROR(auto input_stream, arrow::io::ReadableFile::Open(filename_utf8),
54-
error::FAILED_TO_OPEN_FILE_FOR_READ);
55-
56-
MATLAB_ASSIGN_OR_ERROR(auto reader,
57-
arrow::ipc::RecordBatchStreamReader::Open(input_stream),
58-
error::IPC_RECORD_BATCH_READER_OPEN_FAILED);
59-
60-
return std::make_shared<RecordBatchStreamReaderProxy>(std::move(reader));
78+
// Dispatch to the appropriate static "make" method depending
79+
// on the input type.
80+
const mda::StringArray type_mda = opts[0]["Type"];
81+
const auto type_utf16 = std::u16string(type_mda[0]);
82+
if (type_utf16.equals(u"Bytes")) {
83+
return RecordBatchStreamReader::fromBytes(constructor_arguments);
84+
} else if (type_utf16.equals(u"Filename")) {
85+
return RecordBatchStreamReader::fromFile(constructor_arguments);
86+
} else {
87+
// TODO: Create static error id string
88+
return libmexclass::error::Error{"arrow:some:test:id", "Invalid construction type for RecordBatchStreamReader."};
89+
}
6190
}
6291

6392
void RecordBatchStreamReader::getSchema(libmexclass::proxy::method::Context& context) {

matlab/src/cpp/arrow/matlab/io/ipc/proxy/record_batch_stream_reader.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ class RecordBatchStreamReader : public libmexclass::proxy::Proxy {
3030

3131
static libmexclass::proxy::MakeResult make(
3232
const libmexclass::proxy::FunctionArguments& constructor_arguments);
33+
static libmexclass::proxy::MakeResult fromFile(
34+
const libmexclass::proxy::FunctionArguments& constructor_arguments);
35+
static libmexclass::proxy::MakeResult fromBytes(
36+
const libmexclass::proxy::FunctionArguments& constructor_arguments);
3337

3438
protected:
3539
std::shared_ptr<arrow::ipc::RecordBatchStreamReader> reader;

matlab/src/matlab/+arrow/+io/+ipc/RecordBatchStreamReader.m

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,26 @@
2626
Schema
2727
end
2828

29+
methods (Static)
30+
function obj = fromBytes(bytes)
31+
args = struct(Bytes=bytes, Type="Bytes");
32+
proxyName = "arrow.io.ipc.proxy.RecordBatchStreamReader";
33+
obj.Proxy = arrow.internal.proxy.create(proxyName, args);
34+
end
35+
36+
function obj = fromFile(filename)
37+
args = struct(Filename=filename, Type="File");
38+
proxyName = "arrow.io.ipc.proxy.RecordBatchStreamReader";
39+
obj.Proxy = arrow.internal.proxy.create(proxyName, args);
40+
end
41+
end
42+
2943
methods
30-
function obj = RecordBatchStreamReader(filename)
44+
function obj = RecordBatchStreamReader(proxy)
3145
arguments
32-
filename(1, 1) string {mustBeNonzeroLengthText}
46+
proxy(1, 1) libmexclass.proxy.Proxy
3347
end
34-
args = struct(Filename=filename);
35-
proxyName = "arrow.io.ipc.proxy.RecordBatchStreamReader";
36-
obj.Proxy = arrow.internal.proxy.create(proxyName, args);
48+
obj.Proxy = proxy;
3749
end
3850

3951
function schema = get.Schema(obj)

0 commit comments

Comments
 (0)