Skip to content

Commit

Permalink
GH-35558: [MATLAB] Add signed integer array MATLAB classes (i.e. `Int…
Browse files Browse the repository at this point in the history
…8Array`, `Int16Array`, `Int32Array`, `Int64Array`) (#35561)

### Rationale for this change

Followup to #35495 in which we added the MATLAB class `Float32Array`.

This pull request adds support for round tripping signed integer between `arrow.array.<Array>` classes and associated MATLAB types (e.g. `int8`, `int16`, `int32`, `int64`).

| Arrow Array Type | MATLAB Type |
| ------------------------- | -------------------- |
| `Int8Array`             | `int8`                |
| `Int16Array`             | `int16`                |
| `Int32Array`             | `int32`                |
| `Int64Array`             | `int64`                |

Example of round-tripping `int8` data:

```matlab
>> int8MatlabArray = int8([1, 2, 3]')

int8MatlabArray =

  3x1 int8 column vector

   1
   2
   3

>> int8ArrowArray = arrow.array.Int8Array(int8MatlabArray) 

int8ArrowArray = 

[
  1,
  2,
  3
]

>> int8MatlabArrayRoundTripped = toMATLAB(int8ArrowArray)

int8MatlabArrayRoundTripped =

  3x1 int8 column vector

   1
   2
   3

>> all(int8MatlabArray == int8MatlabArrayRoundTripped)

ans =

  logical

   1

```

### What changes are included in this PR?

Added four new signed integer type `arrow.array.<Array>` concrete subclasses.

1.  `arrow.array.Int8Array`
3. `arrow.array.Int16Array`
4. `arrow.array.Int32Array` 
5. `arrow.array.Int64Array` 

### Are these changes tested?

Yes, we added the following four test classes:

1.  `tInt8Array.m`
2. `tInt16Array.m`
3. `tInt32Array.m`
4. `tInt64Array.m`

### Are there any user-facing changes?

Yes. This change introduces 4 new publicly documented classes:

1.  `arrow.array.Int8Array`
3. `arrow.array.Int16Array`
4. `arrow.array.Int32Array` 
5. `arrow.array.Int64Array` 

### Future Directions

1. Add support for null values (i.e. validity bitmap) for the signed integer array types.

### Notes

!. Thank you to @ sgilmore10 for her help with this pull request!
* Closes: #35558

Lead-authored-by: Kevin Gurney <kgurney@mathworks.com>
Co-authored-by: Sarah Gilmore <sgilmore@mathworks.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
  • Loading branch information
kevingurney and sgilmore10 committed May 22, 2023
1 parent 0dca449 commit fbe5f64
Show file tree
Hide file tree
Showing 9 changed files with 283 additions and 7 deletions.
18 changes: 11 additions & 7 deletions matlab/src/cpp/arrow/matlab/proxy/factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,20 @@
namespace arrow::matlab::proxy {

std::shared_ptr<Proxy> Factory::make_proxy(const ClassName& class_name, const FunctionArguments& constructor_arguments) {

// Register MATLAB Proxy classes for unsigned integer arrays
REGISTER_PROXY(arrow.array.proxy.UInt8Array, arrow::matlab::array::proxy::NumericArray<uint8_t>);
REGISTER_PROXY(arrow.array.proxy.UInt16Array, arrow::matlab::array::proxy::NumericArray<uint16_t>);
REGISTER_PROXY(arrow.array.proxy.UInt32Array, arrow::matlab::array::proxy::NumericArray<uint32_t>);
REGISTER_PROXY(arrow.array.proxy.UInt64Array, arrow::matlab::array::proxy::NumericArray<uint64_t>);

// Register MATLAB Proxy classes with corresponding C++ Proxy classes.
REGISTER_PROXY(arrow.array.proxy.Float32Array, arrow::matlab::array::proxy::NumericArray<float>);
REGISTER_PROXY(arrow.array.proxy.Float64Array, arrow::matlab::array::proxy::NumericArray<double>);
// Register MATLAB Proxy classes for unsigned integer arrays
REGISTER_PROXY(arrow.array.proxy.UInt8Array , arrow::matlab::array::proxy::NumericArray<uint8_t>);
REGISTER_PROXY(arrow.array.proxy.UInt16Array , arrow::matlab::array::proxy::NumericArray<uint16_t>);
REGISTER_PROXY(arrow.array.proxy.UInt32Array , arrow::matlab::array::proxy::NumericArray<uint32_t>);
REGISTER_PROXY(arrow.array.proxy.UInt64Array , arrow::matlab::array::proxy::NumericArray<uint64_t>);
// Register MATLAB Proxy classes for signed integer arrays
REGISTER_PROXY(arrow.array.proxy.Int8Array , arrow::matlab::array::proxy::NumericArray<int8_t>);
REGISTER_PROXY(arrow.array.proxy.Int16Array , arrow::matlab::array::proxy::NumericArray<int16_t>);
REGISTER_PROXY(arrow.array.proxy.Int32Array , arrow::matlab::array::proxy::NumericArray<int32_t>);
REGISTER_PROXY(arrow.array.proxy.Int64Array , arrow::matlab::array::proxy::NumericArray<int64_t>);

// TODO: Decide what to do in the case that there isn't a Proxy match.
std::cout << "Did not find a matching C++ proxy for: " + class_name << std::endl;
return nullptr;
Expand Down
40 changes: 40 additions & 0 deletions matlab/src/matlab/+arrow/+array/Int16Array.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
classdef Int16Array < arrow.array.Array
% arrow.array.Int16Array

% 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 (Hidden, SetAccess=private)
MatlabArray = int16([])
end

methods
function obj = Int16Array(data, opts)
arguments
data
opts.DeepCopy = false
end
validateattributes(data, "int16", ["2d", "nonsparse", "real"]);
if ~isempty(data), validateattributes(data, "int16", "vector"); end
obj@arrow.array.Array("Name", "arrow.array.proxy.Int16Array", "ConstructorArguments", {data, opts.DeepCopy});
% Store a reference to the array if not doing a deep copy
if (~opts.DeepCopy), obj.MatlabArray = data; end
end

function data = int16(obj)
data = obj.Proxy.toMATLAB();
end
end
end
40 changes: 40 additions & 0 deletions matlab/src/matlab/+arrow/+array/Int32Array.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
classdef Int32Array < arrow.array.Array
% arrow.array.Int32Array

% 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 (Hidden, SetAccess=private)
MatlabArray = int32([])
end

methods
function obj = Int32Array(data, opts)
arguments
data
opts.DeepCopy = false
end
validateattributes(data, "int32", ["2d", "nonsparse", "real"]);
if ~isempty(data), validateattributes(data, "int32", "vector"); end
obj@arrow.array.Array("Name", "arrow.array.proxy.Int32Array", "ConstructorArguments", {data, opts.DeepCopy});
% Store a reference to the array if not doing a deep copy
if (~opts.DeepCopy), obj.MatlabArray = data; end
end

function data = int32(obj)
data = obj.Proxy.toMATLAB();
end
end
end
40 changes: 40 additions & 0 deletions matlab/src/matlab/+arrow/+array/Int64Array.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
classdef Int64Array < arrow.array.Array
% arrow.array.Int64Array

% 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 (Hidden, SetAccess=private)
MatlabArray = int64([])
end

methods
function obj = Int64Array(data, opts)
arguments
data
opts.DeepCopy = false
end
validateattributes(data, "int64", ["2d", "nonsparse", "real"]);
if ~isempty(data), validateattributes(data, "int64", "vector"); end
obj@arrow.array.Array("Name", "arrow.array.proxy.Int64Array", "ConstructorArguments", {data, opts.DeepCopy});
% Store a reference to the array if not doing a deep copy
if (~opts.DeepCopy), obj.MatlabArray = data; end
end

function data = int64(obj)
data = obj.Proxy.toMATLAB();
end
end
end
40 changes: 40 additions & 0 deletions matlab/src/matlab/+arrow/+array/Int8Array.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
classdef Int8Array < arrow.array.Array
% arrow.array.Int8Array

% 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 (Hidden, SetAccess=private)
MatlabArray = int8([])
end

methods
function obj = Int8Array(data, opts)
arguments
data
opts.DeepCopy = false
end
validateattributes(data, "int8", ["2d", "nonsparse", "real"]);
if ~isempty(data), validateattributes(data, "int8", "vector"); end
obj@arrow.array.Array("Name", "arrow.array.proxy.Int8Array", "ConstructorArguments", {data, opts.DeepCopy});
% Store a reference to the array if not doing a deep copy
if (~opts.DeepCopy), obj.MatlabArray = data; end
end

function data = int8(obj)
data = obj.Proxy.toMATLAB();
end
end
end
28 changes: 28 additions & 0 deletions matlab/test/arrow/array/tInt16Array.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
classdef tInt16Array < hNumericArray
% Tests for arrow.array.Int16Array

% 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
ArrowArrayClassName = "arrow.array.Int16Array"
ArrowArrayConstructor = @arrow.array.Int16Array
MatlabConversionFcn = @int16 % int16 method on class
MatlabArrayFcn = @int16 % int16 function
MaxValue = intmax("int16")
MinValue = intmin("int16")
end

end
28 changes: 28 additions & 0 deletions matlab/test/arrow/array/tInt32Array.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
classdef tInt32Array < hNumericArray
% Tests for arrow.array.Int32Array

% 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
ArrowArrayClassName = "arrow.array.Int32Array"
ArrowArrayConstructor = @arrow.array.Int32Array
MatlabConversionFcn = @int32 % int32 method on class
MatlabArrayFcn = @int32 % int32 function
MaxValue = intmax("int32")
MinValue = intmin("int32")
end

end
28 changes: 28 additions & 0 deletions matlab/test/arrow/array/tInt64Array.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
classdef tInt64Array < hNumericArray
% Tests for arrow.array.Int64Array

% 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
ArrowArrayClassName = "arrow.array.Int64Array"
ArrowArrayConstructor = @arrow.array.Int64Array
MatlabConversionFcn = @int64 % int64 method on class
MatlabArrayFcn = @int64 % int64 function
MaxValue = intmax("int64")
MinValue = intmin("int64")
end

end
28 changes: 28 additions & 0 deletions matlab/test/arrow/array/tInt8Array.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
classdef tInt8Array < hNumericArray
% Tests for arrow.array.Int8Array

% 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
ArrowArrayClassName = "arrow.array.Int8Array"
ArrowArrayConstructor = @arrow.array.Int8Array
MatlabConversionFcn = @int8 % int8 method on class
MatlabArrayFcn = @int8 % int8 function
MaxValue = intmax("int8")
MinValue = intmin("int8")
end

end

0 comments on commit fbe5f64

Please sign in to comment.