anchor.diff:          , is_readable_table/1
           , is_virtual_table/1
           , is_time_partitioned_alias/1
  +        , is_time_partitioned_table/1
           , is_local_time_partitioned_table/1
           , is_node_sharded_alias/1
           , is_local_node_sharded_table/1
  
positive.code: 
  is_node_sharded_alias(TableAlias) when is_atom(TableAlias) -> 
      is_node_sharded_alias(atom_to_list(TableAlias));
  is_node_sharded_alias(TableAlias) when is_list(TableAlias) -> (lists:last(TableAlias) == $@).
  
  is_time_partitioned_alias(TableAlias) when is_atom(TableAlias) ->
      is_time_partitioned_alias(atom_to_list(TableAlias));
  
negative.code:             end;
          [$_,$@|_] ->       
              [[$@|RN]|_] = string:tokens(tl(TableAliasRev), "_"),
              case length(RN) of
                  10 ->   TableAlias;         % this is a partition name
                  _ ->
                      try 
                          Period = list_to_integer(lists:reverse(RN)),
                          {Mega,Sec,_} = Key,
                          PartitionEnd=integer_to_list(Period*((1000000*Mega+Sec) div Period) + Period),
                          Prefix = lists:duplicate(10-length(PartitionEnd),$0),
                          {BaseName,_} = lists:split(length(TableAlias)-length(RN)-2, TableAlias),
                          lists:flatten(BaseName ++ Prefix ++ PartitionEnd ++ "@_" )
                          % timestamp partitioned cluster table
                      catch
                          _:_ -> TableAlias   % this is a table name
                      end
              end;
          _ ->
              TableAlias    
  