This is an automated email from the ASF dual-hosted git repository.

kevingurney pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new cdc95c276a GH-37568: [MATLAB] Implement `isequal` for the 
`arrow.tabular.Schema` MATLAB class (#37619)
cdc95c276a is described below

commit cdc95c276a2ac268dcf9dfbeaed43225efb7d13b
Author: sgilmore10 <[email protected]>
AuthorDate: Thu Sep 7 17:06:55 2023 -0400

    GH-37568: [MATLAB] Implement `isequal` for the `arrow.tabular.Schema` 
MATLAB class (#37619)
    
    
    
    ### Rationale for this change
    
    Following on to https://github.com/apache/arrow/pull/37474, 
https://github.com/apache/arrow/pull/37446, and 
https://github.com/apache/arrow/pull/37525, we should implement `isequal` for 
the `arrow.tabular.Schema` MATLAB class.
    
    ### What changes are included in this PR?
    
    1. Updated `arrow.tabular.Schema` class to inherit from 
`matlab.mixin.Scalar`.
    2. Added `isequal` method to `arrow.tabular.Schema`.
    
    ### Are these changes tested?
    
    Yes. Added `isequal` unit tests to `tSchema.m`
    
    ### Are there any user-facing changes?
    
    Yes. Users can now compare two `arrow.tabular.Schema` objects via `isequal`.
    
    **Example**
    ```matlab
    >> schema1 = arrow.schema([arrow.field("A", arrow.uint8), arrow.field("B", 
arrow.uint16)]);
    >> schema2 = arrow.schema([arrow.field("A", arrow.uint8), arrow.field("B", 
arrow.uint16)]);
    >> schema3 = arrow.schema([arrow.field("A", arrow.uint8)]);
    
    >> isequal(schema1, schema2)
    
    ans =
    
      logical
    
       1
    
    >> isequal(schema1, schema3)
    
    ans =
    
      logical
    
       0
    ```
    
    ### Future Directions
    1. #37570
    
    * Closes: #37568
    
    Authored-by: Sarah Gilmore <[email protected]>
    Signed-off-by: Kevin Gurney <[email protected]>
---
 matlab/src/matlab/+arrow/+tabular/Schema.m | 31 ++++++++++++---
 matlab/test/arrow/tabular/tSchema.m        | 61 ++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 5 deletions(-)

diff --git a/matlab/src/matlab/+arrow/+tabular/Schema.m 
b/matlab/src/matlab/+arrow/+tabular/Schema.m
index 4b4a3d5782..f679b1e0bc 100644
--- a/matlab/src/matlab/+arrow/+tabular/Schema.m
+++ b/matlab/src/matlab/+arrow/+tabular/Schema.m
@@ -1,3 +1,7 @@
+%SCHEMA A tabular schema which semantically describes
+% the names and types of the columns of an associated tabular
+% Arrow data type.
+
 % 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.
@@ -13,10 +17,8 @@
 % implied.  See the License for the specific language governing
 % permissions and limitations under the License.
 
-classdef Schema < matlab.mixin.CustomDisplay
-%SCHEMA A tabular schema which semantically describes
-% the names and types of the columns of an associated tabular
-% Arrow data type.
+classdef Schema < matlab.mixin.CustomDisplay & ...
+                  matlab.mixin.Scalar
 
     properties (GetAccess=public, SetAccess=private, Hidden)
         Proxy
@@ -73,7 +75,26 @@ classdef Schema < matlab.mixin.CustomDisplay
         function numFields = get.NumFields(obj)
             numFields = obj.Proxy.getNumFields();
         end
-        
+
+        function tf = isequal(obj, varargin)
+            narginchk(2, inf);
+            tf = false;
+            
+            fieldsToCompare = cell([1 numel(varargin)]);
+            for ii = 1:numel(varargin)
+                schema = varargin{ii};
+                if ~isa(schema, "arrow.tabular.Schema")
+                    % Return false early if schema is not actually an
+                    % arrow.tabular.Schema instance.
+                    return;
+                end
+
+                fieldsToCompare{ii} = schema.Fields;
+            end
+
+            % Return if the Schema Fields properties are equal
+            tf = isequal(obj.Fields, fieldsToCompare{:});
+        end
     end
 
     methods (Access = private)
diff --git a/matlab/test/arrow/tabular/tSchema.m 
b/matlab/test/arrow/tabular/tSchema.m
index b57ebffbc5..3220236d4a 100644
--- a/matlab/test/arrow/tabular/tSchema.m
+++ b/matlab/test/arrow/tabular/tSchema.m
@@ -468,6 +468,67 @@ classdef tSchema < matlab.unittest.TestCase
             testCase.verifyError(@() schema.field(fieldName), 
"arrow:badsubscript:NonScalar");
         end
 
+        function TestIsEqualTrue(testCase)
+            % Schema objects are considered equal if:
+            %  1. They have the same number of fields
+            %  2. Their corresponding Fields properties are equal
+
+            schema1 = arrow.schema([...
+                arrow.field("A", arrow.uint8), ...
+                arrow.field("B", arrow.uint16), ...
+                arrow.field("123", arrow.uint32)
+            ]);
+            schema2 = arrow.schema([...
+                arrow.field("A", arrow.uint8), ...
+                arrow.field("B", arrow.uint16), ...
+                arrow.field("123", arrow.uint32)
+            ]);
+
+            % Create a Schema with zero fields
+            schema3 = arrow.recordBatch(table).Schema;
+            schema4 = arrow.recordBatch(table).Schema;
+            
+            testCase.verifyTrue(isequal(schema1, schema2));
+            testCase.verifyTrue(isequal(schema3, schema4));
+        end
+
+        function TestIsEqualFalse(testCase)
+            % Verify isequal returns false when expected.
+
+            schema1 = arrow.schema([...
+                arrow.field("A", arrow.uint8), ...
+                arrow.field("B", arrow.uint16), ...
+                arrow.field("123", arrow.uint32)
+            ]);
+            schema2 = arrow.schema([...
+                arrow.field("A", arrow.uint8), ...
+                arrow.field("B", arrow.uint16), ...
+            ]);
+            schema3 = arrow.schema([...
+                arrow.field("A", arrow.float32), ...
+                arrow.field("B", arrow.uint16), ...
+            ]);
+            schema4 = arrow.schema([...
+                arrow.field("C", arrow.uint8), ...
+                arrow.field("B", arrow.uint16), ...
+            ]);
+
+            % Create a Schema with zero fields
+            schema5 = arrow.recordBatch(table).Schema;
+            
+            % Have different number of fields
+            testCase.verifyFalse(isequal(schema1, schema2));
+
+            % Fields properties are not equal
+            testCase.verifyFalse(isequal(schema2, schema3));
+            testCase.verifyFalse(isequal(schema2, schema4));
+            testCase.verifyFalse(isequal(schema4, schema5));
+
+            % Compare schema to double
+            testCase.verifyFalse(isequal(schema4, 5));
+
+        end
+
     end
 
 end

Reply via email to