An initial prototype of the Metamodel (branch 208 on my repository: https://github.com/DavideD/hibernate-ogm/commits/208
I've added the Option class that can be extended into more specific specific Option (example WriteConcern for MongoDB or Quorum). Options can be grouped into an OptionContainer. An annotation that represent an Option can be converte using an AnnotationConverte that will be able to convert the annotation into an Option and add it to an OptionContainer. An example: WriteConcernOption: https://github.com/DavideD/hibernate-ogm/blob/17df2b02e9e47d4319593cadc335cc7db5959b9b/hibernate-ogm-mongodb/src/main/java/org/hibernate/ogm/options/mongodb/WriteConcernOption.java WriteConcernAnnotation: https://github.com/DavideD/hibernate-ogm/blob/17df2b02e9e47d4319593cadc335cc7db5959b9b/hibernate-ogm-mongodb/src/main/java/org/hibernate/ogm/options/mongodb/WriteConcern.java Mapping: https://github.com/DavideD/hibernate-ogm/blob/17df2b02e9e47d4319593cadc335cc7db5959b9b/hibernate-ogm-mongodb/src/main/java/org/hibernate/ogm/options/mongodb/WriteConcern.java MappingAndAnnotation: https://github.com/DavideD/hibernate-ogm/blob/17df2b02e9e47d4319593cadc335cc7db5959b9b/hibernate-ogm-core/src/test/java/org/hibernate/ogm/test/mapping/ProxyFactoryWithAnnotationTest.java At the moment is possible to pass a MappingContext setting a property: https://github.com/DavideD/hibernate-ogm/blob/17df2b02e9e47d4319593cadc335cc7db5959b9b/hibernate-ogm-core/src/test/java/org/hibernate/ogm/test/mapping/ProxyFactoryWithAnnotationTest.java Cheers, Davide On Tue, May 7, 2013 at 10:05 AM, Davide D'Alto <daltodav...@gmail.com>wrote: > Thanks for all the information, > I think I have a clearer idea now. > > I'll start to write some code and see what happens :) > > Davide > > > > > On Fri, May 3, 2013 at 2:13 PM, Emmanuel Bernard > <emman...@hibernate.org>wrote: > >> Hello Davide, >> >> Technically most of the knowledge is in >> https://hibernate.atlassian.net/browse/OGM-208 but it's definitely quite >> blurry for a new comer ;) >> >> Let me try and summarize it for you. With that you'll be able to better >> grasp the comments in OGM-208 >> >> ## Goals >> >> We want a metadata facility as a way to pass mapping and configuration >> from the developer to the grid dialect / >> datastore provider. I will call these options. The facility should: >> - be expressible via annotations >> - be expressible via a programmatic API >> - be as type-safe as possible but not too hard to add configuration >> options >> >> This project is essentially smart plumbing so the "clients" of this API >> are the developers on one hand and the Datastore providers on the other >> hand. >> >> ## What to reuse >> >> We will most likely use Jandex to read annotations to benefit from the >> ORM and WildFly work esp wrt indexing. >> >> ## Scopes: overriding and refining options >> >> Each option might be: >> - global, per entity, per property (with optional overridability from >> one to the other) >> - global, specific to a session, specific to an operation (e.g. query) >> >> On top of that options can be polled together by functional affinities >> like key/value generic options, Infinispan specific options, document >> store options etc. >> >> ## Programmatic API >> >> The programmatic API can be used to define mapping options as well as >> session or even operation options. It should be type-safe and will >> likely look like Hibernate Search's approach more or less. >> >> This is more or less what is in the branch. Check out the >> package-info.java for some more information. >> >> ## Annotation >> >> We need a way to convert an annotation into calls to the programmatic >> API (semantically speaking at least). Something like an (meta)annotation >> based conversion: >> >> @ToInternalModel(UnsafeConverter.class) >> @interface Unsafe { >> boolean value() default true; >> static class UnsafeConverter implements >> Convert<Unsafe,MongoDBMappingInternalModelGenerator> { >> void call(Unsafe annotation, >> MongoDBMappingInternalModelGenerator generator) { >> return generator.unsafe(annotation.value()); >> } >> } >> } >> >> This is todo >> >> ## Reading API >> >> Datastore providers and GridDialect implementations should be able to >> read back these options. >> >> This is more or less what you can see in the last few code lines of my >> OGM-207 comment of 27/Jul/12 6:33 PM. >> The seed of it is the MappingService API on the branch but it looks all >> untypesafe and wrong :) Let's call it unfinished. >> >> ## Expressing options in a type-safe way >> >> If you look at OGM-207's comment of 27/Jul/12 6:33 PM, you will wee an >> example of NamedQuery and Quorum options and the infrastructure needed. >> >> It shows how to uniquely identify an option and how to model options >> like quorum that are identified by their name and options like named >> queries that are identified by their name + a key (the query name in >> this case). >> >> It's available in options.Iteration2's class. >> >> ## Tests >> >> Tests are available in org.hibernate.ogm.test.mapping. >> >> ## Examples of options >> >> You can imagine the following examples of options: >> >> - quorum: express the R/W quorum (globally, per entity, per collection, >> per session) ; useful for dynamo based systems >> - WriteConcern: express the write concern options for MongoDB (globally, >> per entity, per collection) >> - Whether or not store association information in the main document or >> in a separate document (see MongoDB IN_ENTITY etc. We could have this >> option on a per collection basis and not a global setting. >> - all datastore specific options whether they are global or relate to >> one entity or one property >> >> I hope I have been clearer, fire the questions away. >> >> Emmanuel >> >> PS: JIRA no longer has a way to link to comments? >> >> On Wed 2013-05-01 9:41, Davide D'Alto wrote: >> > Hi, >> > I've started to work on the metamodel. I've look at the branch that >> > emmanuel created and I've rebased it to the latest master fixing all >> > checkstyle violations: >> https://github.com/DavideD/hibernate-ogm/tree/208 >> > >> > The problem is that I don't have a clear idea how the metamodel is >> supposed >> > to work, what could be a good test case to start with? >> > >> > Thanks, >> > Davide >> > _______________________________________________ >> > hibernate-dev mailing list >> > hibernate-dev@lists.jboss.org >> > https://lists.jboss.org/mailman/listinfo/hibernate-dev >> > > _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev