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

Igor Suhorukov updated ARROW-17431:
-----------------------------------
    Description: 
Typical real life Arrow datasets contain Map type vectors of string key->string 
value. Looks logically implement default JDBC parameter binders for such vector 
type or implement some kind on binder code extensibility of core framework via 
MetaINF/ServiceLocator

Current implementation just [throws 
UnsupportedOperationException|https://github.com/apache/arrow/blob/master/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/binder/ColumnBinderArrowTypeVisitor.java#L100]]

 
{code:java}
  @Override
        
        
            public ColumnBinder visit(ArrowType.Map type) {
        
        
              throw new UnsupportedOperationException("No column binder 
implemented for type " + type);
        
        
            } {code}
 
My current implementation patch ColumnBinderArrowTypeVisitor in classpath to 
return MapBinder

{code:java}
    @Override
    public ColumnBinder visit(ArrowType.Map type) {
        return  new MapBinder((MapVector) vector);
    }
{code}

and following code works for me with H2 database and in java stored PostgreSQL 
function in PL/Java to bind Map(string,string) parameter to JDBC:

{code:java}
package org.apache.arrow.adapter.jdbc.binder;

import org.apache.arrow.vector.complex.MapVector;
import org.apache.arrow.vector.complex.impl.UnionMapReader;
import org.apache.arrow.vector.util.JsonStringHashMap;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.LinkedHashMap;

public class MapBinder extends BaseColumnBinder<MapVector> {

    private UnionMapReader reader;

    public MapBinder(MapVector vector) {
        this(vector, Types.VARCHAR);
    }

    public MapBinder(MapVector vector, int jdbcType) {
        super(vector, jdbcType);
        reader = vector.getReader();
    }

    @Override
    public void bind(PreparedStatement statement, int parameterIndex, int 
rowIndex) throws SQLException {
        reader.setPosition(rowIndex);
        LinkedHashMap<String, String> tags = new JsonStringHashMap<>();
        while (reader.next()){
            tags.put(reader.key().readText().toString(), 
reader.value().readText().toString());
        }
        statement.setString(parameterIndex, tags.toString());
    }
}
{code}

 

  was:
Typical real life Arrow datasets contain Map type vectors of string key->string 
value. Looks logically implement default JDBC parameter binders for such vector 
type or implement some kind on binder code extensibility of core framework via 
MetaINF/ServiceLocator

Current implementation just [throws 
UnsupportedOperationException|https://github.com/apache/arrow/blob/master/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/binder/ColumnBinderArrowTypeVisitor.java#L100]]

 
{code:java}
  @Override
        
        
            public ColumnBinder visit(ArrowType.Map type) {
        
        
              throw new UnsupportedOperationException("No column binder 
implemented for type " + type);
        
        
            } {code}
 

 


> CLONE - [Java] MapBinder to bind Arrow List type to DB column 
> --------------------------------------------------------------
>
>                 Key: ARROW-17431
>                 URL: https://issues.apache.org/jira/browse/ARROW-17431
>             Project: Apache Arrow
>          Issue Type: Improvement
>          Components: Java
>    Affects Versions: 10.0.0
>            Reporter: Igor Suhorukov
>            Priority: Major
>
> Typical real life Arrow datasets contain Map type vectors of string 
> key->string value. Looks logically implement default JDBC parameter binders 
> for such vector type or implement some kind on binder code extensibility of 
> core framework via MetaINF/ServiceLocator
> Current implementation just [throws 
> UnsupportedOperationException|https://github.com/apache/arrow/blob/master/java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/binder/ColumnBinderArrowTypeVisitor.java#L100]]
>  
> {code:java}
>   @Override
>         
>         
>             public ColumnBinder visit(ArrowType.Map type) {
>         
>         
>               throw new UnsupportedOperationException("No column binder 
> implemented for type " + type);
>         
>         
>             } {code}
>  
> My current implementation patch ColumnBinderArrowTypeVisitor in classpath to 
> return MapBinder
> {code:java}
>     @Override
>     public ColumnBinder visit(ArrowType.Map type) {
>         return  new MapBinder((MapVector) vector);
>     }
> {code}
> and following code works for me with H2 database and in java stored 
> PostgreSQL function in PL/Java to bind Map(string,string) parameter to JDBC:
> {code:java}
> package org.apache.arrow.adapter.jdbc.binder;
> import org.apache.arrow.vector.complex.MapVector;
> import org.apache.arrow.vector.complex.impl.UnionMapReader;
> import org.apache.arrow.vector.util.JsonStringHashMap;
> import java.sql.PreparedStatement;
> import java.sql.SQLException;
> import java.sql.Types;
> import java.util.LinkedHashMap;
> public class MapBinder extends BaseColumnBinder<MapVector> {
>     private UnionMapReader reader;
>     public MapBinder(MapVector vector) {
>         this(vector, Types.VARCHAR);
>     }
>     public MapBinder(MapVector vector, int jdbcType) {
>         super(vector, jdbcType);
>         reader = vector.getReader();
>     }
>     @Override
>     public void bind(PreparedStatement statement, int parameterIndex, int 
> rowIndex) throws SQLException {
>         reader.setPosition(rowIndex);
>         LinkedHashMap<String, String> tags = new JsonStringHashMap<>();
>         while (reader.next()){
>             tags.put(reader.key().readText().toString(), 
> reader.value().readText().toString());
>         }
>         statement.setString(parameterIndex, tags.toString());
>     }
> }
> {code}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to