blob: 3bbf04bb7af4fcd6c3809a7d5d9d46bcf6668f73 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from tests.integration import DSE_VERSION, requiredse
from tests.integration.advanced import BasicGeometricUnitTestCase, use_single_node_with_graph
from cassandra.util import OrderedMap, sortedset
from collections import namedtuple
import unittest
from uuid import uuid1
from cassandra.util import Point, LineString, Polygon
from cassandra.cqltypes import LineStringType, PointType, PolygonType
def setup_module():
if DSE_VERSION:
use_single_node_with_graph()
class AbstractGeometricTypeTest():
original_value = ""
def test_should_insert_simple(self):
"""
This tests will attempt to insert a point, polygon, or line, using simple inline formatting.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried.
"""
uuid_key = uuid1()
self.session.execute("INSERT INTO tbl (k, g) VALUES (%s, %s)", [uuid_key, self.original_value])
self.validate('g', uuid_key, self.original_value)
def test_should_insert_simple_prepared(self):
"""
This tests will attempt to insert a point, polygon, or line, using prepared statements.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried.
"""
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, g) VALUES (?, ?)")
self.session.execute(prepared, (uuid_key, self.original_value))
self.validate('g', uuid_key, self.original_value)
def test_should_insert_simple_prepared_with_bound(self):
"""
This tests will attempt to insert a point, polygon, or line, using prepared statements and bind.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried.
"""
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, g) VALUES (?, ?)")
bound_statement = prepared.bind((uuid_key, self.original_value))
self.session.execute(bound_statement)
self.validate('g', uuid_key, self.original_value)
def test_should_insert_as_list(self):
"""
This tests will attempt to insert a point, polygon, or line, as values of list.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried as a list.
"""
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, l) VALUES (?, ?)")
bound_statement = prepared.bind((uuid_key, [self.original_value]))
self.session.execute(bound_statement)
self.validate('l', uuid_key, [self.original_value])
def test_should_insert_as_set(self):
"""
This tests will attempt to insert a point, polygon, or line, as values of set.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried as a set.
"""
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, s) VALUES (?, ?)")
bound_statement = prepared.bind((uuid_key, sortedset([self.original_value])))
self.session.execute(bound_statement)
self.validate('s', uuid_key, sortedset([self.original_value]))
def test_should_insert_as_map_keys(self):
"""
This tests will attempt to insert a point, polygon, or line, as keys of a map.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried as keys of a map.
"""
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, m0) VALUES (?, ?)")
bound_statement = prepared.bind((uuid_key, OrderedMap(zip([self.original_value], [1]))))
self.session.execute(bound_statement)
self.validate('m0', uuid_key, OrderedMap(zip([self.original_value], [1])))
def test_should_insert_as_map_values(self):
"""
This tests will attempt to insert a point, polygon, or line, as values of a map.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried as values of a map.
"""
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, m1) VALUES (?, ?)")
bound_statement = prepared.bind((uuid_key, OrderedMap(zip([1], [self.original_value]))))
self.session.execute(bound_statement)
self.validate('m1', uuid_key, OrderedMap(zip([1], [self.original_value])))
def test_should_insert_as_tuple(self):
"""
This tests will attempt to insert a point, polygon, or line, as values of a tuple.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried as values of a tuple.
"""
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, t) VALUES (?, ?)")
bound_statement = prepared.bind((uuid_key, (self.original_value, self.original_value, self.original_value)))
self.session.execute(bound_statement)
self.validate('t', uuid_key, (self.original_value, self.original_value, self.original_value))
def test_should_insert_as_udt(self):
"""
This tests will attempt to insert a point, polygon, or line, as members of a udt.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried as members of a udt.
"""
UDT1 = namedtuple('udt1', ('g'))
self.cluster.register_user_type(self.ks_name, 'udt1', UDT1)
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, u) values (?, ?)")
bound_statement = prepared.bind((uuid_key, UDT1(self.original_value)))
self.session.execute(bound_statement)
rs = self.session.execute("SELECT {0} from {1} where k={2}".format('u', 'tbl', uuid_key))
retrieved_udt = rs[0]._asdict()['u']
self.assertEqual(retrieved_udt.g, self.original_value)
def test_should_accept_as_partition_key(self):
"""
This tests will attempt to insert a point, polygon, or line, as a partition key.
@since 3.20
@jira_ticket PYTHON-456
@test_category dse geometric
@expected_result geometric types should be able to be inserted and queried as a partition key.
"""
prepared = self.session.prepare("INSERT INTO tblpk (k, v) VALUES (?, ?)")
bound_statement = prepared.bind((self.original_value, 1))
self.session.execute(bound_statement)
rs = self.session.execute("SELECT k, v FROM tblpk")
foundpk = rs[0]._asdict()['k']
self.assertEqual(foundpk, self.original_value)
def validate(self, value, key, expected):
"""
Simple utility method used for validation of inserted types.
"""
rs = self.session.execute("SELECT {0} from tbl where k={1}".format(value, key))
retrieved = rs[0]._asdict()[value]
self.assertEqual(expected, retrieved)
def test_insert_empty_with_string(self):
"""
This tests will attempt to insert a point, polygon, or line, as Empty
@since 3.20
@jira_ticket PYTHON-481
@test_category dse geometric
@expected_result EMPTY as a keyword should be honored
"""
uuid_key = uuid1()
self.session.execute("INSERT INTO tbl (k, g) VALUES (%s, %s)", [uuid_key, self.empty_statement])
self.validate('g', uuid_key, self.empty_value)
def test_insert_empty_with_object(self):
"""
This tests will attempt to insert a point, polygon, or line, as Empty
@since 3.20
@jira_ticket PYTHON-481
@test_category dse geometric
@expected_result EMPTY as a keyword should be used with empty objects
"""
uuid_key = uuid1()
prepared = self.session.prepare("INSERT INTO tbl (k, g) VALUES (?, ?)")
self.session.execute(prepared, (uuid_key, self.empty_value))
self.validate('g', uuid_key, self.empty_value)
@requiredse
class BasicGeometricPointTypeTest(AbstractGeometricTypeTest, BasicGeometricUnitTestCase):
"""
Runs all the geometric tests against PointType
"""
cql_type_name = "'{0}'".format(PointType.typename)
original_value = Point(.5, .13)
@unittest.skip("Empty String")
def test_insert_empty_with_string(self):
pass
@unittest.skip("Empty String")
def test_insert_empty_with_object(self):
pass
@requiredse
class BasicGeometricLineStringTypeTest(AbstractGeometricTypeTest, BasicGeometricUnitTestCase):
"""
Runs all the geometric tests against LineStringType
"""
cql_type_name = cql_type_name = "'{0}'".format(LineStringType.typename)
original_value = LineString(((1, 2), (3, 4), (9871234, 1235487215)))
empty_statement = 'LINESTRING EMPTY'
empty_value = LineString()
@requiredse
class BasicGeometricPolygonTypeTest(AbstractGeometricTypeTest, BasicGeometricUnitTestCase):
"""
Runs all the geometric tests against PolygonType
"""
cql_type_name = cql_type_name = "'{0}'".format(PolygonType.typename)
original_value = Polygon([(10.0, 10.0), (110.0, 10.0), (110., 110.0), (10., 110.0), (10., 10.0)], [[(20., 20.0), (20., 30.0), (30., 30.0), (30., 20.0), (20., 20.0)], [(40., 20.0), (40., 30.0), (50., 30.0), (50., 20.0), (40., 20.0)]])
empty_statement = 'POLYGON EMPTY'
empty_value = Polygon()