From b3d1ea657473ec81e66dccf09073df190407eaa2 Mon Sep 17 00:00:00 2001 From: Sarah Gilmore Date: Mon, 8 May 2023 11:55:31 -0400 Subject: [PATCH 1/4] Add abstract base class arrow.array.Array Co-authored-by: Kevin Gurney --- matlab/src/matlab/+arrow/+array/Array.m | 43 +++++++++++++++++++ .../src/matlab/+arrow/+array/Float64Array.m | 8 +--- 2 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 matlab/src/matlab/+arrow/+array/Array.m diff --git a/matlab/src/matlab/+arrow/+array/Array.m b/matlab/src/matlab/+arrow/+array/Array.m new file mode 100644 index 00000000000..b37276b1bbc --- /dev/null +++ b/matlab/src/matlab/+arrow/+array/Array.m @@ -0,0 +1,43 @@ +classdef (Abstract) Array < matlab.mixin.CustomDisplay & ... + matlab.mixin.Scalar + % arrow.array.Array + + % Licensed to the Apache Software Foundation (ASF) under one or more + % contributor license agreements. See the NOTICE file distributed with + % this work for additional information regarding copyright ownership. + % The ASF licenses this file to you under the Apache License, Version + % 2.0 (the "License"); you may not use this file except in compliance + % with the License. You may obtain a copy of the License at + % + % http://www.apache.org/licenses/LICENSE-2.0 + % + % Unless required by applicable law or agreed to in writing, software + % distributed under the License is distributed on an "AS IS" BASIS, + % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + % implied. See the License for the specific language governing + % permissions and limitations under the License. + + + properties (Access = protected) + Proxy + end + + methods + function obj = Array(varargin) + obj.Proxy = libmexclass.proxy.Proxy(varargin{:}); + end + end + + methods (Access = private) + function str = ToString(obj) + str = obj.Proxy.ToString(); + end + end + + methods (Access=protected) + function displayScalarObject(obj) + disp(obj.ToString()); + end + end +end + diff --git a/matlab/src/matlab/+arrow/+array/Float64Array.m b/matlab/src/matlab/+arrow/+array/Float64Array.m index c48ee455746..40c822634a3 100644 --- a/matlab/src/matlab/+arrow/+array/Float64Array.m +++ b/matlab/src/matlab/+arrow/+array/Float64Array.m @@ -1,4 +1,4 @@ -classdef Float64Array < matlab.mixin.CustomDisplay +classdef Float64Array < arrow.array.Array % arrow.array.Float64Array % Licensed to the Apache Software Foundation (ASF) under one or more @@ -16,10 +16,6 @@ % implied. See the License for the specific language governing % permissions and limitations under the License. - properties (Access=private) - Proxy - end - properties (Hidden, SetAccess=private) MatlabArray end @@ -33,9 +29,9 @@ validateattributes(data, "double", ["2d", "nonsparse", "real"]); if ~isempty(data), validateattributes(data, "double", "vector"); end + obj@arrow.array.Array("Name", "arrow.array.proxy.Float64Array", "ConstructorArguments", {data, opts.DeepCopy}); % Store a reference to the array if not doing a deep copy if (~opts.DeepCopy), obj.MatlabArray = data; end - obj.Proxy = libmexclass.proxy.Proxy("Name", "arrow.array.proxy.Float64Array", "ConstructorArguments", {data, opts.DeepCopy}); end function data = double(obj) From c32d901767f35257b14a44abd87b45725eeeaae2 Mon Sep 17 00:00:00 2001 From: Sarah Gilmore Date: Mon, 8 May 2023 14:04:37 -0400 Subject: [PATCH 2/4] 1. Add abstract MATLAB base class arrow.array.Array 2. Implement Length() 3. Make arrow.array.Float64Array inherit from arrow.array.Arrat Co-authored-by: Kevin Gurney --- matlab/src/cpp/arrow/matlab/array/proxy/array.cc | 8 +++++++- matlab/src/cpp/arrow/matlab/array/proxy/array.h | 2 ++ matlab/src/matlab/+arrow/+array/Array.m | 8 ++++++++ matlab/src/matlab/+arrow/+array/Float64Array.m | 12 ------------ 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/array.cc b/matlab/src/cpp/arrow/matlab/array/proxy/array.cc index 865dd694b78..038eeb701c1 100644 --- a/matlab/src/cpp/arrow/matlab/array/proxy/array.cc +++ b/matlab/src/cpp/arrow/matlab/array/proxy/array.cc @@ -24,7 +24,7 @@ namespace arrow::matlab::array::proxy { // Register Proxy methods. REGISTER_METHOD(Array, ToString); REGISTER_METHOD(Array, ToMatlab); - + REGISTER_METHOD(Array, Length); } void Array::ToString(libmexclass::proxy::method::Context& context) { @@ -34,4 +34,10 @@ namespace arrow::matlab::array::proxy { auto str_mda = factory.createScalar(array->ToString()); context.outputs[0] = str_mda; } + + void Array::Length(libmexclass::proxy::method::Context& context) { + ::matlab::data::ArrayFactory factory; + auto length_mda = factory.createScalar(array->length()); + context.outputs[0] = length_mda; + } } diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/array.h b/matlab/src/cpp/arrow/matlab/array/proxy/array.h index 8a166303487..0ca75bcce47 100644 --- a/matlab/src/cpp/arrow/matlab/array/proxy/array.h +++ b/matlab/src/cpp/arrow/matlab/array/proxy/array.h @@ -33,6 +33,8 @@ class Array : public libmexclass::proxy::Proxy { void ToString(libmexclass::proxy::method::Context& context); + void Length(libmexclass::proxy::method::Context& context); + virtual void ToMatlab(libmexclass::proxy::method::Context& context) = 0; std::shared_ptr array; diff --git a/matlab/src/matlab/+arrow/+array/Array.m b/matlab/src/matlab/+arrow/+array/Array.m index b37276b1bbc..3a68cf45259 100644 --- a/matlab/src/matlab/+arrow/+array/Array.m +++ b/matlab/src/matlab/+arrow/+array/Array.m @@ -21,11 +21,19 @@ properties (Access = protected) Proxy end + + properties (Dependent) + Length + end methods function obj = Array(varargin) obj.Proxy = libmexclass.proxy.Proxy(varargin{:}); end + + function numElements = get.Length(obj) + numElements = obj.Proxy.Length(); + end end methods (Access = private) diff --git a/matlab/src/matlab/+arrow/+array/Float64Array.m b/matlab/src/matlab/+arrow/+array/Float64Array.m index 40c822634a3..ec77ef72216 100644 --- a/matlab/src/matlab/+arrow/+array/Float64Array.m +++ b/matlab/src/matlab/+arrow/+array/Float64Array.m @@ -38,16 +38,4 @@ data = obj.Proxy.ToMatlab(); end end - - methods (Access=protected) - function displayScalarObject(obj) - disp(obj.ToString()); - end - end - - methods (Access=private) - function str = ToString(obj) - str = obj.Proxy.ToString(); - end - end end From 8645e1bf3816088e66fa79ab3f2416192c8466e3 Mon Sep 17 00:00:00 2001 From: Kevin Gurney Date: Mon, 8 May 2023 14:56:29 -0400 Subject: [PATCH 3/4] Add test point for arrow.array.Array.Length property. Co-authored-by: Sarah Gilmore --- matlab/test/arrow/array/tFloat64Array.m | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/matlab/test/arrow/array/tFloat64Array.m b/matlab/test/arrow/array/tFloat64Array.m index 7e1a878c425..f85feb78e75 100755 --- a/matlab/test/arrow/array/tFloat64Array.m +++ b/matlab/test/arrow/array/tFloat64Array.m @@ -100,5 +100,22 @@ function ErrorIfSparse(testCase, MakeDeepCopy) fcn = @() arrow.array.Float64Array(sparse(ones([10 1])), DeepCopy=MakeDeepCopy); testCase.verifyError(fcn, "MATLAB:expectedNonsparse"); end + + function Length(testCase, MakeDeepCopy) + % Zero length array + A = arrow.array.Float64Array([], DeepCopy=MakeDeepCopy); + expectedLength = int64(0); + testCase.verifyEqual(A.Length, expectedLength); + + % Scalar + A = arrow.array.Float64Array(1, DeepCopy=MakeDeepCopy); + expectedLength = int64(1); + testCase.verifyEqual(A.Length, expectedLength); + + % Vector + A = arrow.array.Float64Array(1:100, DeepCopy=MakeDeepCopy); + expectedLength = int64(100); + testCase.verifyEqual(A.Length, expectedLength); + end end end From 5d834320344ff98979dd524f8a3c01aa6a78fc7f Mon Sep 17 00:00:00 2001 From: Sarah Gilmore Date: Wed, 10 May 2023 09:34:04 -0400 Subject: [PATCH 4/4] Remove extra spaces --- matlab/src/matlab/+arrow/+array/Array.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/src/matlab/+arrow/+array/Array.m b/matlab/src/matlab/+arrow/+array/Array.m index 3a68cf45259..259dba0cea0 100644 --- a/matlab/src/matlab/+arrow/+array/Array.m +++ b/matlab/src/matlab/+arrow/+array/Array.m @@ -18,7 +18,7 @@ % permissions and limitations under the License. - properties (Access = protected) + properties (Access=protected) Proxy end