diff --git a/lib/parser/grammar_parser.dart b/lib/parser/grammar_parser.dart index b4d3209..c32e5c3 100644 --- a/lib/parser/grammar_parser.dart +++ b/lib/parser/grammar_parser.dart @@ -257,7 +257,7 @@ class ExpressionDefinition extends GrammarDefinition { Parser turtleDoc() => ref0(statement).star(); } -/// This class focuses on interpreting and formatting the raw parsed data +/// This class focuses on interpreting and formatting the raw parsed data /// into a more structured and meaningful format. class EvaluatorDefinition extends ExpressionDefinition { @@ -337,7 +337,8 @@ class EvaluatorDefinition extends ExpressionDefinition { rtnList.add(firstPreObj); final restPreObjs = values[2] as List; for (var i = 0; i < restPreObjs.length; i++) { - rtnList.add(restPreObjs[i][1][0]); + var o = restPreObjs[i][1] as List; + if (o.length > 0) rtnList.add(o[0]); } return rtnList; }); diff --git a/lib/src/graph.dart b/lib/src/graph.dart index bd715c6..3f084db 100644 --- a/lib/src/graph.dart +++ b/lib/src/graph.dart @@ -4,10 +4,10 @@ import 'dart:io' show File; import 'package:http/http.dart' as http; import 'package:universal_io/io.dart' show Platform; -import './namespace.dart'; +import 'namespace.dart'; import './term.dart'; -import './triple.dart'; -import './constants.dart'; +import 'triple.dart'; +import 'constants.dart'; import '../parser/grammar_parser.dart'; class Graph { @@ -787,12 +787,35 @@ class Graph { dynamic pre = item(predicateObjectList[0]); groups[sub]![pre] = Set(); List objectList = predicateObjectList[1]; + for (var obj in objectList) { - var parsedObj = - (obj is List) ? item(_combineListItems(obj)) : item(obj); - groups[sub]![pre]!.add(parsedObj); - triples.add(Triple(sub: sub, pre: pre, obj: parsedObj)); + var objItem; + if (obj is String) { + objItem = item(obj); + } else if (obj is List) { + objItem = itemFromList(obj); + } + + groups[sub]![pre]!.add(objItem); + triples.add(Triple(sub: sub, pre: pre, obj: objItem)); + + /// Keep it for future use. + + // for (var obj in objectList) { + // var parsedObj = + // (obj is List) ? item(_combineListItems(obj)) : item(obj); + // groups[sub]![pre]!.add(parsedObj); + // triples.add(Triple(sub: sub, pre: pre, obj: parsedObj)); + // } } + + /// Keep it for future use. + + // // Original for loop - TODO remove + // for (String obj in objectList) { + // groups[sub]![pre]!.add(item(obj)); + // triples.add(Triple(sub: sub, pre: pre, obj: item(obj))); + // } } } @@ -894,6 +917,122 @@ class Graph { } } + List stripBrackets(List values) { + if (values[0] == '(' || values[0] == '[') { + values = values.sublist(1, values.length - 1); + } + return values; + } + + Set parseObjectValues(List objVals) { + /// Parses a Set or List of multiple object values + objVals = stripBrackets(objVals)[0]; + + Set values = {}; + for (var objVal in objVals) { + if (objVal is List) { + objVal = stripBrackets(objVal)[0][0]; + + String objName = objVal[0]; + List subValues = objVal[1]; + + // TODO try to parse to int/float etc + Map objMap = { + item(objName): subValues.length == 1 + ? item(subValues[0]) + : subValues.map((e) => item(e)).toSet() + }; + values.add(objMap); + } else { + // TODO + values.add(objVal); + } + } + return values; + } + + List parseObjectValueFromNameStringAndValueList(List obj) { + /// Used for getting name and values for objects when obj is in the format: + /// ['Object name string', ['Value 1', 'Value 2 (optional)'...] ] + /// Returns in format: {'Object name string': {'Value 1', 'Value 2 (optional)'...} } + + String objName = obj[0]; + + List values = obj[1]; + Set objValues = {}; + + if (values.length == 1) { + objValues.add(values[0]); + } else { + // TODO parse multiple values + // List singleValuesList = values[1]; + for (final val in values) { + // check whether string or list + if (val is String) { + objValues.add(val); + } else { + // TODO + throw UnimplementedError( + 'Parsing of multiple values is not yet implemented in this method'); + } + } + } + + return [objName, objValues]; + } + + parseObjectValue() { + /// Parses a single object value + } + + Map> itemFromList(List tripleList) { + List predicateObjectLists = []; + Map> objectGroups = Map(); + + if (tripleList[0] == '(') { + if (tripleList[1][0] is List) { + tripleList = tripleList[1][0]; + } + } + + if (tripleList[0] == '[') { + // trim leading and trailing 'entries' that are just [ or ] + tripleList = tripleList.sublist(1, tripleList.length - 1); + predicateObjectLists = tripleList[0]; + } + + for (List predicateObjectList in predicateObjectLists) { + if (predicateObjectList[0] == '[') { + predicateObjectList = + predicateObjectList.sublist(1, predicateObjectList.length - 1); + } + var pre; + pre = item(predicateObjectList[0]); + var objValues = predicateObjectList[1]; + + if (predicateObjectList[0] is List) { + // detect list within predicateObjectList and iterate + pre = itemFromList(predicateObjectList[0]); + } else { + pre = item(predicateObjectList[0]); // URIRef + } + + Set objItem = {}; + + for (final obj in objValues) { + if (objValues[0] is List && objValues[0].length > 1) { + // Multiple object values found (e.g. multiple restrictions on a ConstrainedDatatype) + objItem.add(parseObjectValues(objValues[0])); + } else { + objItem.add(item(obj)); + } + } + + objectGroups[pre] = objItem; + } + return objectGroups; + } + /// Serializes the graph to certain format and export to file. /// /// Note: diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index d9bc1e0..ae801f4 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -1,4 +1,4 @@ -import './term.dart'; +import 'term.dart'; import 'constants.dart'; class Namespace { diff --git a/lib/src/term.dart b/lib/src/term.dart index 0997668..3d896db 100644 --- a/lib/src/term.dart +++ b/lib/src/term.dart @@ -1,7 +1,7 @@ import 'package:logging/logging.dart'; import 'package:uuid/uuid.dart' as uuid; -import './namespace.dart'; +import 'namespace.dart'; Logger logger = Logger('term');