From d925c851f0dfb0337ae427ef5a408161083c0ce4 Mon Sep 17 00:00:00 2001 From: Benjamin Geer Date: Wed, 5 Feb 2020 14:21:20 +0100 Subject: [PATCH] feat: Add time value type (#1403) --- .../paradox/02-knora-ontologies/knora-base.md | 13 + .../03-apis/api-v1/xml-to-standoff-mapping.md | 2 + .../development/updating-repositories.md | 3 + knora-ontologies/knora-base.ttl | 43 +- knora-ontologies/salsah-gui.ttl | 7 + salsah1/src/public/js/00_init_javascript.js | 2 +- salsah1/src/public/js/03_showval.js | 11 +- salsah1/src/public/js/jquery.editvalue.js | 10 +- salsah1/src/public/js/jquery.extsearch.js | 22 +- salsah1/src/public/js/jquery.propedit.js | 140 +- salsah1/src/public/js/jquery.resadd.js | 35 +- salsah1/src/public/js/jquery.searchext.js | 22 +- .../basicMessageComponents.ts | 26 +- .../changeValueFormats.ts | 9 + .../createResourceFormats.ts | 2 +- .../pr1403/knora-ontologies/knora-admin.ttl | 781 +++++ .../pr1403/knora-ontologies/knora-base.ttl | 2760 +++++++++++++++ .../pr1403/knora-ontologies/salsah-gui.ttl | 244 ++ .../pr1403/knora-ontologies/standoff-data.ttl | 631 ++++ .../pr1403/knora-ontologies/standoff-onto.ttl | 356 ++ upgrade/plugins/pr1403/update.py | 27 + .../main/scala/org.knora.upgrade/Main.scala | 3 +- webapi/_test_data/all_data/anything-data.ttl | 71 + .../_test_data/ontologies/anything-onto.ttl | 25 +- .../test_route/texts/mappingForHTML.xml | 18 + webapi/src/main/resources/knoraXmlImport.xsd | 14 + .../org/knora/webapi/OntologyConstants.scala | 15 + .../org/knora/webapi/SharedTestDataADM.scala | 51 + .../resourcemessages/ResourceMessagesV1.scala | 6 +- .../valuemessages/ValueMessagesV1.scala | 52 +- ...BaseToApiV2SimpleTransformationRules.scala | 3 + .../standoffmessages/StandoffMessagesV2.scala | 35 +- .../valuemessages/ValueMessagesV2.scala | 145 +- .../main/scala/org/knora/webapi/package.scala | 2 +- .../responders/v1/SearchResponderV1.scala | 14 + .../webapi/responders/v1/ValueUtilV1.scala | 40 +- .../responders/v2/search/SparqlQuery.scala | 13 +- .../prequery/AbstractPrequeryGenerator.scala | 12 +- .../types/GravsearchTypeInspectionUtil.scala | 2 + .../webapi/routing/v1/ResourcesRouteV1.scala | 9 + .../webapi/routing/v1/ValuesRouteV1.scala | 15 +- .../webapi/routing/v2/ValuesRouteV2.scala | 16 + .../http/HttpTriplestoreConnector.scala | 2 + .../webapi/util/ConstructResponseUtilV2.scala | 7 + .../knora/webapi/util/StringFormatter.scala | 24 - .../util/standoff/StandoffTagUtilV2.scala | 41 + .../sparql/v1/addValueVersion.scala.txt | 6 + ...teInsertStatementsForCreateValue.scala.txt | 6 + .../sparql/v1/searchExtendedGraphDB.scala.txt | 64 +- .../v1/searchExtendedStandard.scala.txt | 64 +- ...eInsertStatementsForValueContent.scala.txt | 6 + .../src/main/twirl/xsd/v1/xmlImport.scala.xml | 6 + .../anythingOntologyWithValueObjects.jsonld | 41 + .../anythingOntologyWithValueObjects.rdf | 942 +++--- .../anythingOntologyWithValueObjects.ttl | 39 +- .../boxOntologyWithValueObjects.rdf | 72 +- .../incunabulaOntologySimple.rdf | 200 +- .../incunabulaOntologyWithValueObjects.rdf | 408 +-- .../incunabulaPageAndBookWithValueObjects.rdf | 240 +- .../test-data/ontologyR2RV2/knoraApiDate.rdf | 4 +- .../ontologyR2RV2/knoraApiDateValue.rdf | 88 +- .../ontologyR2RV2/knoraApiOntologySimple.rdf | 348 +- .../knoraApiOntologyWithValueObjects.jsonld | 219 ++ .../knoraApiOntologyWithValueObjects.rdf | 2978 +++++++++-------- .../knoraApiOntologyWithValueObjects.ttl | 121 + .../ontologyR2RV2/salsahGuiOntology.jsonld | 7 + .../ontologyR2RV2/salsahGuiOntology.rdf | 3 + .../ontologyR2RV2/salsahGuiOntology.ttl | 2 + .../standoffOntologyWithValueObjects.rdf | 1212 +++---- .../test-data/resourcesR2RV2/Testding.jsonld | 26 + .../searchR2RV2/ThingWithTimeStamp.jsonld | 58 + .../webapi/e2e/v1/ResourcesV1R2RSpec.scala | 8 + .../knora/webapi/e2e/v1/SearchV1R2RSpec.scala | 18 +- .../knora/webapi/e2e/v1/ValuesV1R2RSpec.scala | 36 + .../webapi/e2e/v2/SearchRouteV2R2RSpec.scala | 150 +- .../webapi/e2e/v2/ValuesRouteV2E2ESpec.scala | 78 + .../responders/v1/ValuesResponderV1Spec.scala | 41 +- .../v2/OntologyResponderV2Spec.scala | 35 +- .../responders/v2/ValuesResponderV2Spec.scala | 111 + 79 files changed, 10020 insertions(+), 3398 deletions(-) create mode 100644 upgrade/plugins/pr1403/knora-ontologies/knora-admin.ttl create mode 100644 upgrade/plugins/pr1403/knora-ontologies/knora-base.ttl create mode 100644 upgrade/plugins/pr1403/knora-ontologies/salsah-gui.ttl create mode 100644 upgrade/plugins/pr1403/knora-ontologies/standoff-data.ttl create mode 100644 upgrade/plugins/pr1403/knora-ontologies/standoff-onto.ttl create mode 100644 upgrade/plugins/pr1403/update.py create mode 100644 webapi/src/test/resources/test-data/searchR2RV2/ThingWithTimeStamp.jsonld diff --git a/docs/src/paradox/02-knora-ontologies/knora-base.md b/docs/src/paradox/02-knora-ontologies/knora-base.md index 0d2e46d805..f13bcb51f3 100644 --- a/docs/src/paradox/02-knora-ontologies/knora-base.md +++ b/docs/src/paradox/02-knora-ontologies/knora-base.md @@ -428,6 +428,17 @@ regardless of the calendar in which they were entered. Properties: : The precision of the end of the period. +##### TimeValue + +A Knora time value represents a precise moment in time in the Gregorian +calendar. Since nanosecond precision can be included, it is suitable +for use as a timestamp. Properties: + +`valueHasTimeStamp` (1) + +: An `xsd:dateTimeStamp`, stored as an `xsd:dateTime` (because SPARQL + does not support `xsd:dateTimeStamp`). + ##### IntValue Represents an integer. Property: @@ -933,6 +944,8 @@ Standoff data type tags are subclasses of `ValueBase` classes. is stored in the same form that is used for `kb:IntervalValue`. See @ref:[IntervalValue](#intervalvalue). * `StandoffBooleanTag` Indicates that a substring represents a Boolean, which is stored in the same form that is used for `kb:BooleanValue`. See @ref:[BooleanValue](#booleanvalue). +* `StandoffTimeTag` Indicates that a substring represents a timestamp, which is stored + in the same form that is used for `kb:TimeValue`. See @ref:[TimeValue](#timevalue). ##### StandoffLinkTag diff --git a/docs/src/paradox/03-apis/api-v1/xml-to-standoff-mapping.md b/docs/src/paradox/03-apis/api-v1/xml-to-standoff-mapping.md index 0f4c904d85..264c69e071 100644 --- a/docs/src/paradox/03-apis/api-v1/xml-to-standoff-mapping.md +++ b/docs/src/paradox/03-apis/api-v1/xml-to-standoff-mapping.md @@ -280,6 +280,8 @@ Knora allows the use of all its value types as standoff data types type attribute, e.g. `1.1,2.2`). - `knora-base:StandoffBooleanTag`: Represents a Boolean value (`true` or `false` must be submitted in the data type attribute). +- `knora-base:StandoffTimeTag`: Represents a timestamp value (an `xsd:dateTimeStamp` + must be submitted in the data type attribute). The basic idea is that parts of a text can be marked up in a way that allows using Knora's built-in data types. In order to do so, the typed diff --git a/docs/src/paradox/05-internals/development/updating-repositories.md b/docs/src/paradox/05-internals/development/updating-repositories.md index aa3d04f73d..d9a0d59a25 100644 --- a/docs/src/paradox/05-internals/development/updating-repositories.md +++ b/docs/src/paradox/05-internals/development/updating-repositories.md @@ -37,6 +37,9 @@ with existing data, the following must happen: existing repositories so that they are compatible with the code changes introduced in the pull request. +The order of version numbers must correspond to the order in which the pull requests +are merged. + ## Adding an Upgrade Plugin An upgrade plugin is a Scala class that extends `UpgradePlugin`. The name of the plugin diff --git a/knora-ontologies/knora-base.ttl b/knora-ontologies/knora-base.ttl index fd0847c0c7..d5f19ef41c 100644 --- a/knora-ontologies/knora-base.ttl +++ b/knora-ontologies/knora-base.ttl @@ -33,7 +33,7 @@ :attachedToProject knora-admin:SystemProject ; - :ontologyVersion "knora-base v6" . + :ontologyVersion "knora-base v7" . @@ -1535,6 +1535,18 @@ +### http://www.knora.org/ontology/knora-base#valueHasTimeStamp + +:valueHasTimeStamp rdf:type owl:DatatypeProperty ; + + rdfs:subPropertyOf :valueHas ; + + :subjectClassConstraint :TimeBase ; + + :objectDatatypeConstraint xsd:dateTime . + + + ### http://www.knora.org/ontology/knora-base#valueHasListNode :valueHasListNode rdf:type owl:ObjectProperty ; @@ -1546,7 +1558,6 @@ :objectClassConstraint :ListNode . - ### http://www.knora.org/ontology/knora-base#valueHasOrder :valueHasOrder rdf:type owl:DatatypeProperty ; @@ -2008,6 +2019,24 @@ rdfs:comment "Represents a time interval, e.g. in an audio recording"@en . +:TimeBase rdf:type owl:Class ; + + rdfs:subClassOf :ValueBase , + [ rdf:type owl:Restriction ; + owl:onProperty :valueHasTimeStamp ; + owl:cardinality "1"^^xsd:nonNegativeInteger + ] . + + +### http://www.knora.org/ontology/knora-base#IntervalValue + +:TimeValue rdf:type owl:Class ; + + rdfs:subClassOf :Value , + :TimeBase ; + + rdfs:comment "Represents a timestamp"@en . + ### http://www.knora.org/ontology/knora-base#LinkObj @@ -2431,6 +2460,16 @@ rdfs:comment "Represents an interval in a TextValue"@en . +### http://www.knora.org/ontology/knora-base#StandoffTimeTag + +:StandoffTimeTag rdf:type owl:Class ; + + rdfs:subClassOf :StandoffDataTypeTag, + :TimeBase ; + + rdfs:comment "Represents a timestamp in a TextValue"@en . + + ### http://www.knora.org/ontology/knora-base#StandoffBooleanTag :StandoffBooleanTag rdf:type owl:Class ; diff --git a/knora-ontologies/salsah-gui.ttl b/knora-ontologies/salsah-gui.ttl index 6c183c0f51..8e5bde0478 100644 --- a/knora-ontologies/salsah-gui.ttl +++ b/knora-ontologies/salsah-gui.ttl @@ -141,6 +141,13 @@ +### http://www.knora.org/ontology/salsah-gui#TimeStamp + +:TimeStamp rdf:type :Guielement , + owl:NamedIndividual . + + + ### http://www.knora.org/ontology/salsah-gui#List :List rdf:type :Guielement , diff --git a/salsah1/src/public/js/00_init_javascript.js b/salsah1/src/public/js/00_init_javascript.js index d90d93f465..2980d51c60 100644 --- a/salsah1/src/public/js/00_init_javascript.js +++ b/salsah1/src/public/js/00_init_javascript.js @@ -70,7 +70,6 @@ var VALTYPE_FLOAT = "http://www.knora.org/ontology/knora-base#DecimalValue"; var VALTYPE_DATE = "http://www.knora.org/ontology/knora-base#DateValue"; var VALTYPE_PERIOD = 5; var VALTYPE_RESPTR = "http://www.knora.org/ontology/knora-base#LinkValue"; -var VALTYPE_TIME = "http://www.knora.org/ontology/knora-base#TimeValue"; var VALTYPE_INTERVAL = "http://www.knora.org/ontology/knora-base#IntervalValue"; var VALTYPE_GEOMETRY = "http://www.knora.org/ontology/knora-base#GeomValue"; var VALTYPE_COLOR = "http://www.knora.org/ontology/knora-base#ColorValue"; @@ -81,6 +80,7 @@ var VALTYPE_RICHTEXT = "http://www.knora.org/ontology/knora-base#TextValue"; var VALTYPE_GEONAME = 15; var VALTYPE_URI = "http://www.knora.org/ontology/knora-base#UriValue"; var VALTYPE_BOOLEAN = "http://www.knora.org/ontology/knora-base#BooleanValue"; +var VALTYPE_TIME = "http://www.knora.org/ontology/knora-base#TimeValue"; var RESOURCE_TYPE_REGION = "http://www.knora.org/ontology/knora-base#Region"; diff --git a/salsah1/src/public/js/03_showval.js b/salsah1/src/public/js/03_showval.js index cf40c6a386..b654ce383c 100644 --- a/salsah1/src/public/js/03_showval.js +++ b/salsah1/src/public/js/03_showval.js @@ -20,7 +20,7 @@ SALSAH.showval = function(value_container, prop, value_index, options) { - //console.log("in showval: valtype is " + prop.valuetype_id); + // console.log("in showval: valtype is " + prop.valuetype_id); switch (prop.valuetype_id) { // this value type is mot used anymore: every text is a richtext now /*case VALTYPE_TEXT: { @@ -41,6 +41,10 @@ SALSAH.showval = function(value_container, prop, value_index, options) value_container.append(prop.values[value_index]); break; } + case VALTYPE_TIME: { + value_container.append(prop.values[value_index]); + break; + } case VALTYPE_BOOLEAN: { var checkbox = $('', { type: "checkbox" @@ -166,11 +170,6 @@ SALSAH.showval = function(value_container, prop, value_index, options) } break; } - case VALTYPE_TIME: { - value_container.timeobj('init', prop.values[value_index]); - //value_container.append(prop.values[value_index]); - break; - } case VALTYPE_INTERVAL: { //value_container.append(prop.values[value_index]); value_container.timeobj('init', prop.values[value_index]); diff --git a/salsah1/src/public/js/jquery.editvalue.js b/salsah1/src/public/js/jquery.editvalue.js index 1cf29c3d2a..457273a3ab 100644 --- a/salsah1/src/public/js/jquery.editvalue.js +++ b/salsah1/src/public/js/jquery.editvalue.js @@ -101,6 +101,10 @@ ele.append(settings.property.values[value_index]); break; } + case VALTYPE_TIME: { + ele.append(settings.property.values[value_index]); + break; + } case VALTYPE_DATE: { ele.dateobj('init', settings.property.values[value_index]); break; @@ -189,11 +193,6 @@ } break; } - case VALTYPE_TIME: { - ele.timeobj('init', settings.property.values[value_index]); - //ele.append(settings.property.values[value_index]); - break; - } case VALTYPE_INTERVAL: { //ele.append(settings.property.values[value_index]); ele.append('VALTYPE_INTERVAL: NOT YET IMPLEMENTED!'); @@ -510,6 +509,7 @@ postdata[VALTYPE_INTEGER] = postdata[VALTYPE_TEXT]; postdata[VALTYPE_FLOAT] = postdata[VALTYPE_TEXT]; + postdata[VALTYPE_TIME] = postdata[VALTYPE_TEXT]; postdata[VALTYPE_RICHTEXT] = function(value, is_new_value) { var data = {}; diff --git a/salsah1/src/public/js/jquery.extsearch.js b/salsah1/src/public/js/jquery.extsearch.js index 709965db1e..6cb0edfab5 100644 --- a/salsah1/src/public/js/jquery.extsearch.js +++ b/salsah1/src/public/js/jquery.extsearch.js @@ -268,6 +268,17 @@ valfield.append($('', {'type': 'text', name: 'searchval', size: 16, maxlength: 32}).addClass('propval').data('gui_element', 'text')); break; } + case VALTYPE_TIME: { // we use gui_element = "text" + compop.append($('