Sorry for delayed response.

@Abdel,
I have put both jars in 3rdparty jars. My other UDFs are working fine.

@Nathan
I tried this still same issue.

May be I am doing some silly mistake.

*Complete Code :*

package com.games24x7.drill;

import java.util.Date;

import javax.inject.Inject;

import org.apache.drill.exec.expr.DrillSimpleFunc;
import org.apache.drill.exec.expr.annotations.FunctionTemplate;
import org.apache.drill.exec.expr.annotations.Output;
import org.apache.drill.exec.expr.annotations.Param;
import org.apache.drill.exec.expr.holders.IntHolder;
import org.apache.drill.exec.expr.holders.NullableVarCharHolder;
import org.apache.drill.exec.expr.holders.VarCharHolder;

import io.netty.buffer.DrillBuf;
import net.sourceforge.wurfl.core.Device;
import net.sourceforge.wurfl.core.EngineTarget;

@FunctionTemplate(name = "GetBrowserDtl", scope =
FunctionTemplate.FunctionScope.SIMPLE, nulls =
FunctionTemplate.NullHandling.NULL_IF_NULL)
public  class BrowserFuncNew implements DrillSimpleFunc {

    @Param
    NullableVarCharHolder userAgent;
    @Param
    IntHolder option;
    @Output
    VarCharHolder outValue;
    @Inject
    DrillBuf buffer;
    @Inject
    net.sourceforge.wurfl.core.GeneralWURFLEngine wurfl;
    public void setup() {
        // TODO Auto-generated method stub
        //wurfl = new
net.sourceforge.wurfl.core.GeneralWURFLEngine("wurfl.xml");
    }

    public void eval() {
        String stringOutValue = "null";

        try {
            wurfl = new
net.sourceforge.wurfl.core.GeneralWURFLEngine("/home/nirav/wurfl.xml");
    //        String SUA =
org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(userAgent.start,
userAgent.end, userAgent.buffer);


/*            String[] capabilities = {
                    "device_os",
                    "device_os_version",
                    "is_tablet",
                    "is_wireless_device",
                    "pointing_method",
                    "preferred_markup",
                    "resolution_height",
                    "resolution_width",
                    "ux_full_desktop",
                    "xhtml_support_level",
                    "is_smarttv",
                    "can_assign_phone_number",
                    "brand_name",
                    "model_name",
                    "marketing_name",
                    "mobile_browser_version"
                };
            wurfl.setEngineTarget(EngineTarget.accuracy);
            wurfl.setCapabilityFilter(capabilities);
            Device device = wurfl.getDeviceForRequest(SUA);
            System.out.println("4-->"+new Date(
System.currentTimeMillis()));
            System.out.println("Device OS: " +
device.getCapability("device_os"));
            System.out.println("Device OS version: " +
device.getCapability("device_os_version"));
            System.out.println("Brand name: " +
device.getCapability("brand_name"));
            System.out.println("advertised_device_os_version: " +
device.getCapability("advertised_device_os_version"));
            System.out.println("advertised_device_os: " +
device.getCapability("advertised_device_os"));
            System.out.println("advertised_browser: " +
device.getCapability("advertised_browser"));

System.out.println("advertised_browser_version:"+device.getCapability("advertised_browser_version"));
            stringOutValue = device.getCapability("device_os_version");
*/
            byte[] valueDecoded = stringOutValue.getBytes();
            outValue.buffer = buffer.reallocIfNeeded(valueDecoded.length);
            outValue.start = 0;
            outValue.end = valueDecoded.length;
            buffer.setBytes(0, valueDecoded);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            //stringOutValue = "null6";
            byte[] valueDecoded = e.getMessage().getBytes();
            outValue.buffer = buffer.reallocIfNeeded(valueDecoded.length);
            outValue.start = 0;
            outValue.end = valueDecoded.length;
            buffer.setBytes(0, valueDecoded);

        }

    }
}
// select GetBrowserDtl('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36',1) from (values(1));
//select GetBrowserDtl('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0)
Gecko/20100101 Firefox/31.0',1) from (values(1));
//select GetBrowserDtl('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0)
Gecko/20100101 Firefox/31.0',1) from (values(1));

*Result:*

0: jdbc:drill:zk=local> select GetBrowserDtl('Mozilla/5.0 (X11; Linux
x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80
Safari/537.36',1) from (values(1));
Jan 08, 2016 12:14:17 PM
org.apache.calcite.sql.validate.SqlValidatorException <init>
SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: No match
found for function signature GetBrowserDtl(<CHARACTER>, <NUMERIC>)
Jan 08, 2016 12:14:17 PM org.apache.calcite.runtime.CalciteException <init>
SEVERE: org.apache.calcite.runtime.CalciteContextException: From line 1,
column 8 to line 1, column 130: No match found for function signature
GetBrowserDtl(<CHARACTER>, <NUMERIC>)
Error: VALIDATION ERROR: From line 1, column 8 to line 1, column 130: No
match found for function signature GetBrowserDtl(<CHARACTER>, <NUMERIC>)


[Error Id: 5a8c24d3-1b26-4dfd-be6d-615ba051ad1c on nirav:31010]
(state=,code=0)


On Thu, Jan 7, 2016 at 2:55 AM, Nathan Griffith <[email protected]>
wrote:

> Hi Nirav!
>
> A couple thoughts: a.) To help troubleshoot, you may want to prepend
> the full path of "wurfl.xml" in the first statement of your code, b.)
> So when you try to use the UDF in a query you get absolutely no error
> messages from Drill?
>
> Also, the first part of this article
> (
> http://www.dremio.com/blog/querying-google-analytics-json-with-a-custom-sql-function/
> )
> makes a good resource for telling Drill how to pick up on a new UDF.
>
> Best,
> Nathan
>
> On Wed, Jan 6, 2016 at 10:23 AM, Abdel Hakim Deneche
> <[email protected]> wrote:
> > According to Drill documentation:
> >
> > http://drill.apache.org/docs/adding-custom-functions-to-drill/
> >
> > You need to copy both class jar and source jar of your UDF to
> > $DRILL_HOME/jars/3rdparty/
> >
> > did you do it ?
> >
> > On Tue, Jan 5, 2016 at 11:58 PM, Nirav Shah <[email protected]>
> > wrote:
> >
> >> Hi ,
> >>
> >>
> >> I am trying to extract info from user agent using WURFL libraries.
> >>
> >> I am not sure what's wrong I am doing here but it's not working and not
> >> giving any errors as well.
> >>
> >> I have put wurfl.xml in source folder and  wurfl<version>.jar to
> >> /jar/3rdparty/
> >>
> >> *Code :*
> >>
> >>         wurfl = new
> >> net.sourceforge.wurfl.core.GeneralWURFLEngine("wurfl.xml");
> >>             String SUA =
> >>
> >>
> org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(userAgent.start,
> >> userAgent.end, userAgent.buffer);
> >>
> >>
> >>             String[] capabilities = {
> >>                     "device_os",
> >>                     "device_os_version",
> >>                     "is_tablet",
> >>                     "is_wireless_device",
> >>                     "pointing_method",
> >>                     "preferred_markup",
> >>                     "resolution_height",
> >>                     "resolution_width",
> >>                     "ux_full_desktop",
> >>                     "xhtml_support_level",
> >>                     "is_smarttv",
> >>                     "can_assign_phone_number",
> >>                     "brand_name",
> >>                     "model_name",
> >>                     "marketing_name",
> >>                     "mobile_browser_version"
> >>                 };
> >>             wurfl.setEngineTarget(EngineTarget.accuracy);
> >>             wurfl.setCapabilityFilter(capabilities);
> >>             Device device = wurfl.getDeviceForRequest(SUA);
> >>             System.out.println("4-->"+new Date(
> >> System.currentTimeMillis()));
> >>             System.out.println("Device OS: " +
> >> device.getCapability("device_os"));
> >>             System.out.println("Device OS version: " +
> >> device.getCapability("device_os_version"));
> >>             System.out.println("Brand name: " +
> >> device.getCapability("brand_name"));
> >>             System.out.println("advertised_device_os_version: " +
> >> device.getCapability("advertised_device_os_version"));
> >>             System.out.println("advertised_device_os: " +
> >> device.getCapability("advertised_device_os"));
> >>             System.out.println("advertised_browser: " +
> >> device.getCapability("advertised_browser"));
> >>
> >>
> >>
> System.out.println("advertised_browser_version:"+device.getCapability("advertised_browser_version"));
> >>             stringOutValue = device.getCapability("device_os_version");
> >>
> >>
> >> Regards,
> >> Nirav
> >>
> >
> >
> >
> > --
> >
> > Abdelhakim Deneche
> >
> > Software Engineer
> >
> >   <http://www.mapr.com/>
> >
> >
> > Now Available - Free Hadoop On-Demand Training
> > <
> http://www.mapr.com/training?utm_source=Email&utm_medium=Signature&utm_campaign=Free%20available
> >
>

Reply via email to