gusucode.com > bigdata 工具箱 matlab源码程序 > bigdata/+matlab/+bigdata/+internal/+adaptors/DatetimeFamilyAdaptor.m

    
%   Copyright 2016 The MathWorks, Inc.

classdef DatetimeFamilyAdaptor < ...
        matlab.bigdata.internal.adaptors.AbstractAdaptor & ...
        matlab.bigdata.internal.adaptors.GeneralArrayParenIndexingMixin & ...
        matlab.bigdata.internal.adaptors.GeneralArrayDisplayMixin & ...
        matlab.bigdata.internal.adaptors.NoCellIndexingMixin

    methods (Access = private)
        function names = getPropertiesImpl(obj)
            names = {'Format'};
            if strcmp(obj.Class, 'datetime')
                names = [names, { 'TimeZone', ...
                                  'Year', ...
                                  'Month', ...
                                  'Day', ...
                                  'Hour', ...
                                  'Minute', ...
                                  'Second', ...
                                  'SystemTimeZone' }];
            end
        end
        function unsupportedDotIndexing(obj, msgId, property)
            if ismember(property, getPropertiesImpl(obj))
                % It is a property that we'd like to allow access to
                error(message(msgId, obj.Class));
            else
                % Completely bogus property - throw MATLAB's error.
                msgId = sprintf('MATLAB:%s:UnrecognizedProperty', obj.Class);
                error(message(msgId, property));
            end
        end
    end
    
    methods
        function obj = DatetimeFamilyAdaptor(className)
            assert(ismember(className, {'datetime', 'duration', 'calendarDuration'}));
            obj@matlab.bigdata.internal.adaptors.AbstractAdaptor(className);
        end

        function [nanFlagCell, precisionFlagCell] = interpretReductionFlags(obj, FCN_NAME, flags)

            % Datetime family types don't have any precision flags
            precisionFlagCell = {};
            
            % Only 'datetime' allows 'omitnat' as a synonym for 'omitnan'
            allowOmitNat = strcmp(obj.Class, 'datetime');
       
            omitFlags = {'omitnan'};
            includeFlags = {'includenan'};
            if allowOmitNat
                omitFlags{end+1} = 'omitnat';
                includeFlags{end+1} = 'includenat';
            end
            
            % For datetime family operations, the only valid flag is 'omitnan' /
            % 'includenan', so we can use relatively simple parsing here.
            nanFlagCell = cell(1, numel(flags));
            for idx = 1:numel(flags)
                nanFlagCell{idx} = iExtractNanFlag(FCN_NAME, flags{idx}, omitFlags, includeFlags);
            end
            
            if ismember(lower(FCN_NAME), {'sum', 'mean'}) && isempty(nanFlagCell)
                % For SUM and MEAN, we always need to provide a default NaN flag
                nanFlagCell = {'includenan'};
            elseif numel(nanFlagCell) > 1
                error(message('MATLAB:bigdata:array:InvalidRepeatedFlag', FCN_NAME, ...
                              strjoin([omitFlags, includeFlags])));
            end
        end

        function varargout = subsrefDot(obj, ~, ~, S) %#ok<STOUT>
            unsupportedDotIndexing(obj, 'MATLAB:bigdata:array:GetDatetimePropertiesUnsupported', S(1).subs);
        end
        
        function obj = subsasgnDotDeleting(obj, ~, ~, S)
            unsupportedDotIndexing(obj, 'MATLAB:bigdata:array:SetDatetimePropertiesUnsupported', S(1).subs);
        end
        
        function obj = subsasgnDot(obj, ~, ~, S, ~)
            unsupportedDotIndexing(obj, 'MATLAB:bigdata:array:SetDatetimePropertiesUnsupported', S(1).subs);
        end
        
        function names = getProperties(~)
            names = cell(0,1);
            % TODO(g1361570) enable this, as well as subsrefDot.
            % names = getPropertiesImpl(obj);
        end
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Extract a single omit/include flag.
function nf = iExtractNanFlag(FCN_NAME, flag, omitFlags, includeFlags)
    n = numel(flag);
    if n > 0 && any(strncmpi(flag, omitFlags, n))
        nf = 'omitnan';
    elseif n > 0 && any(strncmpi(flag, includeFlags, n))
        nf = 'includenan';
    else
        validFlagsStr = strjoin([omitFlags, includeFlags]);
        error(message('MATLAB:bigdata:array:InvalidOption', flag, FCN_NAME, validFlagsStr));
    end
end