Bhoomi
Bhoomi

Reputation: 17

Inserting into embedded list of orient db through java

This is the sql script that I have used to create the necessary classes :

CREATE CLASS ProductSummary;
CREATE PROPERTY ProductSummary.name STRING (NOTNULL, MANDATORY TRUE);
CREATE PROPERTY ProductSummary.modelNumber LONG (NOTNULL, MANDATORY TRUE);
ALTER CLASS ProductSummary STRICTMODE TRUE;
 
CREATE CLASS PricingSummary;
CREATE PROPERTY PricingSummary.price LONG (NOTNULL, MANDATORY TRUE);
CREATE PROPERTY PricingSummary.discount LONG (NOTNULL, MANDATORY TRUE);
ALTER CLASS PricingSummary STRICTMODE TRUE;
 
CREATE CLASS TotalSummary EXTENDS V;
CREATE PROPERTY TotalSummary.projectLink LINK Project (NOTNULL, MANDATORY TRUE);
CREATE PROPERTY TotalSummary.productSummaries EMBEDDEDLIST ProductSummary;
CREATE PROPERTY TotalSummary.pricingSummaries EMBEDDEDLIST PricingSummary;
ALTER CLASS TotalSummary STRICTMODE TRUE;
CREATE INDEX TotalSummary_projectLink_idx ON TotalSummary (projectLink) UNIQUE;

I am trying to insert some values into my TotalSummary class, where I also need to insert some values into the EmbeddedList for pricingSummaries and productSummaries.

public TotalSummary create(final TotalSummary totalSummary) {
        final Long projectId = 1;
        final StatementBuilder builder = new StatementBuilder();
        final StringBuilder query = new StringBuilder();
        
        final List<Map<?, ?>> productSummaries = totalSummary.getProductSummaries().stream()
                .map(ProductSummary::toMap)
                .collect(Collectors.toList());
        
        final List<Map<?, ?>> pricingSummaries = totalSummary.getPricingSummaries().stream()
                .map(PricingSummary::toMap)
                .collect(Collectors.toList());
        
        
        builder.addAttribute("projectLink = (SELECT FROM project WHERE id = ?)", projectId);
        if ( ! productSummaries.isEmpty()) {
            builder.addAttribute("productSummaries = ?", productSummaries);
        }
        if ( ! pricingSummaries.isEmpty()) {
            builder.addAttribute("pricingSummaries = ?", pricingSummaries);
        }
        
        try {
            insert(TotalSummary.class.getSimpleName(), builder.attributes(), statement -> {
                builder.init(statement);
                return statement;
            });
        } catch (final UncategorizedSQLException e) {
            throw new ConstraintViolationException(totalSummary, ExceptionUtils.getRootCauseMessage(e), e);
        }

        return assertNotNull(findById(projectId));
    }

This is the utility method that I am using to build the insert query : 
protected String insert(final String vertex, final String fieldValuePairs, final PreparedStatementInitializer initializer) {
    final String sql = "INSERT INTO " + vertex + " SET " + fieldValuePairs + " RETURN @rid";
    return executeStatement(sql, initializer);
}

The toMap methods to convert the List<ProductSummary> to List<Map<?,?>>

**ProductSummary**  
public Map<String, Object> toMap() {
    final Map<String, Object> ret = new HashMap<>();
    ret.put("name", name);
    ret.put("model number", Long.valueOf(modelNumber));
    return ret;
}

The toMap methods to convert the List<PricingSummary> to List<Map<?,?>>
**PricingSummary**
public Map<String, Object> toMap() {
    final Map<String, Object> ret = new HashMap<>();
    ret.put("price", Long.valueOf(price));
    ret.put("discount", Long.valueOf(discount));
    return ret;
}


I am getting the following exception when I execute the code

Constraint violation for: TotalSummary@58f79eeb[recordId=<null>,customProperties=[]]. Reason: OValidationException: The field 'TotalSummary.productSummaries' has been declared as EMBEDDEDLIST but an incompatible type is used. 

Things that I have already tried :

  1. I have tried to covert to list to json format before adding it to the builder like so new Gson().toJson(pricingSummaries);
  2. Converted the pricingSummaries and productSummaries toArray().

Upvotes: 1

Views: 228

Answers (1)

Luigi Dell&#39;Aquila
Luigi Dell&#39;Aquila

Reputation: 2814

You defined the summaries as EMBEDDEDLIST ProductSummary but you are passing lists of maps as values.

Try to create real ProductSummary objects instead eg.

OElement ret = db.newEmbeddedElement("ProductSummary");
ret.setProperty("price", Long.valueOf(price));
ret.setProperty("discount", Long.valueOf(discount));

Upvotes: 1

Related Questions