Source code for cr.cube.dimension
# coding: utf-8
MULTIPLE_RESPONSE_TYPE = -127
CATEGORICAL = 'categorical'
ENUM = 'enum'
SELECTION_TYPE_IDS = (1, 0, -1)
[docs]class Dimension(object):
@classmethod
def _contains_type(cls, elements, type_):
return any(type_ == element['id'] for element in elements)
@classmethod
def _is_uniform(cls, data):
return bool(data['references'].get('uniform_basis'))
@classmethod
def _is_selections(cls, data):
data_type = data['type']
if data_type['class'] != CATEGORICAL:
return False
category_ids = tuple(
category['id'] for category in data_type['categories']
)
if category_ids == SELECTION_TYPE_IDS and not cls._is_uniform(data):
return True
return False
@classmethod
def _is_categorical(cls, data):
data_class = data['type']['class']
return (
data_class == CATEGORICAL and
not cls._is_selections(data)
)
@classmethod
def _is_multiple_response(cls, data):
data_type = data['type']
data_class = data_type['class']
return (
data_class == ENUM and
cls._contains_type(data_type['elements'], MULTIPLE_RESPONSE_TYPE)
)
@classmethod
def _get_data_type(cls, data):
if cls._is_selections(data):
return 'selections'
elif cls._is_categorical(data):
return 'categorical'
elif cls._is_multiple_response(data):
return 'multiple_response'
elif data['type'].get('subtype'):
return data['type']['subtype']['class']
raise ValueError('Could not extract data type from: {}'.format(data))