001package org.hl7.fhir.r4.utils.sql;
002
003import java.util.List;
004
005import org.hl7.fhir.exceptions.FHIRException;
006import org.hl7.fhir.r4.utils.sql.Validator.TrueFalseOrUnknown;
007import org.hl7.fhir.r4.model.Base;
008import org.hl7.fhir.r4.utils.sql.Cell;
009import org.hl7.fhir.r4.utils.sql.Column;
010import org.hl7.fhir.r4.utils.sql.Storage;
011import org.hl7.fhir.r4.utils.sql.Store;
012import org.hl7.fhir.r4.utils.sql.Value;
013import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
014import org.hl7.fhir.utilities.json.model.JsonArray;
015import org.hl7.fhir.utilities.json.model.JsonBoolean;
016import org.hl7.fhir.utilities.json.model.JsonElement;
017import org.hl7.fhir.utilities.json.model.JsonNull;
018import org.hl7.fhir.utilities.json.model.JsonNumber;
019import org.hl7.fhir.utilities.json.model.JsonObject;
020import org.hl7.fhir.utilities.json.model.JsonString;
021
022@MarkedToMoveToAdjunctPackage
023public class StorageJson implements Storage {
024
025  private String name; 
026  private JsonArray rows;
027  
028  @Override
029  public TrueFalseOrUnknown supportsArrays() {
030    return TrueFalseOrUnknown.TRUE;
031  }
032
033  @Override
034  public Store createStore(String name, List<Column> columns) {
035    this.name = name;
036    this.rows = new JsonArray();
037    return new Store(name); // we're not doing anything with this
038  }
039
040  @Override
041  public void addRow(Store store, List<Cell> cells) {
042    JsonObject row = new JsonObject();
043    rows.add(row);
044    for (Cell cell : cells) {
045      if (cell.getColumn().isColl() || cell.getValues().size() > 1) {
046        JsonArray arr = new JsonArray();
047        row.add(cell.getColumn().getName(), arr);   
048        for (Value value : cell.getValues()) {
049          arr.add(makeJsonNode(value));
050        } 
051      } else if (cell.getValues().size() == 0) {
052        row.add(cell.getColumn().getName(), new JsonNull());
053      } else {
054        row.add(cell.getColumn().getName(), makeJsonNode(cell.getValues().get(0)));
055      }
056    }
057  }
058
059  private JsonElement makeJsonNode(Value value) {
060    if (value == null) {
061      return new JsonNull();
062    } else if (value.getValueInt() != null) {
063      return new JsonNumber(value.getValueInt().intValue());
064    }
065    if (value.getValueBoolean() != null) {
066      return new JsonBoolean(value.getValueBoolean().booleanValue());
067    }
068    if (value.getValueDecimal() != null) {
069      return new JsonNumber(value.getValueDecimal().toPlainString());
070    }
071    return new JsonString(value.getValueString());
072  }
073
074  @Override
075  public void finish(Store store) {
076    // nothing
077  }
078
079  public String getName() {
080    return name;
081  }
082
083  public JsonArray getRows() {
084    return rows;
085  }
086
087  @Override
088  public TrueFalseOrUnknown supportsComplexTypes() {
089    return TrueFalseOrUnknown.TRUE;
090  }
091
092  @Override
093  public TrueFalseOrUnknown needsName() {
094    return TrueFalseOrUnknown.FALSE;
095  }
096
097  @Override
098  public String getKeyForSourceResource(Base res) {
099    return res.fhirType()+"/"+res.getIdBase();
100  }
101
102  @Override
103  public String getKeyForTargetResource(Base res) {
104    return res.fhirType()+"/"+res.getIdBase();
105  }
106
107}