io.ebeanservice.docstore.api.support.DocStructure Maven / Gradle / Ivy
package io.ebeanservice.docstore.api.support;
import io.ebean.FetchPath;
import io.ebean.text.PathProperties;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.deploy.BeanPropertyAssoc;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Document structure for mapping to document store.
*/
public class DocStructure {
/**
* The full document structure.
*/
private final PathProperties doc;
/**
* The embedded document structures by path.
*/
private final Map embedded = new HashMap<>();
private final Map manyRoot = new HashMap<>();
/**
* Create given an initial deployment doc mapping.
*/
public DocStructure(PathProperties pathProps) {
this.doc = pathProps;
}
/**
* Add a property at the root level.
*/
public void addProperty(String name) {
doc.addToPath(null, name);
}
/**
* Add an embedded property with it's document structure.
*/
public void addNested(String path, PathProperties embeddedDoc) {
doc.addNested(path, embeddedDoc);
embedded.put(path, embeddedDoc);
}
/**
* Return the document structure.
*/
public PathProperties doc() {
return doc;
}
/**
* Return the document structure for an embedded path.
*/
public FetchPath getEmbedded(String path) {
return embedded.get(path);
}
public FetchPath getEmbeddedManyRoot(String path) {
return manyRoot.get(path);
}
/**
* For 'many' nested properties we need an additional root based graph to fetch and update.
*/
public void prepareMany(BeanDescriptor desc) {
Set strings = embedded.keySet();
for (String prop : strings) {
BeanPropertyAssoc> embProp = (BeanPropertyAssoc>) desc.findBeanProperty(prop);
if (embProp.isMany()) {
prepare(prop, embProp);
}
}
}
/**
* Add a PathProperties for an embedded 'many' property (at the root level).
*/
private void prepare(String prop, BeanPropertyAssoc> embProp) {
BeanDescriptor> targetDesc = embProp.getTargetDescriptor();
PathProperties manyRootPath = new PathProperties();
manyRootPath.addToPath(null, targetDesc.getIdProperty().getName());
manyRootPath.addNested(prop, embedded.get(prop));
manyRoot.put(prop, manyRootPath);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy