Esempio n. 1
0
    def test_mdx_hierarchy_set_bottom_count(self):
        hierarchy_set = MdxHierarchySet \
            .tm1_subset_all("Dimension") \
            .bottom_count("CUBE", MdxTuple.of(Member.of("DIMENSION2", "ELEMENT2"), Member.of("DIMENSION3", "ELEMENT3")),
                          10)

        self.assertEqual(
            "{BOTTOMCOUNT({TM1SUBSETALL([DIMENSION].[DIMENSION])},"
            "10,"
            "[CUBE].([DIMENSION2].[DIMENSION2].[ELEMENT2],[DIMENSION3].[DIMENSION3].[ELEMENT3]))}",
            hierarchy_set.to_mdx())
Esempio n. 2
0
    def test_mdx_hierarchy_set_unions_allow_duplicates(self):
        hierarchy_set = MdxHierarchySet.unions([
            MdxHierarchySet.children(Member.of("Dimension", "element1")),
            MdxHierarchySet.member(Member.of("Dimension", "element2")),
            MdxHierarchySet.member(Member.of("Dimension", "element3"))
        ], True)

        self.assertEqual(
            "{{[DIMENSION].[DIMENSION].[ELEMENT1].CHILDREN},"
            "{[DIMENSION].[DIMENSION].[ELEMENT2]},"
            "{[DIMENSION].[DIMENSION].[ELEMENT3]}}", hierarchy_set.to_mdx())
Esempio n. 3
0
    def test_mdx_hierarchy_set_order_desc_str(self):
        hierarchy_set = MdxHierarchySet.all_members("Dimension1", "Hierarchy1").order(
            cube="Cube",
            mdx_tuple=MdxTuple.of(
                Member.of("Dimension2", "Hierarchy2", "ElementA"),
                Member.of("Dimension3", "Hierarchy3", "ElementB")),
            order="DESC")

        self.assertEqual(
            "{ORDER({[DIMENSION1].[HIERARCHY1].MEMBERS},"
            "[CUBE].([DIMENSION2].[HIERARCHY2].[ELEMENTA],[DIMENSION3].[HIERARCHY3].[ELEMENTB]),DESC)}",
            hierarchy_set.to_mdx())
Esempio n. 4
0
    def as_MDX(self) -> str:
        """ Build a valid MDX Query from an Existing cubeview. 
        Takes Zero suppression into account. 
        Throws an Exception when no elements are place on the columns.
        Subsets are referenced in the result-MDX through the TM1SubsetToSet Function

        :return: String, the MDX Query
        """
        if not self.columns:
            raise ValueError("Column selection must not be empty")

        query = MdxBuilder.from_cube(self.cube)
        if self._suppress_empty_rows:
            query.rows_non_empty()

        if self.suppress_empty_columns:
            query.columns_non_empty()

        axes = [self.columns]
        if self.rows:
            axes.append(self.rows)

        for axis_id, axis in enumerate(axes):
            for axis_selection in axis:
                subset = axis_selection.subset

                if isinstance(subset, AnonymousSubset):
                    if subset.expression is not None:
                        mdx_hierarchy_set = MdxHierarchySet.from_str(
                            dimension=subset.dimension_name,
                            hierarchy=subset.hierarchy_name,
                            mdx=subset.expression)

                    else:
                        members = [
                            Member.of(subset.dimension_name, element)
                            for element in subset.elements
                        ]
                        mdx_hierarchy_set = MdxHierarchySet.members(members)

                else:
                    mdx_hierarchy_set = MdxHierarchySet.tm1_subset_to_set(
                        dimension=axis_selection.dimension_name,
                        hierarchy=axis_selection.hierarchy_name,
                        subset=subset.name)
                query.add_hierarchy_set_to_axis(
                    axis=axis_id, mdx_hierarchy_set=mdx_hierarchy_set)

        for title in self._titles:
            query.add_member_to_where(
                Member.of(title.dimension_name, title.selected))

        return query.to_mdx()
Esempio n. 5
0
    def test_mdx_hierarchy_set_filter_by_cell_value_string(self):
        hierarchy_set = MdxHierarchySet.all_members(
            "Dimension1", "Hierarchy1").filter_by_cell_value(
                cube="Cube",
                mdx_tuple=MdxTuple.of(Member.of("Dimension2", "ElementA"),
                                      Member.of("Dimension3", "ElementB")),
                operator="=",
                value='ABC')

        self.assertEqual(
            "{FILTER({[dimension1].[hierarchy1].MEMBERS},"
            "[cube].([dimension2].[dimension2].[elementa],[dimension3].[dimension3].[elementb])='ABC')}",
            hierarchy_set.to_mdx())
Esempio n. 6
0
    def test_mdx_hierarchy_set_filter_by_cell_value_string(self):
        hierarchy_set = MdxHierarchySet.all_members("Dimension1", "Hierarchy1").filter_by_cell_value(
            cube="Cube",
            mdx_tuple=MdxTuple.of(
                Member.of("Dimension2", "ElementA"),
                Member.of("Dimension3", "ElementB")),
            operator="=",
            value='ABC')

        self.assertEqual(
            "{FILTER({[DIMENSION1].[HIERARCHY1].MEMBERS},"
            "[CUBE].([DIMENSION2].[DIMENSION2].[ELEMENTA],[DIMENSION3].[DIMENSION3].[ELEMENTB])='ABC')}",
            hierarchy_set.to_mdx())
Esempio n. 7
0
    def test_calculated_member_sum(self):
        calculated_member = CalculatedMember.sum(
            dimension="Period",
            hierarchy="Period",
            element="SUM 2016",
            cube="Cube",
            mdx_set=MdxHierarchySet.children(Member.of("Period", "2016")),
            mdx_tuple=MdxTuple.of(Member.of("Dimension1", "Element1"), Member.of("Dimension2", "Element2")))

        self.assertEqual(
            calculated_member.to_mdx(),
            "MEMBER [PERIOD].[PERIOD].[SUM2016] AS SUM({[PERIOD].[PERIOD].[2016].CHILDREN},[CUBE]."
            "([DIMENSION1].[DIMENSION1].[ELEMENT1],[DIMENSION2].[DIMENSION2].[ELEMENT2]))")
Esempio n. 8
0
    def test_mdx_hierarchy_set_order(self):
        hierarchy_set = MdxHierarchySet.all_members(
            "Dimension1",
            "Hierarchy1").order(cube="Cube",
                                mdx_tuple=MdxTuple.of(
                                    Member.of("Dimension2", "Hierarchy2",
                                              "ElementA"),
                                    Member.of("Dimension3", "Hierarchy3",
                                              "ElementB")))

        self.assertEqual(
            "{ORDER({[dimension1].[hierarchy1].MEMBERS},"
            "[cube].([dimension2].[hierarchy2].[elementa],[dimension3].[hierarchy3].[elementb]),BASC)}",
            hierarchy_set.to_mdx())
Esempio n. 9
0
    def test_mdx_builder_simple(self):
        mdx = MdxBuilder.from_cube("cube") \
            .rows_non_empty() \
            .add_hierarchy_set_to_row_axis(MdxHierarchySet.all_leaves("Dim1")) \
            .columns_non_empty() \
            .add_hierarchy_set_to_column_axis(MdxHierarchySet.member(Member.of("Dim2", "Elem2"))) \
            .where(Member.of("Dim3", "Elem3"), Member.of("Dim4", "Elem4")) \
            .to_mdx()

        self.assertEqual(
            "SELECT\r\n"
            "NON EMPTY {[dim2].[dim2].[elem2]} ON 0,\r\n"
            "NON EMPTY {TM1FILTERBYLEVEL({TM1SUBSETALL([dim1].[dim1])},0)} ON 1\r\n"
            "FROM [cube]\r\n"
            "WHERE ([dim3].[dim3].[elem3],[dim4].[dim4].[elem4])", mdx)
Esempio n. 10
0
    def test_calculated_member_sum(self):
        calculated_member = CalculatedMember.sum(
            dimension="Period",
            hierarchy="Period",
            element="SUM 2016",
            cube="Cube",
            mdx_set=MdxHierarchySet.children(Member.of("Period", "2016")),
            mdx_tuple=MdxTuple.of(Member.of("Dimension1", "Element1"),
                                  Member.of("Dimension2", "Element2")))

        self.assertEqual(
            calculated_member.to_mdx(),
            "MEMBER [period].[period].[sum2016] AS SUM({[period].[period].[2016].CHILDREN},[cube]."
            "([dimension1].[dimension1].[element1],[dimension2].[dimension2].[element2]))"
        )
Esempio n. 11
0
    def test_mdx_hierarchy_set_drill_down_level(self):
        hierarchy_set = MdxHierarchySet.drill_down_level(
            Member.of("Dimension", "Element"))

        self.assertEqual(
            "{DRILLDOWNLEVEL({[dimension].[dimension].[element]})}",
            hierarchy_set.to_mdx())
Esempio n. 12
0
    def test_mdx_builder_tm1_ignore_bad_tuples(self):
        mdx = MdxBuilder.from_cube("CUBE") \
            .tm1_ignore_bad_tuples() \
            .rows_non_empty() \
            .add_hierarchy_set_to_row_axis(MdxHierarchySet.all_leaves("Dim1")) \
            .columns_non_empty() \
            .add_hierarchy_set_to_column_axis(MdxHierarchySet.member(Member.of("Dim2", "Elem2"))) \
            .where(Member.of("Dim3", "Elem3"), Member.of("Dim4", "Elem4")) \
            .to_mdx()

        self.assertEqual(
            "SELECT\r\n"
            "NON EMPTY TM1IGNORE_BADTUPLES {[DIM2].[DIM2].[ELEM2]} ON 0,\r\n"
            "NON EMPTY TM1IGNORE_BADTUPLES {TM1FILTERBYLEVEL({TM1SUBSETALL([DIM1].[DIM1])},0)} ON 1\r\n"
            "FROM [CUBE]\r\n"
            "WHERE ([DIM3].[DIM3].[ELEM3],[DIM4].[DIM4].[ELEM4])", mdx)
Esempio n. 13
0
 def test_mdx_hierarchy_descendants_with_flag(self):
     member = Member.of('Dimension', 'Hierarchy', 'Member1')
     hierarchy_set = MdxHierarchySet.descendants(
         member, desc_flag='SELF_AND_BEFORE')
     self.assertEqual(
         "{DESCENDANTS([dimension].[hierarchy].[member1], SELF_AND_BEFORE)}",
         hierarchy_set.to_mdx())
Esempio n. 14
0
def build_mdx_from_cellset(cells: Dict, cube_name: str, dimensions: Iterable[str]) -> str:
    query = MdxBuilder.from_cube(cube_name)
    for coordinates in cells:
        members = (Member.of(dimension, element) for dimension, element in zip(dimensions, coordinates))
        query.add_member_tuple_to_columns(*members)
    mdx = query.to_mdx()
    return mdx
Esempio n. 15
0
    def test_mdx_hierarchy_set_tm1_drill_down_member_all(self):
        hierarchy_set = MdxHierarchySet.members([Member.of("DIMENSION", "ELEMENT")]).tm1_drill_down_member(all=True,
                                                                                                           recursive=False)

        self.assertEqual(
            "{TM1DRILLDOWNMEMBER({[DIMENSION].[DIMENSION].[ELEMENT]}, ALL)}",
            hierarchy_set.to_mdx())
Esempio n. 16
0
 def test_mdx_builder_multi_fail_combine_tuples_sets_on_axis(self):
     with pytest.raises(ValueError):
         MdxBuilder.from_cube("CUBE") \
             .rows_non_empty() \
             .add_member_tuple_to_axis(0, Member.of("Dim1", "Dim1", "Elem1")) \
             .add_hierarchy_set_to_axis(0, MdxHierarchySet.all_leaves("Dim1")) \
             .to_mdx()
Esempio n. 17
0
    def test_mdx_builder_multi_axes(self):
        mdx = MdxBuilder.from_cube("cube") \
            .add_hierarchy_set_to_axis(0, MdxHierarchySet.member(Member.of("Dim1", "Elem1"))) \
            .add_hierarchy_set_to_axis(1, MdxHierarchySet.member(Member.of("Dim2", "Elem2"))) \
            .add_hierarchy_set_to_axis(2, MdxHierarchySet.member(Member.of("Dim3", "Elem3"))) \
            .add_hierarchy_set_to_axis(3, MdxHierarchySet.member(Member.of("Dim4", "Elem4"))) \
            .add_hierarchy_set_to_axis(4, MdxHierarchySet.member(Member.of("Dim5", "Elem5"))) \
            .to_mdx()

        self.assertEqual(
            "SELECT\r\n"
            "{[dim1].[dim1].[elem1]} ON 0,\r\n"
            "{[dim2].[dim2].[elem2]} ON 1,\r\n"
            "{[dim3].[dim3].[elem3]} ON 2,\r\n"
            "{[dim4].[dim4].[elem4]} ON 3,\r\n"
            "{[dim5].[dim5].[elem5]} ON 4\r\n"
            "FROM [cube]", mdx)
Esempio n. 18
0
    def test_mdx_hierarchy_set_tm1_drill_down_member_all(self):
        hierarchy_set = MdxHierarchySet.members(
            [Member.of("dimension",
                       "element")]).tm1_drill_down_member(recursive=False)

        self.assertEqual(
            "{TM1DRILLDOWNMEMBER({[dimension].[dimension].[element]}, ALL)}",
            hierarchy_set.to_mdx())
Esempio n. 19
0
    def test_mdx_builder_single_axes(self):
        mdx = MdxBuilder.from_cube("cube") \
            .add_hierarchy_set_to_axis(0, MdxHierarchySet.member(Member.of("Dim1", "Elem1"))) \
            .to_mdx()

        self.assertEqual(
            "SELECT\r\n"
            "{[dim1].[dim1].[elem1]} ON 0\r\n"
            "FROM [cube]", mdx)
Esempio n. 20
0
def build_mdx_and_values_from_cellset(cells: Dict, cube_name: str, dimensions: Iterable[str]) -> Tuple[str, List]:
    values = []
    query = MdxBuilder.from_cube(cube_name)
    for coordinates, value in cells.items():
        members = (Member.of(dimension, element) for dimension, element in zip(dimensions, coordinates))
        query.add_member_tuple_to_columns(*members)
        values.append(value)
    mdx = query.to_mdx()
    return mdx, values
Esempio n. 21
0
 def test_mdx_hierarchy_descendants_with_flag_and_member_level(self):
     member = Member.of('Dimension', 'Hierarchy', 'Member1')
     hierarchy_set = MdxHierarchySet.descendants(
         member,
         MdxLevelExpression.member_level(member),
         desc_flag='SELF_AND_BEFORE')
     self.assertEqual(
         "{DESCENDANTS([dimension].[hierarchy].[member1], "
         "[dimension].[hierarchy].[member1].LEVEL, "
         "SELF_AND_BEFORE)}", hierarchy_set.to_mdx())
Esempio n. 22
0
    def test_publish(self):
        mdx = MdxBuilder.from_cube(self.cube_name).add_member_tuple_to_columns(
            Member.of(self.dimension_names[0], "Element1"),
            Member.of(self.dimension_names[1], "Element1"),
            Member.of(self.dimension_names[2], "Element1")) \
            .to_mdx()

        self.tm1.cells.write_values(cube_name=self.cube_name,
                                    cellset_as_dict={
                                        ("Element1", "Element1", "Element1"): 1
                                    },
                                    sandbox_name=self.sandbox_name1)

        values = self.tm1.cells.execute_mdx_values(mdx=mdx)
        self.assertEqual(None, values[0])

        self.tm1.sandboxes.publish(self.sandbox_name1)

        values = self.tm1.cells.execute_mdx_values(mdx=mdx)
        self.assertEqual(1, values[0])
Esempio n. 23
0
    def test_calculated_member_lookup(self):
        calculated_member = CalculatedMember.lookup(
            "Period",
            "Period",
            "VersionAttribute1",
            cube="}ElementAttributes_Version",
            mdx_tuple=MdxTuple.of(Member.of("}ElementAttributes_Version", "Attribute1")))

        self.assertEqual(
            calculated_member.to_mdx(),
            "MEMBER [PERIOD].[PERIOD].[VERSIONATTRIBUTE1] AS [}ELEMENTATTRIBUTES_VERSION]."
            "([}ELEMENTATTRIBUTES_VERSION].[}ELEMENTATTRIBUTES_VERSION].[ATTRIBUTE1])")
Esempio n. 24
0
    def test_mdx_builder_multi_no_where(self):
        mdx = MdxBuilder.from_cube("CUBE") \
            .rows_non_empty() \
            .add_hierarchy_set_to_row_axis(MdxHierarchySet.all_leaves("Dim1")) \
            .columns_non_empty() \
            .add_hierarchy_set_to_column_axis(MdxHierarchySet.member(Member.of("Dim2", "Elem2"))) \
            .to_mdx()

        self.assertEqual(
            "SELECT\r\n"
            "NON EMPTY {[DIM2].[DIM2].[ELEM2]} ON 0,\r\n"
            "NON EMPTY {TM1FILTERBYLEVEL({TM1SUBSETALL([DIM1].[DIM1])},0)} ON 1\r\n"
            "FROM [CUBE]", mdx)
Esempio n. 25
0
    def _build_drill_intersection_mdx(dimension_name: str, hierarchy_name: str,
                                      first_element_name: str,
                                      second_element_name: str,
                                      mdx_method: str, recursive: bool) -> str:

        first_member = Member.of(dimension_name, hierarchy_name,
                                 first_element_name)
        second_member = Member.of(dimension_name, hierarchy_name,
                                  second_element_name)

        if not hasattr(MDXDrillMethod, mdx_method.upper()):
            raise TM1pyException(
                'Invalid MDX Drill Method Specified, Options: TM1DrillDownMember or Descendants'
            )
        elif MDXDrillMethod.TM1DRILLDOWNMEMBER.name == mdx_method.upper():
            mdx = MdxHierarchySet.members([first_member]).tm1_drill_down_member(all=True, recursive=recursive) \
                .intersect(MdxHierarchySet.members([second_member])).to_mdx()
        elif MDXDrillMethod.DESCENDANTS.name == mdx_method.upper():
            mdx = MdxHierarchySet.descendants(
                first_member, MdxLevelExpression.member_level(first_member),
                'SELF_AND_AFTER')
        return mdx
Esempio n. 26
0
    def test_calculated_member_lookup(self):
        calculated_member = CalculatedMember.lookup(
            "Period",
            "Period",
            "VersionAttribute1",
            cube="}ELEMENTATTRIBUTES_version",
            mdx_tuple=MdxTuple.of(
                Member.of("}ELEMENTATTRIBUTES_version", "Attribute1")))

        self.assertEqual(
            calculated_member.to_mdx(),
            "MEMBER [period].[period].[versionattribute1] AS [}elementattributes_version]."
            "([}elementattributes_version].[}elementattributes_version].[attribute1])"
        )
Esempio n. 27
0
    def test_mdx_build_with_multi_calculated_member(self):
        mdx = MdxBuilder.from_cube(cube="Cube").with_member(
            CalculatedMember.avg(
                dimension="Period",
                hierarchy="Period",
                element="AVG 2016",
                cube="Cube",
                mdx_set=MdxHierarchySet.children(member=Member.of("Period", "2016")),
                mdx_tuple=MdxTuple.of(Member.of("Dim1", "Total Dim1"),
                                      Member.of("Dim2", "Total Dim2")))) \
            .with_member(
            CalculatedMember.sum(
                dimension="Period",
                hierarchy="Period",
                element="SUM 2016",
                cube="Cube",
                mdx_set=MdxHierarchySet.children(member=Member.of("Period", "2016")),
                mdx_tuple=MdxTuple.of(Member.of("Dim1", "Total Dim1"),
                                      Member.of("Dim2", "Total Dim2")))) \
            .rows_non_empty() \
            .add_hierarchy_set_to_row_axis(MdxHierarchySet.all_leaves("DIM1", "DIM1")) \
            .columns_non_empty() \
            .add_hierarchy_set_to_column_axis(
            MdxHierarchySet.members(members=[Member.of("Period", "AVG 2016"), Member.of("Period", "SUM 2016")])) \
            .where(Member.of("Dim2", "Total Dim2")) \
            .to_mdx()

        self.assertEqual(
            "WITH\r\n"
            "MEMBER [PERIOD].[PERIOD].[AVG2016] AS AVG({[PERIOD].[PERIOD].[2016].CHILDREN},"
            "[CUBE].([DIM1].[DIM1].[TOTALDIM1],[DIM2].[DIM2].[TOTALDIM2]))\r\n"
            "MEMBER [PERIOD].[PERIOD].[SUM2016] AS SUM({[PERIOD].[PERIOD].[2016].CHILDREN},"
            "[CUBE].([DIM1].[DIM1].[TOTALDIM1],[DIM2].[DIM2].[TOTALDIM2]))\r\n"
            "SELECT\r\n"
            "NON EMPTY {[PERIOD].[PERIOD].[AVG2016],[PERIOD].[PERIOD].[SUM2016]} ON 0,\r\n"
            "NON EMPTY {TM1FILTERBYLEVEL({TM1SUBSETALL([DIM1].[DIM1])},0)} ON 1\r\n"
            "FROM [CUBE]\r\n"
            "WHERE ([DIM2].[DIM2].[TOTALDIM2])",
            mdx)
Esempio n. 28
0
    def test_mdx_set_tuples(self):
        mdx_set = MdxSet.tuples([
            MdxTuple([
                Member.of("dimension1", "element1"),
                Member.of("dimension2", "element3")
            ]),
            MdxTuple([
                Member.of("dimension1", "element2"),
                Member.of("dimension2", "element2")
            ]),
            MdxTuple([
                Member.of("dimension1", "element3"),
                Member.of("dimension2", "element1")
            ])
        ])

        self.assertEqual(
            "{ ([dimension1].[dimension1].[element1],[dimension2].[dimension2].[element3]),"
            "([dimension1].[dimension1].[element2],[dimension2].[dimension2].[element2]),"
            "([dimension1].[dimension1].[element3],[dimension2].[dimension2].[element1]) }",
            mdx_set.to_mdx())
Esempio n. 29
0
 def test_member_unique_name_with_hierarchy(self):
     element = Member.of("Dim", "Hier", "Elem")
     self.assertEqual(element.unique_name, "[DIM].[HIER].[ELEM]")
Esempio n. 30
0
 def test_member_of_error(self):
     with pytest.raises(ValueError):
         Member.of("Dim")