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