// Path: cloud-spanner-r2dbc/src/main/java/com/google/cloud/spanner/r2dbc/v2/JsonWrapper.java
// public class JsonWrapper {
//   private String jsonString;
// 
//   public JsonWrapper(String jsonString) {
//     this.jsonString = jsonString;
//   }
// 
//   protected Value getJsonVal() {
//     return Value.json(this.jsonString);
//   }
// 
//   public static JsonWrapper of(String jsonString) {
//     return new JsonWrapper(jsonString);
//   }
// 
//   @Override
//   public String toString() {
//     return this.jsonString;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) {
//       return true;
//     }
//     if (o == null || getClass() != o.getClass()) {
//       return false;
//     }
//     JsonWrapper that = (JsonWrapper) o;
//     return Objects.equal(this.jsonString, that.jsonString);
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hashCode(this.jsonString);
//   }
// }


import com.google.cloud.spanner.r2dbc.v2.JsonWrapper;
import com.google.gson.Gson;
import java.util.Arrays;
import java.util.Collection;
import org.springframework.data.r2dbc.dialect.R2dbcDialect;
import org.springframework.data.relational.core.dialect.AbstractDialect;
import org.springframework.data.relational.core.dialect.ArrayColumns;
import org.springframework.data.relational.core.dialect.LimitClause;
import org.springframework.data.relational.core.dialect.LockClause;
import org.springframework.data.relational.core.sql.LockOptions;
import org.springframework.r2dbc.core.binding.BindMarkersFactory;
  private static final LockClause LOCK_CLAUSE = new LockClause() {
    @Override
    public String getLock(LockOptions lockOptions) {
      return "";
    }

    @Override
    public Position getClausePosition() {
      // It does not matter where to append an empty string.
      return Position.AFTER_FROM_TABLE;
    }
  };

  @Override
  public BindMarkersFactory getBindMarkersFactory() {
    return NAMED;
  }

  @Override
  public LimitClause limit() {
    return LIMIT_CLAUSE;
  }

  @Override
  public LockClause lock() {
    return LOCK_CLAUSE;
  }

  @Override
  public Collection<? extends Class<?>> getSimpleTypes() {
// Path: cloud-spanner-r2dbc/src/main/java/com/google/cloud/spanner/r2dbc/v2/JsonWrapper.java
// public class JsonWrapper {
//   private String jsonString;
// 
//   public JsonWrapper(String jsonString) {
//     this.jsonString = jsonString;
//   }
// 
//   protected Value getJsonVal() {
//     return Value.json(this.jsonString);
//   }
// 
//   public static JsonWrapper of(String jsonString) {
//     return new JsonWrapper(jsonString);
//   }
// 
//   @Override
//   public String toString() {
//     return this.jsonString;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) {
//       return true;
//     }
//     if (o == null || getClass() != o.getClass()) {
//       return false;
//     }
//     JsonWrapper that = (JsonWrapper) o;
//     return Objects.equal(this.jsonString, that.jsonString);
//   }
// 
//   @Override
//   public int hashCode() {
//     return Objects.hashCode(this.jsonString);
//   }
// }


// Path: cloud-spanner-spring-data-r2dbc/src/main/java/com/google/cloud/spanner/r2dbc/springdata/SpannerR2dbcDialect.java
import com.google.cloud.spanner.r2dbc.v2.JsonWrapper;
import com.google.gson.Gson;
import java.util.Arrays;
import java.util.Collection;
import org.springframework.data.r2dbc.dialect.R2dbcDialect;
import org.springframework.data.relational.core.dialect.AbstractDialect;
import org.springframework.data.relational.core.dialect.ArrayColumns;
import org.springframework.data.relational.core.dialect.LimitClause;
import org.springframework.data.relational.core.dialect.LockClause;
import org.springframework.data.relational.core.sql.LockOptions;
import org.springframework.r2dbc.core.binding.BindMarkersFactory;

  private static final LockClause LOCK_CLAUSE = new LockClause() {
    @Override
    public String getLock(LockOptions lockOptions) {
      return "";
    }

    @Override
    public Position getClausePosition() {
      // It does not matter where to append an empty string.
      return Position.AFTER_FROM_TABLE;
    }
  };

  @Override
  public BindMarkersFactory getBindMarkersFactory() {
    return NAMED;
  }

  @Override
  public LimitClause limit() {
    return LIMIT_CLAUSE;
  }

  @Override
  public LockClause lock() {
    return LOCK_CLAUSE;
  }

  @Override
  public Collection<? extends Class<?>> getSimpleTypes() {
    return Arrays.asList(JsonWrapper.class);