Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package gov.nasa.jpl.aerie.merlin.driver.json;

import gov.nasa.jpl.aerie.json.JsonParseResult;
import gov.nasa.jpl.aerie.json.JsonParser;
import gov.nasa.jpl.aerie.json.SchemaCache;
import gov.nasa.jpl.aerie.merlin.protocol.types.RealDynamics;
import gov.nasa.jpl.aerie.merlin.protocol.types.SerializedValue;
import gov.nasa.jpl.aerie.types.Timestamp;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonValue;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoField;
import java.util.Map;

import static gov.nasa.jpl.aerie.json.BasicParsers.doubleP;
import static gov.nasa.jpl.aerie.json.BasicParsers.mapP;
import static gov.nasa.jpl.aerie.json.BasicParsers.productP;
import static gov.nasa.jpl.aerie.json.BasicParsers.stringP;
import static gov.nasa.jpl.aerie.json.Uncurry.tuple;
import static gov.nasa.jpl.aerie.json.Uncurry.untuple;
import static gov.nasa.jpl.aerie.merlin.driver.json.SerializedValueJsonParser.serializedValueP;

public class Parsers {
public static final JsonParser<Timestamp> pgTimestampP = new JsonParser<>() {
private static final DateTimeFormatter format =
new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
.appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
.toFormatter();

@Override
public JsonObject getSchema(final SchemaCache anchors) {
return Json
.createObjectBuilder(stringP.getSchema())
.add("format", "date-time")
.build();
}

@Override
public JsonParseResult<Timestamp> parse(final JsonValue json) {
final var result = stringP.parse(json);
if (result instanceof final JsonParseResult.Success<String> s) {
try {
final var instant = LocalDateTime.parse(s.result(), format).atZone(ZoneOffset.UTC);
return JsonParseResult.success(new Timestamp(instant));
} catch (final DateTimeParseException e) {
return JsonParseResult.failure("invalid timestamp format "+e);
}
} else if (result instanceof final JsonParseResult.Failure<?> f) {
return f.cast();
} else {
throw new Error("Unexpected subtype of " + JsonParseResult.class + ": " + result);
}
}

@Override
public JsonValue unparse(final Timestamp value) {
final var s = format.format(value.toInstant().atZone(ZoneOffset.UTC));
return stringP.unparse(s);
}
};

public static final JsonParser<Map<String, SerializedValue>> activityArgumentsP = mapP(serializedValueP);

public static final JsonParser<Map<String, SerializedValue>> simulationArgumentsP = mapP(serializedValueP);

public static final JsonParser<RealDynamics> realDynamicsP
= productP
. field("initial", doubleP)
. field("rate", doubleP)
. map(
untuple(RealDynamics::linear),
$ -> tuple($.initial, $.rate));
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package gov.nasa.jpl.aerie.merlin.server.remotes.postgres;
package gov.nasa.jpl.aerie.merlin.driver.timeline;

import gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraph;
import gov.nasa.jpl.aerie.merlin.protocol.model.EffectTrait;
import org.apache.commons.lang3.tuple.Pair;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package gov.nasa.jpl.aerie.merlin.server.remotes.postgres;
package gov.nasa.jpl.aerie.merlin.driver.timeline;

import gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraph;
import org.apache.commons.lang3.tuple.Pair;

import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package gov.nasa.jpl.aerie.merlin.server.remotes.postgres;
package gov.nasa.jpl.aerie.merlin.driver.timeline;

import gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraph;
import net.jqwik.api.Arbitraries;
import net.jqwik.api.Arbitrary;
import net.jqwik.api.ForAll;
Expand All @@ -10,8 +9,8 @@
import org.junit.jupiter.api.Test;

import static gov.nasa.jpl.aerie.merlin.driver.timeline.EffectExpressionDisplay.displayGraph;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.EventGraphFlattener.flatten;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.EventGraphUnflattener.unflatten;
import static gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraphFlattener.flatten;
import static gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraphUnflattener.unflatten;
import static org.junit.jupiter.api.Assertions.assertEquals;

public final class EventGraphFlattenerTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import static gov.nasa.jpl.aerie.json.BasicParsers.*;
import static gov.nasa.jpl.aerie.json.Uncurry.tuple;
import static gov.nasa.jpl.aerie.json.Uncurry.untuple;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.pgTimestampP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.pgTimestampP;

public abstract class MerlinParsers {
private MerlinParsers() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,18 @@
import java.util.function.BiFunction;

import static gov.nasa.jpl.aerie.json.BasicParsers.chooseP;
import static gov.nasa.jpl.aerie.json.BasicParsers.doubleP;
import static gov.nasa.jpl.aerie.json.BasicParsers.listP;
import static gov.nasa.jpl.aerie.json.BasicParsers.literalP;
import static gov.nasa.jpl.aerie.json.BasicParsers.mapP;
import static gov.nasa.jpl.aerie.json.BasicParsers.productP;
import static gov.nasa.jpl.aerie.json.Uncurry.tuple;
import static gov.nasa.jpl.aerie.json.Uncurry.untuple;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.realDynamicsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.SerializedValueJsonParser.serializedValueP;
import static gov.nasa.jpl.aerie.merlin.driver.json.ValueSchemaJsonParser.valueSchemaP;
import static gov.nasa.jpl.aerie.merlin.server.http.MerlinParsers.durationP;

public final class ProfileParsers {
public static final JsonParser<RealDynamics> realDynamicsP
= productP
. field("initial", doubleP)
. field("rate", doubleP)
. map(
untuple(RealDynamics::linear),
$ -> tuple($.initial, $.rate));

public static final JsonParser<ProfileSegment<Optional<RealDynamics>>> realProfileSegmentP
= productP
. field("duration", durationP)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.sql.SQLException;
import java.util.Map;

import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.simulationArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.simulationArgumentsP;

/*package local*/ final class CreateSimulationDatasetAction implements AutoCloseable {
private static final @Language("SQL") String sql = """
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import java.util.ArrayList;
import java.util.List;

import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.getJsonColumn;

/*package-local*/ final class GetActivityDirectivesAction implements AutoCloseable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.Optional;

import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.getJsonColumn;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.simulationArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.simulationArgumentsP;

/*package local*/ final class GetSimulationAction implements AutoCloseable {
private static final @Language("SQL") String sql = """
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import gov.nasa.jpl.aerie.merlin.driver.engine.EventRecord;
import gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraph;
import gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraphUnflattener;
import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;
import gov.nasa.jpl.aerie.merlin.protocol.types.SerializedValue;
import org.apache.commons.lang3.tuple.Pair;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import java.util.Optional;

import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.getJsonColumn;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.simulationArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.simulationArgumentsP;

/*package local*/ final class GetSimulationTemplateAction implements AutoCloseable {
private static final @Language("SQL") String sql = """
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import java.util.List;
import java.util.Map;

import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.getJsonColumn;

public class GetUnvalidatedDirectivesAction implements AutoCloseable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import gov.nasa.jpl.aerie.merlin.driver.engine.EventRecord;
import gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraph;
import gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraphFlattener;
import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;
import gov.nasa.jpl.aerie.types.Timestamp;
import org.apache.commons.lang3.tuple.Pair;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,50 +28,12 @@
import static gov.nasa.jpl.aerie.json.BasicParsers.*;
import static gov.nasa.jpl.aerie.json.Uncurry.tuple;
import static gov.nasa.jpl.aerie.json.Uncurry.untuple;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.SerializedValueJsonParser.serializedValueP;
import static gov.nasa.jpl.aerie.merlin.driver.json.ValueSchemaJsonParser.valueSchemaP;

public final class PostgresParsers {

public static final JsonParser<Timestamp> pgTimestampP = new JsonParser<>() {
private static final DateTimeFormatter format =
new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
.appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
.toFormatter();

@Override
public JsonObject getSchema(final SchemaCache anchors) {
return Json
.createObjectBuilder(stringP.getSchema())
.add("format", "date-time")
.build();
}

@Override
public JsonParseResult<Timestamp> parse(final JsonValue json) {
final var result = stringP.parse(json);
if (result instanceof final JsonParseResult.Success<String> s) {
try {
final var instant = LocalDateTime.parse(s.result(), format).atZone(ZoneOffset.UTC);
return JsonParseResult.success(new Timestamp(instant));
} catch (final DateTimeParseException e) {
return JsonParseResult.failure("invalid timestamp format "+e);
}
} else if (result instanceof final JsonParseResult.Failure<?> f) {
return f.cast();
} else {
throw new UnexpectedSubtypeError(JsonParseResult.class, result);
}
}

@Override
public JsonValue unparse(final Timestamp value) {
final var s = format.format(value.toInstant().atZone(ZoneOffset.UTC));
return stringP.unparse(s);
}
};

public static final JsonParser<Pair<String, ValueSchema>> discreteProfileTypeP =
productP
.field("type", literalP("discrete"))
Expand Down Expand Up @@ -117,9 +79,6 @@ public static Duration parseDurationISO8601(final String iso8601String){
}

public static final JsonParser<Map<String, SerializedValue>> constraintArgumentsP = mapP(serializedValueP);
public static final JsonParser<Map<String, SerializedValue>> activityArgumentsP = mapP(serializedValueP);

public static final JsonParser<Map<String, SerializedValue>> simulationArgumentsP = mapP(serializedValueP);

public static final JsonParser<ActivityAttributesRecord> activityAttributesP = productP
.optionalField("directiveId", longP)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import java.util.stream.Collectors;

import static gov.nasa.jpl.aerie.merlin.driver.json.SerializedValueJsonParser.serializedValueP;
import static gov.nasa.jpl.aerie.merlin.server.http.ProfileParsers.realDynamicsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.realDynamicsP;

/*package-local*/ final class ProfileRepository {
static ProfileSet getProfiles(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gov.nasa.jpl.aerie.merlin.server.remotes.postgres;

import javax.json.Json;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.pgTimestampP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.pgTimestampP;
import static org.junit.jupiter.api.Assertions.assertEquals;

import gov.nasa.jpl.aerie.types.Timestamp;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import java.util.HashMap;

import static gov.nasa.jpl.aerie.merlin.driver.json.SerializedValueJsonParser.serializedValueP;
import static gov.nasa.jpl.aerie.merlin.server.http.ProfileParsers.realDynamicsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.realDynamicsP;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.discreteProfileTypeP;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.realProfileTypeP;

Expand Down
1 change: 0 additions & 1 deletion orchestration-utils/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ jacocoTestReport {


dependencies {
implementation project(':merlin-server')
implementation project(':merlin-driver')
implementation project(':parsing-utilities')
implementation project(':type-utils')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;

import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.pgTimestampP;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.simulationArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.pgTimestampP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.simulationArgumentsP;

import gov.nasa.jpl.aerie.merlin.protocol.types.SerializedValue;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import java.util.UUID;

import static gov.nasa.jpl.aerie.merlin.driver.json.SerializedValueJsonParser.serializedValueP;
import static gov.nasa.jpl.aerie.merlin.server.http.ProfileParsers.realDynamicsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.realDynamicsP;

/**
* A consumer that writes resource segments to the file system.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,17 @@
import java.util.Map;
import java.util.concurrent.RecursiveTask;
import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;
import gov.nasa.jpl.aerie.merlin.server.remotes.postgres.EventGraphFlattener;
import gov.nasa.jpl.aerie.merlin.driver.timeline.EventGraphFlattener;
import gov.nasa.jpl.aerie.types.Plan;
import gov.nasa.jpl.aerie.types.Timestamp;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;

import static gov.nasa.jpl.aerie.merlin.driver.json.SerializedValueJsonParser.serializedValueP;
import static gov.nasa.jpl.aerie.merlin.driver.json.ValueSchemaJsonParser.valueSchemaP;
import static gov.nasa.jpl.aerie.merlin.server.http.ProfileParsers.realDynamicsP;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.simulationArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.realDynamicsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.activityArgumentsP;
import static gov.nasa.jpl.aerie.merlin.driver.json.Parsers.simulationArgumentsP;


public class SimulationResultsWriter {
Expand Down
Loading