You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@drill.apache.org by "Paul Rogers (JIRA)" <ji...@apache.org> on 2018/08/08 00:31:00 UTC

[jira] [Updated] (DRILL-6672) Drill table functions cannot handle "setFoo" accessors

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

Paul Rogers updated DRILL-6672:
-------------------------------
    Description: 
Consider an example format plugin, such as the regex one used in the Drill book. (GitHub reference needed.) We can define the plugin using getters and setters like this:

{code}
public class RegexFormatConfig implements FormatPluginConfig {

  private String regex;
  private String fields;
  private String extension;

  public void setRegex(String regex) { this.regex = regex; }
  public void setFields(String fields) { this.fields = fields; }
  public void setExtension(String extension) { this.extension = extension; }
{code}

We can then create a plugin configuration using the Drill Web console, the {{bootstrap-storage-plugins.json}} and so on. All work fine.

Suppose we try to define a configuration using a Drill table function:

{code}
      final String sql = "SELECT * FROM table(cp.`regex/simple.log2`\n" +
          "(type => 'regex',\n" +
          " extension => 'log2',\n" +
          " regex => '(\\\\d\\\\d\\\\d\\\\d)-(\\\\d\\\\d)-(\\\\d\\\\d) .*',\n" +
          " fields => 'a, b, c, d'))";
{code}

We get this error:

{noformat}
org.apache.drill.common.exceptions.UserRemoteException: PARSE ERROR: 
can not set value (\d\d\d\d)-(\d\d)-(\d\d) .* to parameter regex: class java.lang.String

table regex/simple.log2
parameter regex
{noformat}

The reason is that the code that handles table functions only knows how to set public fields, it does not know about the Java Bean getter/setter conventions used by Jackson:

{code}
package org.apache.drill.exec.store.dfs;
...
final class FormatPluginOptionsDescriptor {
  ...
  FormatPluginConfig createConfigForTable(TableInstance t) {
    ...
        Field field = pluginConfigClass.getField(paramDef.name);
        ...
        }
        field.set(config, param);
      } catch (IllegalAccessException | NoSuchFieldException | SecurityException e) {
        throw UserException.parseError(e)
            .message("can not set value %s to parameter %s: %s", param, paramDef.name, paramDef.type)
            ...
{code}

The only workaround is to make all fields public:

{code}
public class RegexFormatConfig implements FormatPluginConfig {

  public String regex;
  public String fields;
  public String extension;
{code}

Since public fields are not good practice, please modify the table function mechanism to follow Jackson conventions and allow Java Bean style setters. (Or better, fix DRILL-6673 to allow immutable format objects via the use of a constructor.)

  was:
Consider an example format plugin, such as the regex one used in the Drill book. (GitHub reference needed.) We can define the plugin using getters and setters like this:

{code}
public class RegexFormatConfig implements FormatPluginConfig {

  private String regex;
  private String fields;
  private String extension;

  public void setRegex(String regex) { this.regex = regex; }
  public void setFields(String fields) { this.fields = fields; }
  public void setExtension(String extension) { this.extension = extension; }
{code}

We can then create a plugin configuration using the Drill Web console, the {{bootstrap-storage-plugins.json}} and so on. All work fine.

Suppose we try to define a configuration using a Drill table function:

{code}
      final String sql = "SELECT * FROM table(cp.`regex/simple.log2`\n" +
          "(type => 'regex',\n" +
          " extension => 'log2',\n" +
          " regex => '(\\\\d\\\\d\\\\d\\\\d)-(\\\\d\\\\d)-(\\\\d\\\\d) .*',\n" +
          " fields => 'a, b, c, d'))";
{code}

We get this error:

{noformat}
org.apache.drill.common.exceptions.UserRemoteException: PARSE ERROR: 
can not set value (\d\d\d\d)-(\d\d)-(\d\d) .* to parameter regex: class java.lang.String

table regex/simple.log2
parameter regex
{noformat}

The reason is that the code that handles table functions only knows how to set public fields, it does not know about the Java Bean getter/setter conventions used by Jackson:

{code}
package org.apache.drill.exec.store.dfs;
...
final class FormatPluginOptionsDescriptor {
  ...
  FormatPluginConfig createConfigForTable(TableInstance t) {
    ...
        Field field = pluginConfigClass.getField(paramDef.name);
        ...
        }
        field.set(config, param);
      } catch (IllegalAccessException | NoSuchFieldException | SecurityException e) {
        throw UserException.parseError(e)
            .message("can not set value %s to parameter %s: %s", param, paramDef.name, paramDef.type)
            ...
{code}

The only workaround is to make all fields public:

{code}
public class RegexFormatConfig implements FormatPluginConfig {

  public String regex;
  public String fields;
  public String extension;
{code}

Since public fields are not good practice, please modify the table function mechanism to follow Jackson conventions and allow Java Bean style setters. (Or better, fix DRILL-xxxx to allow immutable format objects via the use of a constructor.)


> Drill table functions cannot handle "setFoo" accessors
> ------------------------------------------------------
>
>                 Key: DRILL-6672
>                 URL: https://issues.apache.org/jira/browse/DRILL-6672
>             Project: Apache Drill
>          Issue Type: Bug
>    Affects Versions: 1.13.0
>            Reporter: Paul Rogers
>            Priority: Minor
>
> Consider an example format plugin, such as the regex one used in the Drill book. (GitHub reference needed.) We can define the plugin using getters and setters like this:
> {code}
> public class RegexFormatConfig implements FormatPluginConfig {
>   private String regex;
>   private String fields;
>   private String extension;
>   public void setRegex(String regex) { this.regex = regex; }
>   public void setFields(String fields) { this.fields = fields; }
>   public void setExtension(String extension) { this.extension = extension; }
> {code}
> We can then create a plugin configuration using the Drill Web console, the {{bootstrap-storage-plugins.json}} and so on. All work fine.
> Suppose we try to define a configuration using a Drill table function:
> {code}
>       final String sql = "SELECT * FROM table(cp.`regex/simple.log2`\n" +
>           "(type => 'regex',\n" +
>           " extension => 'log2',\n" +
>           " regex => '(\\\\d\\\\d\\\\d\\\\d)-(\\\\d\\\\d)-(\\\\d\\\\d) .*',\n" +
>           " fields => 'a, b, c, d'))";
> {code}
> We get this error:
> {noformat}
> org.apache.drill.common.exceptions.UserRemoteException: PARSE ERROR: 
> can not set value (\d\d\d\d)-(\d\d)-(\d\d) .* to parameter regex: class java.lang.String
> table regex/simple.log2
> parameter regex
> {noformat}
> The reason is that the code that handles table functions only knows how to set public fields, it does not know about the Java Bean getter/setter conventions used by Jackson:
> {code}
> package org.apache.drill.exec.store.dfs;
> ...
> final class FormatPluginOptionsDescriptor {
>   ...
>   FormatPluginConfig createConfigForTable(TableInstance t) {
>     ...
>         Field field = pluginConfigClass.getField(paramDef.name);
>         ...
>         }
>         field.set(config, param);
>       } catch (IllegalAccessException | NoSuchFieldException | SecurityException e) {
>         throw UserException.parseError(e)
>             .message("can not set value %s to parameter %s: %s", param, paramDef.name, paramDef.type)
>             ...
> {code}
> The only workaround is to make all fields public:
> {code}
> public class RegexFormatConfig implements FormatPluginConfig {
>   public String regex;
>   public String fields;
>   public String extension;
> {code}
> Since public fields are not good practice, please modify the table function mechanism to follow Jackson conventions and allow Java Bean style setters. (Or better, fix DRILL-6673 to allow immutable format objects via the use of a constructor.)



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)