Hi Henry, there’s https://issues.apache.org/jira/browse/CASSANDRA-10818 <https://issues.apache.org/jira/browse/CASSANDRA-10818> to allow creation of UDTs and tuples.
Robert — Robert Stupp @snazy > On Apr 8, 2016, at 07:12, Henry M <henrymanm...@gmail.com> wrote: > > Whatever I wanted to do does not seem to be possible (probably a limitation > or a bug)... I see a way to get the KeyspaceMetadata and from that get the > UserType instance (code lines 1 & 2 below). > > 1.) > org.apache.cassandra.schema.KeyspaceMetadata ksm = > org.apache.cassandra.config.Schema.instance.getKSMetaData("test_ks"); > > 2.) > com.datastax.driver.core.UserType myUdt = ksm.types.get("my_other_udt").get(); > > But this fails with the below error because Schema is not a whitelisted > package. It probably should not be whitelisted but there should be a way to > create and return a user defined type. > > <stdin>:88:InvalidRequest: code=2200 [Invalid query] message="Could not > compile function 'test_ks.transform_udt' from Java source: > org.apache.cassandra.exceptions.InvalidRequestException: Java source > compilation failed: > Line 4: org.apache.cassandra.schema.KeyspaceMetadata cannot be resolved to a > type > Line 4: org.apache.cassandra.config.Schema.instance cannot be resolved to a > type > " > <stdin>:90:InvalidRequest: code=2200 [Invalid query] message="Unknown > function 'extract_text_field_sample_udt'" > > My updated UDF for complete context. > > CREATE OR REPLACE FUNCTION test_ks.transform_udt (val my_udt) > RETURNS NULL ON NULL INPUT > RETURNS my_other_udt > LANGUAGE java > AS ' > String fieldA = val.getString("field_a"); > > org.apache.cassandra.schema.KeyspaceMetadata ksm = > org.apache.cassandra.config.Schema.instance.getKSMetaData("test_ks"); > > com.datastax.driver.core.UserType myUdt = > ksm.types.get("my_other_udt").get(); > > com.datastax.driver.core.UDTValue transformedValue = myUdt.newValue(); > > transformedValue.setUUID("id", java.util.UUID.randomUUID()); > transformedValue.setString("field_a", fieldA); > transformedValue.setString("field_b", "value b"); > > return transformedValue; > '; > > > On Thu, Apr 7, 2016 at 7:40 PM Henry M <henrymanm...@gmail.com > <mailto:henrymanm...@gmail.com>> wrote: > I was wondering if it is possible to create an UDT and return it within a > user defined function. > > I looked at this documentation > http://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateUDF.html > <http://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateUDF.html> but the > examples are only for basic types. > > This is my pseudo code I came up with... the part I think I am missing is how > to get an instance of the UserType so that I can invoke newValue to create a > UDTValue. > > Has anyone done this and know how to get the keyspace in order to call > getUserType? Or know of an alternate approach? > > CREATE OR REPLACE FUNCTION test_ks.transform_udt (val my_udt) > RETURNS NULL ON NULL INPUT > RETURNS my_other_udt > LANGUAGE java > AS ' > String fieldA = val.getString("field_a"); > > // How do you get a reference the user type? > UserType myUdt = ?keyspace?.getUserType("my_other_udt"); > > UDTValue transformedValue = myUdt.newValue(); > > transformedValue.setUUID("id", UUID.randomUUID()); > transformedValue.setString("field_a", fieldA); > transformedValue.setString("field_b", "value b"); > > return transformedValue; > '; > > > Thank you, > Henry > > > P.S. This is the setup for my sample table and types. > drop keyspace test_ks; > > create keyspace test_ks WITH REPLICATION = { 'class' : 'SimpleStrategy', > 'replication_factor' : 1 }; > > use test_ks; > > CREATE TYPE IF NOT EXISTS test_ks.my_udt (field_a text, field_b text); > CREATE TYPE IF NOT EXISTS test_ks.my_other_udt (id uuid, field_a text, > field_b text); > > CREATE TABLE IF NOT EXISTS test_ks.sample_table(id uuid primary key, col_a > frozen<test_ks.my_udt>); > > INSERT INTO sample_table(id, col_a) VALUES ( now() , { field_a: 'value 1', > field_b: 'value 2'} ); > INSERT INTO sample_table(id) VALUES ( now() ); > > > > >
signature.asc
Description: Message signed with OpenPGP using GPGMail