Search in sources :

Example 36 with Argument

use of org.hl7.fhir.utilities.graphql.Argument in project org.hl7.fhir.core by hapifhir.

the class GraphQLEngineTests method testResource.

private void testResource(Resource resource, String output, String source, String operation) throws IOException, EGraphEngine, EGraphQLException {
    GraphQLEngine gql = new GraphQLEngine(TestingUtilities.getSharedWorkerContext());
    gql.setServices(this);
    if (resource != null)
        gql.setFocus(resource);
    gql.setGraphQL(Parser.parse(TestingUtilities.loadTestResource("r5", "graphql", source)));
    gql.getGraphQL().setOperationName(operation);
    gql.getGraphQL().getVariables().add(new Argument("var", new NameValue("true")));
    boolean ok = false;
    String msg = null;
    try {
        gql.execute();
        ok = true;
    } catch (Exception e) {
        if (!output.equals("$error"))
            e.printStackTrace();
        ok = false;
        msg = e.getMessage();
    }
    if (ok) {
        Assertions.assertTrue(!output.equals("$error"), "Expected to fail, but didn't");
        StringBuilder str = new StringBuilder();
        gql.getOutput().setWriteWrapper(false);
        gql.getOutput().write(str, 0);
        IOUtils.copy(CompareUtilities.loadTestResourceStream("r5", "graphql", source), new FileOutputStream(CompareUtilities.tempFile("graphql", source)));
        IOUtils.copy(CompareUtilities.loadTestResourceStream("r5", "graphql", output), new FileOutputStream(CompareUtilities.tempFile("graphql", output)));
        TextFile.stringToFile(str.toString(), CompareUtilities.tempFile("graphql", output + ".out"));
        msg = CompareUtilities.checkJsonIsSame(CompareUtilities.tempFile("graphql", output), CompareUtilities.tempFile("graphql", output + ".out"));
        Assertions.assertTrue(Utilities.noString(msg), msg);
    } else
        Assertions.assertTrue(output.equals("$error"), "Error, but proper output was expected (" + msg + ")");
}
Also used : GraphQLEngine(org.hl7.fhir.r5.utils.GraphQLEngine) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) SAXException(org.xml.sax.SAXException) FHIRException(org.hl7.fhir.exceptions.FHIRException)

Example 37 with Argument

use of org.hl7.fhir.utilities.graphql.Argument in project org.hl7.fhir.core by hapifhir.

the class GraphQLEngineTests method search.

@Override
public Bundle search(Object appInfo, String type, List<Argument> searchParams) throws FHIRException {
    try {
        Bundle bnd = new Bundle();
        BundleLinkComponent bl = bnd.addLink();
        bl.setRelation("next");
        bl.setUrl("http://test.fhir.org/r4/Patient?_format=text/xhtml&search-id=77c97e03-8a6c-415f-a63d-11c80cf73f&&active=true&_sort=_id&search-offset=50&_count=50");
        bl = bnd.addLink();
        bl.setRelation("self");
        bl.setUrl("http://test.fhir.org/r4/Patient?_format=text/xhtml&search-id=77c97e03-8a6c-415f-a63d-11c80cf73f&&active=true&_sort=_id&search-offset=0&_count=50");
        BundleEntryComponent be = bnd.addEntry();
        be.setFullUrl("http://hl7.org/fhir/Patient/example");
        be.setResource(new XmlParser().parse(TestingUtilities.loadTestResourceStream("r5", "patient-example.xml")));
        be = bnd.addEntry();
        be.setFullUrl("http://hl7.org/fhir/Patient/example");
        be.setResource(new XmlParser().parse(TestingUtilities.loadTestResourceStream("r5", "patient-example-xds.xml")));
        be.getSearch().setScore(0.5);
        be.getSearch().setMode(SearchEntryMode.MATCH);
        bnd.setTotal(50);
        return bnd;
    } catch (Exception e) {
        throw new FHIRException(e);
    }
}
Also used : XmlParser(org.hl7.fhir.r5.formats.XmlParser) BundleEntryComponent(org.hl7.fhir.r5.model.Bundle.BundleEntryComponent) Bundle(org.hl7.fhir.r5.model.Bundle) FHIRException(org.hl7.fhir.exceptions.FHIRException) IOException(java.io.IOException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) SAXException(org.xml.sax.SAXException) FHIRException(org.hl7.fhir.exceptions.FHIRException) BundleLinkComponent(org.hl7.fhir.r5.model.Bundle.BundleLinkComponent)

Example 38 with Argument

use of org.hl7.fhir.utilities.graphql.Argument in project org.hl7.fhir.core by hapifhir.

the class GraphQLEngine method processValues.

private void processValues(Resource context, Selection sel, Property prop, ObjectValue target, List<Base> values, boolean extensionMode, boolean inheritedList, String suffix) throws EGraphQLException, FHIRException {
    boolean il = false;
    Argument arg = null;
    ExpressionNode expression = null;
    if (sel.getField().hasDirective("slice")) {
        Directive dir = sel.getField().directive("slice");
        String s = ((StringValue) dir.getArguments().get(0).getValues().get(0)).getValue();
        if (s.equals("$index"))
            expression = magicExpression;
        else
            expression = fpe.parse(s);
    }
    if (// special: instruction to drop this node...
    sel.getField().hasDirective("flatten"))
        il = prop.isList() && !sel.getField().hasDirective("first");
    else if (sel.getField().hasDirective("first")) {
        if (expression != null)
            throw new FHIRException("You cannot mix @slice and @first");
        arg = target.addField(sel.getField().getAlias() + suffix, listStatus(sel.getField(), inheritedList));
    } else if (expression == null)
        arg = target.addField(sel.getField().getAlias() + suffix, listStatus(sel.getField(), prop.isList() || inheritedList));
    int index = 0;
    for (Base value : values) {
        String ss = "";
        if (expression != null) {
            if (expression == magicExpression)
                ss = suffix + '.' + Integer.toString(index);
            else
                ss = suffix + '.' + fpe.evaluateToString(null, null, null, value, expression);
            if (!sel.getField().hasDirective("flatten"))
                arg = target.addField(sel.getField().getAlias() + suffix, listStatus(sel.getField(), prop.isList() || inheritedList));
        }
        if (value.isPrimitive() && !extensionMode) {
            if (!sel.getField().getSelectionSet().isEmpty())
                throw new EGraphQLException("Encountered a selection set on a scalar field type");
            processPrimitive(arg, value);
        } else {
            if (sel.getField().getSelectionSet().isEmpty())
                throw new EGraphQLException("No Fields selected on a complex object");
            if (arg == null)
                processObject(context, value, target, sel.getField().getSelectionSet(), il, ss);
            else {
                ObjectValue n = new ObjectValue();
                arg.addValue(n);
                processObject(context, value, n, sel.getField().getSelectionSet(), il, ss);
            }
        }
        if (sel.getField().hasDirective("first"))
            return;
        index++;
    }
}
Also used : ObjectValue(org.hl7.fhir.utilities.graphql.ObjectValue) Argument(org.hl7.fhir.utilities.graphql.Argument) ExpressionNode(org.hl7.fhir.r4b.model.ExpressionNode) StringValue(org.hl7.fhir.utilities.graphql.StringValue) Directive(org.hl7.fhir.utilities.graphql.Directive) FHIRException(org.hl7.fhir.exceptions.FHIRException) EGraphQLException(org.hl7.fhir.utilities.graphql.EGraphQLException) Base(org.hl7.fhir.r4b.model.Base)

Example 39 with Argument

use of org.hl7.fhir.utilities.graphql.Argument in project org.hl7.fhir.core by hapifhir.

the class GraphQLEngine method processReference.

private void processReference(Resource context, Base source, Field field, ObjectValue target, boolean inheritedList, String suffix) throws EGraphQLException, FHIRException {
    if (!(source instanceof Reference))
        throw new EGraphQLException("Not done yet");
    if (services == null)
        throw new EGraphQLException("Resource Referencing services not provided");
    Reference ref = (Reference) source;
    ReferenceResolution res = services.lookup(appInfo, context, ref);
    if (res != null) {
        if (targetTypeOk(field.getArguments(), res.getTarget())) {
            Argument arg = target.addField(field.getAlias() + suffix, listStatus(field, inheritedList));
            ObjectValue obj = new ObjectValue();
            arg.addValue(obj);
            processObject((Resource) res.getTargetContext(), (Base) res.getTarget(), obj, field.getSelectionSet(), inheritedList, suffix);
        }
    } else if (!hasArgument(field.getArguments(), "optional", "true"))
        throw new EGraphQLException("Unable to resolve reference to " + ref.getReference());
}
Also used : ObjectValue(org.hl7.fhir.utilities.graphql.ObjectValue) Argument(org.hl7.fhir.utilities.graphql.Argument) Reference(org.hl7.fhir.r4b.model.Reference) ReferenceResolution(org.hl7.fhir.utilities.graphql.IGraphQLStorageServices.ReferenceResolution) EGraphQLException(org.hl7.fhir.utilities.graphql.EGraphQLException)

Example 40 with Argument

use of org.hl7.fhir.utilities.graphql.Argument in project org.hl7.fhir.core by hapifhir.

the class GraphQLEngine method filter.

private List<Base> filter(Resource context, Property prop, String fieldName, List<Argument> arguments, List<Base> values, boolean extensionMode) throws FHIRException, EGraphQLException {
    List<Base> result = new ArrayList<Base>();
    if (values.size() > 0) {
        int count = Integer.MAX_VALUE;
        int offset = 0;
        StringBuilder fp = new StringBuilder();
        for (Argument arg : arguments) {
            List<Value> vl = resolveValues(arg);
            if ((vl.size() != 1))
                throw new EGraphQLException("Incorrect number of arguments");
            if (values.get(0).isPrimitive())
                throw new EGraphQLException("Attempt to use a filter (" + arg.getName() + ") on a primtive type (" + prop.getTypeCode() + ")");
            if ((arg.getName().equals("fhirpath")))
                fp.append(" and " + vl.get(0).toString());
            else if ((arg.getName().equals("_count")))
                count = Integer.valueOf(vl.get(0).toString());
            else if ((arg.getName().equals("_offset")))
                offset = Integer.valueOf(vl.get(0).toString());
            else {
                Property p = values.get(0).getNamedProperty(arg.getName());
                if (p == null)
                    throw new EGraphQLException("Attempt to use an unknown filter (" + arg.getName() + ") on a type (" + prop.getTypeCode() + ")");
                fp.append(" and " + arg.getName() + " = '" + vl.get(0).toString() + "'");
            }
        }
        // Account for situations where the GraphQL expression selected e.g.
        // effectiveDateTime but the field contains effectivePeriod
        String propName = prop.getName();
        List<Base> newValues = new ArrayList<>(values.size());
        for (Base value : values) {
            if (propName.endsWith("[x]")) {
                String propNameShortened = propName.substring(0, propName.length() - 3);
                if (fieldName.startsWith(propNameShortened) && fieldName.length() > propNameShortened.length()) {
                    if (!value.fhirType().equalsIgnoreCase(fieldName.substring(propNameShortened.length()))) {
                        continue;
                    }
                }
            }
            newValues.add(value);
        }
        int i = 0;
        int t = 0;
        if (fp.length() == 0)
            for (Base v : newValues) {
                if ((i >= offset) && passesExtensionMode(v, extensionMode)) {
                    result.add(v);
                    t++;
                    if (t >= count)
                        break;
                }
                i++;
            }
        else {
            ExpressionNode node = fpe.parse(fp.substring(5));
            for (Base v : newValues) {
                if ((i >= offset) && passesExtensionMode(v, extensionMode) && fpe.evaluateToBoolean(null, context, v, node)) {
                    result.add(v);
                    t++;
                    if (t >= count)
                        break;
                }
                i++;
            }
        }
    }
    return result;
}
Also used : Argument(org.hl7.fhir.utilities.graphql.Argument) ExpressionNode(org.hl7.fhir.r4b.model.ExpressionNode) ArrayList(java.util.ArrayList) StringValue(org.hl7.fhir.utilities.graphql.StringValue) ObjectValue(org.hl7.fhir.utilities.graphql.ObjectValue) VariableValue(org.hl7.fhir.utilities.graphql.VariableValue) Value(org.hl7.fhir.utilities.graphql.Value) NameValue(org.hl7.fhir.utilities.graphql.NameValue) NumberValue(org.hl7.fhir.utilities.graphql.NumberValue) EGraphQLException(org.hl7.fhir.utilities.graphql.EGraphQLException) Property(org.hl7.fhir.r4b.model.Property) Base(org.hl7.fhir.r4b.model.Base)

Aggregations

Argument (org.hl7.fhir.utilities.graphql.Argument)24 IBaseResource (org.hl7.fhir.instance.model.api.IBaseResource)22 ArrayList (java.util.ArrayList)21 EGraphQLException (org.hl7.fhir.utilities.graphql.EGraphQLException)20 ObjectValue (org.hl7.fhir.utilities.graphql.ObjectValue)20 StringValue (org.hl7.fhir.utilities.graphql.StringValue)16 FHIRException (org.hl7.fhir.exceptions.FHIRException)8 ReferenceResolution (org.hl7.fhir.utilities.graphql.IGraphQLStorageServices.ReferenceResolution)8 IOException (java.io.IOException)7 List (java.util.List)6 Resource (org.hl7.fhir.r4b.model.Resource)6 NameValue (org.hl7.fhir.utilities.graphql.NameValue)6 NumberValue (org.hl7.fhir.utilities.graphql.NumberValue)6 DomainResource (org.hl7.fhir.r4b.model.DomainResource)5 Nonnull (javax.annotation.Nonnull)4 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)4 Row (org.apache.spark.sql.Row)4 SAXException (org.xml.sax.SAXException)4 FhirPath (au.csiro.pathling.fhirpath.FhirPath)3 NonLiteralPath (au.csiro.pathling.fhirpath.NonLiteralPath)3