Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Derived field with parameterized type causes failure #1113

Open
arouel opened this issue Oct 29, 2019 · 2 comments
Open

Derived field with parameterized type causes failure #1113

arouel opened this issue Oct 29, 2019 · 2 comments

Comments

@arouel
Copy link
Contributor

arouel commented Oct 29, 2019

When adding a @Derived field of a parameterized type the generated repository cannot be compiled due to a weird type token.

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.immutables.gson.Gson.TypeAdapters;
import org.immutables.mongo.Mongo.Repository;
import org.immutables.value.Value.Derived;
import org.immutables.value.Value.Immutable;

@Immutable
@Repository
@TypeAdapters
abstract class Value {

    abstract String some();

    abstract String fields();

    @Derived
    Map<String, Set<Long>> derivedFieldToBeStoredInMongo() {
        return new HashMap<>();
    }

}

The Serialization definition of the generated repository.

  @Generated(from = "_Value", generator = "Repositories")
  private static class Serialization {
    final Encoder<Map<java.lang.String, java.lang.String>> derivedFieldToBeStoredInMongoEncoder;
    final CodecRegistry registry;
    final String someName;
    final String fieldsName;
    final String derivedFieldToBeStoredInMongoName;

    Serialization(CodecRegistry registry, RepositorySetup.FieldNamingStrategy fieldNamingStrategy) {
      this.registry = registry;
      this.derivedFieldToBeStoredInMongoEncoder = this.registry.get((TypeToken<Map<java.lang.String, java.lang.String>>) TypeToken.getParameterized(Map.class, java.lang.String.class, java.lang.String.class));
      this.someName = translateName(fieldNamingStrategy, "some");
      this.fieldsName = translateName(fieldNamingStrategy, "fields");
      this.derivedFieldToBeStoredInMongoName = translateName(fieldNamingStrategy, "derivedFieldToBeStoredInMongo");
    }

    @Generated(from = "_Value", generator = "Repositories")
    static final class ValueNamingFields {
      public java.lang.String some;
      public java.lang.String fields;
      public Map<java.lang.String, java.lang.String> derivedFieldToBeStoredInMongo;
    }

    private static String translateName(RepositorySetup.FieldNamingStrategy fieldNamingStrategy, String fieldName) {
      try {
        return fieldNamingStrategy.translateName(
            ValueNamingFields.class.getField(fieldName));
      } catch (NoSuchFieldException noSuchField) {
        throw new AssertionError(noSuchField);
      }
    }
  }
@asereda-gs
Copy link
Member

@arouel is there anything that prevents you from using criteria ?

Most of the efforts are spent on improving criteria API rather than fixing bugs with mongo repositories.

@arouel
Copy link
Contributor Author

arouel commented Nov 4, 2019

@asereda-gs the only thing preventing us is the time to migrate everything to the new API. We have a quite large code base based on mongo repositories.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants