All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.ebeanservice.docstore.api.support.DocStructure Maven / Gradle / Ivy

There is a newer version: 15.8.1
Show newest version
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.findProperty(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