You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pig.apache.org by "Ajay Garg (JIRA)" <ji...@apache.org> on 2008/06/17 11:27:45 UTC

[jira] Updated: (PIG-255) Calling non default constructor of Final class from Main class in UDF

     [ https://issues.apache.org/jira/browse/PIG-255?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ajay Garg updated PIG-255:
--------------------------

    Attachment: cons.patch
                test.patch

Hi,
     I am attaching two patch to explain and resolve this issue . First is test.patch which create TestUDF.java and modify build.xml to run this test case. run "ant udftest" to run this test case. In this test case I return Final.class.getName() + "(" schema name + ")" in getFinal() method. Calling final class with arguments should be right way doing but it gives following error. 
  java.lang.ClassNotFoundException: Could not resolve org.apache.pig.test.TestUDF$Test$Final('a') using imports: [, org.apache.pig.builtin., com.yahoo.pig.yst.sds.ULT., org.apache.pig.impl.builtin.]

The reason for this problem is that resolveClassName method doesn't think of its args as specs and assumes them to be just names. So in createJar, when the func spec TestUDF$Test$Final(a') is being resolved it fails.

The second patch cons.patch resolve this problem. It finds class name in resovleClassName by searching for index of "(" which I think should be the correct way of resolving this .
Please give your feedbacks .
Thanks

> Calling non default constructor of Final class from Main class in UDF
> ---------------------------------------------------------------------
>
>                 Key: PIG-255
>                 URL: https://issues.apache.org/jira/browse/PIG-255
>             Project: Pig
>          Issue Type: Improvement
>            Reporter: Ajay Garg
>            Priority: Minor
>         Attachments: cons.patch, test.patch
>
>
> Pig supports the use of define to call a non default constructor. Making it work across Algebraic functions is not possible with the current code. The problem is once the func is defined to use a non default constructor which takes in names of the variables, we have no way of transmitting this information from the main class to the final class. We tried passing the func spec through the call to getFinal(). That is, What ever names we get in the main class we store it and when the getFinal method is called, instead of just passing the name of the Final class we attach the string args received by the main class to the name to construct a func spec. For ex. if define COV = Covariance('Population', 'Height'); Then we would have the "Population' & 'Height' stored in the main class. A call to getFinal would return Covariance$Final("Population", "Height") instead of just Covariance$Final. I guess this is the right way to go. However, pig has a problem with this. The resolveClassName method doesn't think of its args as specs and assumes them to be just names. So in createJar, when the func spec, Covariance$Final("Population", "Height") is being resolved it fails. I think this is an issue with pig and we need to resolve it by clipping the args before doing a resolveClassName. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.