Selaa lähdekoodia

fixed RefGraph recurse fetching

Piotr Labudda 8 vuotta sitten
vanhempi
commit
84f97a0c67
1 muutettua tiedostoa jossa 123 lisäystä ja 84 poistoa
  1. 123 84
      SE/se-lib/Route/RefGraph.php.view.js

+ 123 - 84
SE/se-lib/Route/RefGraph.php.view.js

@@ -57,6 +57,79 @@ var _defaultVisJsOptions = {
 	}
 };
 
+function dataMakeNode(params) {
+	var objectName = params.typeName.substr(params.typeName.indexOf(':') + 1)
+	var nodeId = objectName + '.' + params.primaryKey // TODO: primaryKey?
+	// {
+	// 	id: nodeId,
+	// 	label: makeShortLabel(nodeId),
+	// 	group: objectName,
+	// 	_loaded: true,
+	// 	typeName: typeName,
+	// 	primaryKey: (json['ID']) ? json['ID'] : null // TODO: _primaryKey
+	// }
+	return {
+		id: nodeId,
+		label: makeShortLabel(nodeId), // TODO: get from schema assert @label attribute
+		group: objectName,
+		_loaded: true,
+		typeName: params.typeName,
+		primaryKey: params.primaryKey // TODO: _primaryKey
+	}
+}
+function dataMakeEdge(parentNodeId, nodeObject) {
+	return {
+		id: parentNodeId + nodeObject.id,
+		from: parentNodeId,
+		to: nodeObject.id,
+	}
+}
+function dataMakeXlinkNode(params) {
+	var objectName = params.typeName.substr(params.typeName.indexOf(':') + 1)
+	var nodeId = params.xlink.substr(params.xlink.indexOf('#') + 1)
+	var primaryKey = nodeId.substr(nodeId.lastIndexOf('.') + 1)
+	return {
+		id: nodeId,
+		label: makeShortLabel(nodeId) + ' (+)',
+		group: objectName,
+		_loaded: false,
+		typeName: params.typeName,
+		primaryKey: primaryKey
+	}
+}
+
+function dataMakeFetchMoreNode(params) {
+	// params = {
+	// 	parentNodeId: parentNodeId,
+	// 	type: json.type,
+	// 	objectName: objectName,
+	// 	ref: json,
+	// }
+	if(DBG)console.log('DBG dataMakeFetchMoreNode(params)', params)
+	var nodeId = params.parentNodeId+'fetch-more-features-'+params.type+'-on-' + params.objectName;
+	return {
+		id: nodeId,
+		label: 'Pobierz więcej (+)',
+		group: 'fetch-more-data', // params.objectName,
+		_loaded: false,
+		_type: 'ref',
+		parentNodeId: params.parentNodeId,
+		ref: params.ref,
+		// typeName: typeName,
+		// primaryKey: nodeId.substr(nodeId.lastIndexOf('.') + 1)
+	};
+}
+function dataMakeFetchMoreEdge(parentNodeId, fetchMoreNode) {
+	// @param parentNodeId - from node id
+	// @param fetchMoreNode - from dataMakeFetchMoreNode
+	if(DBG)console.log('DBG dataMakeFetchMoreEdge(parentNodeId, fetchMoreNode)', {parentNodeId:parentNodeId, fetchMoreNode:fetchMoreNode})
+	return {
+		id: fetchMoreNode.id,
+		from: parentNodeId,
+		to: fetchMoreNode.id
+	}
+}
+
 (function () {
 	var form = document.getElementById('wfs_request')
 	var featureTypeName = TYPENAME
@@ -88,13 +161,13 @@ function updateWfsResponse(features, featureTypeName) {
 		nodes: _nodes,
 		edges: _edges,
 	};
-	_todoGraphData.forEach(function (levelData) {
+	_todoGraphData.forEach(function (levelData, levelIdx) {
 		if (levelData.nodes && levelData.nodes.length) {
 			levelData.nodes.forEach(function (node) {
 				try {
 					_nodes.add(node)
 				} catch (e) {
-					if(DBG)console.log('_graphData.nodes.add error:', e);
+					if(DBG)console.log('_graphData.nodes.add [level='+levelIdx+'] error:', e);
 				}
 			})
 		}
@@ -103,7 +176,7 @@ function updateWfsResponse(features, featureTypeName) {
 				try {
 					_edges.add(edge)
 				} catch (e) {
-					if(DBG)console.log('_graphData.edges.add error:', e);
+					if(DBG)console.log('_graphData.edges.add [level='+levelIdx+'] error:', e);
 				}
 			})
 		}
@@ -127,6 +200,7 @@ function updateWfsResponse(features, featureTypeName) {
 				return;
 			}
 			var selectedNode = _nodes.get(featureID)
+			if(DBG)console.log('Selection: selectedNode:', selectedNode)
 			if (!selectedNode) return;
 
 			if ('ref' === selectedNode._type) {
@@ -165,26 +239,19 @@ function parseResponseRec(_todoGraphData, json, typeName, parentNodeId, level) {
 			}
 		})
 	} else if (p5Utils__isObject(json) && isP5LinkObject(json)) {
-		if(DBG)console.log('DBG::parseResponseRec isP5LinkObject - TODO', json);
+		if(DBG)console.log('DBG::parseResponseRec isP5LinkObject');
 		parseResponseP5Link(_todoGraphData, json, typeName, parentNodeId, level)
 	} else if (p5Utils__isObject(json)) {
-		var objectName = typeName.substr(typeName.indexOf(':') + 1)
-		var nodeId = objectName + '.' + json.ID // TODO: primaryKey?
-		{
-			// _todoGraphData.nodes.add({ id: nodeId, label: nodeId })
-			if (!_todoGraphData[level]) _todoGraphData[level] = { nodes: [], edges: [] }
-			_todoGraphData[level].nodes.push({
-				id: nodeId,
-				label: makeShortLabel(nodeId),
-				group: objectName,
-				_loaded: true,
-				typeName: typeName,
-				primaryKey: (json['ID']) ? json['ID'] : null // TODO: _primaryKey
-			})
-			if (parentNodeId) {
-				// _graphData.edges.add({ id: parentNodeId+nodeId, from: parentNodeId, to: nodeId })
-				_todoGraphData[level].edges.push({ id: parentNodeId+nodeId, from: parentNodeId, to: nodeId })
-			}
+		// _todoGraphData.nodes.add({ id: nodeId, label: nodeId })
+		if (!_todoGraphData[level]) _todoGraphData[level] = { nodes: [], edges: [] }
+		var nodeObject = dataMakeNode({
+			typeName: typeName,
+			primaryKey: (json['ID']) ? json['ID'] : null, // TODO: get primaryKey from object
+		})
+		var nodeId = nodeObject.id
+		_todoGraphData[level].nodes.push(nodeObject)
+		if (parentNodeId) {
+			_todoGraphData[level].edges.push(dataMakeEdge(parentNodeId, nodeObject))
 		}
 		Object.keys(json).filter(function (fieldName) {
 			return (fieldName.indexOf(':') > -1)
@@ -203,21 +270,17 @@ function parseResponseXlinkListRec(_todoGraphData, json, typeName, parentNodeId,
 	if(DBG)console.log('DBG::parseResponseRec:XlinkList', {json:json, typeName:typeName, parentNodeId:parentNodeId, isString: p5Utils__isString(json), isArray: p5Utils__isArray(json), isObject: p5Utils__isObject(json)});
 	if (p5Utils__isString(json)) { // xlink "https://biuro.biall-net.pl/wfs/default_db/BI_audit_ENERGA_RUM_KONTRAHENCI#BI_audit_ENERGA_RUM_KONTRAHENCI.9233",
 		var nodeId = json.substr(json.indexOf('#') + 1)
-		var objectName = typeName.substr(typeName.indexOf(':') + 1)
 		{
 			// _graphData.nodes.add({ id: nodeId, label: nodeId })
 			if (!_todoGraphData[level]) _todoGraphData[level] = { nodes: [], edges: [] }
-			_todoGraphData[level].nodes.push({
-				id: nodeId,
-				label: makeShortLabel(nodeId) + ' (+)',
-				group: objectName,
-				_loaded: false,
+			var nodeObject = dataMakeXlinkNode({
+				xlink: json,
 				typeName: typeName,
-				primaryKey: nodeId.substr(nodeId.lastIndexOf('.') + 1)
+				primaryKey: (json['ID']) ? json['ID'] : null, // TODO: get primaryKey from object
 			})
+			_todoGraphData[level].nodes.push(nodeObject)
 			if (parentNodeId) {
-				// _graphData.edges.add({ id: parentNodeId+nodeId, from: parentNodeId, to: nodeId })
-				_todoGraphData[level].edges.push({ id: parentNodeId+nodeId, from: parentNodeId, to: nodeId })
+				_todoGraphData[level].edges.push(dataMakeEdge(parentNodeId, nodeObject))
 			}
 		}
 	} else if (p5Utils__isObject(json) && isP5LinkObject(json)) {
@@ -227,8 +290,7 @@ function parseResponseXlinkListRec(_todoGraphData, json, typeName, parentNodeId,
 	}
 }
 function parseResponseP5Link(_todoGraphData, json, typeName, parentNodeId, level) {
-	if(DBG)console.log('parseResponseRec isObject - fetch more xlink object');
-	console.warn('parseResponseRec isObject - fetch more xlink object', json);
+	if(DBG)console.log('parseResponseRec isObject and P5Link - fetch more xlink object');
 	// example json: { type: "next",
 	//  @backRefNS: "default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA",
 	//  @backRefPK: "42",
@@ -241,47 +303,29 @@ function parseResponseP5Link(_todoGraphData, json, typeName, parentNodeId, level
 		if (!_todoGraphData[level]) _todoGraphData[level] = { nodes: [], edges: [] }
 		switch (json.type) {
 			case 'next': {
-				if(DBG)console.log('TODO: next "'+json.type+'" - fetch more xlink object');
-				var nodeId = 'fetch-more-features-'+json.type+'-on-' + objectName;
-				_todoGraphData[level].nodes.push({
-					id: nodeId,
-					label: 'Pobierz więcej (+)',
-					group: objectName,
-					_loaded: false,
-					_type: 'ref',
+				var nodeObject = dataMakeFetchMoreNode({
 					parentNodeId: parentNodeId,
+					type: json.type,
+					objectName: objectName,
 					ref: json,
-					// typeName: typeName,
-					// primaryKey: nodeId.substr(nodeId.lastIndexOf('.') + 1)
 				})
-				// _graphData.edges.add({ id: parentNodeId+nodeId, from: parentNodeId, to: nodeId })
-				_todoGraphData[level].edges.push({ id: parentNodeId+nodeId, from: parentNodeId, to: nodeId })
+				_todoGraphData[level].nodes.push(nodeObject)
+				_todoGraphData[level].edges.push(dataMakeFetchMoreEdge(parentNodeId, nodeObject))
 			} break;
 			default: {
 				if(DBG)console.log('TODO: Not implemented - parseResponseRec isObject with type "'+json.type+'" - fetch more xlink object');
 			}
 		}
 	}
-
-	// var nodeId = json.substr(json.indexOf('#') + 1)
-	// var objectName = typeName
-	// {
-	// 	// _graphData.nodes.add({ id: nodeId, label: nodeId })
-	// 	if (!_todoGraphData[level]) _todoGraphData[level] = { nodes: [], edges: [] }
-	// 	_todoGraphData[level].nodes.push({ id: nodeId, label: nodeId, group: objectName })
-	// 	if (parentNodeId) {
-	// 		// _graphData.edges.add({ id: parentNodeId+nodeId, from: parentNodeId, to: nodeId })
-	// 		_todoGraphData[level].edges.push({ id: parentNodeId+nodeId, from: parentNodeId, to: nodeId })
-	// 	}
-	// }
 }
 
 function fetchNodeMoreRefs(selectedNode, featureID) {
 	try {
 		if (!selectedNode) throw "Missing featureID"
 		if (!featureID) throw "Missing featureID"
+		if (!selectedNode.ref) throw "Missing selectedNode.ref"
 		var idSelectedNode = selectedNode.id
-		var idSelectedEdge = selectedNode.parentNodeId + selectedNode.id
+		var idSelectedEdge = selectedNode.id
 		var parentNodeId = selectedNode.parentNodeId
 		var featureTypeName = selectedNode.ref['@typeName']
 		var backRefNS = selectedNode.ref['@backRefNS']
@@ -297,7 +341,7 @@ function fetchNodeMoreRefs(selectedNode, featureID) {
 			backRefPK: backRefPK,
 			backRefField: backRefField,
 			startIndex: startIndex,
-			// count: 3,
+			maxFeatures: 10,
 		};
 		p5WFS_GetFeature(featureTypeName, wfsParams).then(function (features) {
 			if(DBG)console.log('features', features)
@@ -307,15 +351,6 @@ function fetchNodeMoreRefs(selectedNode, featureID) {
 				var objectName = featureTypeName.substr(featureTypeName.indexOf(':') + 1)
 				var nodeId = objectName + '.' + feature.ID // TODO: primaryKey?
 				_todoGraphData[0].edges.push({ id: parentNodeId + nodeId, from: parentNodeId, to: nodeId })
-				// _nodes.add({
-				// 	id: fakeLoadingNodeID,
-				// 	label: 'loading...',
-				// })
-				// _edges.add({
-				// 	id: parentNodeId + nodeId,
-				// 	from: parentNodeId,
-				// 	to: nodeId
-				// })
 			})
 			// var refFields = Object.keys(features[0]).filter(function (fieldName) {
 			// 	return (fieldName.indexOf(':') > -1)
@@ -345,11 +380,28 @@ function fetchNodeMoreRefs(selectedNode, featureID) {
 			features.forEach(function (feature) {
 				updateWfsResponse(feature, featureTypeName)
 			})
+
+			var nodeSelectedData = _nodes.get(idSelectedNode)
+			var edgeSelectedData = _nodes.get(idSelectedEdge)
+			_nodes.remove({ id: idSelectedNode })
+			_edges.remove({ id: idSelectedEdge })
+			if (features.length >= 10) {
+				var nodeObject = dataMakeFetchMoreNode({
+					parentNodeId: nodeSelectedData.parentNodeId,
+					type: nodeSelectedData.type,
+					objectName: nodeSelectedData.objectName,
+					ref: Object.assign(nodeSelectedData.ref, {
+						'@startIndex': (10 + parseInt(startIndex)),
+						value: nodeSelectedData.ref.value.replace('startIndex=' + startIndex, 'startIndex=' + (10 + parseInt(startIndex)))
+					})
+				})
+				_nodes.add(nodeObject)
+				_edges.add(dataMakeFetchMoreEdge(parentNodeId, nodeObject))
+			}
+
 			return "Pobrano nowe dane"
 		}).then(function (msg) {
 			p5UI__notifyAjaxCallback({ type: 'info', msg: msg })
-			_nodes.remove({ id: idSelectedNode })
-			_edges.remove({ id: idSelectedEdge })
 		}).catch(function (e) {
 			if(DBG)console.warn(e)
 			p5UI__notifyAjaxCallback({ type: 'error', msg: e })
@@ -372,17 +424,6 @@ function fetchNodeRecurse(selectedNode, featureID) {
 			primaryKey: featureEx[1]
 		});
 
-		// var fakeLoadingNodeID = featureID + '-loading'
-		// _nodes.add({
-		// 	id: fakeLoadingNodeID,
-		// 	label: 'loading...',
-		// })
-		// _edges.add({
-		// 	id: fakeLoadingNodeID,
-		// 	from: featureID,
-		// 	to: fakeLoadingNodeID
-		// })
-
 		// view-source:http://visjs.org/examples/network/data/dynamicData.html
 		_nodes.update({
 			id: featureID,
@@ -401,14 +442,10 @@ function fetchNodeRecurse(selectedNode, featureID) {
 			return "Pobrano nowe dane"
 		}).then(function (msg) {
 			p5UI__notifyAjaxCallback({ type: 'info', msg: msg })
-			// _nodes.remove({ id: fakeLoadingNodeID })
-			// _edges.remove({ id: fakeLoadingNodeID })
 			_nodes.update({ id: featureID, label: makeShortLabel(selectedNodeId), _loaded: true })
 		}).catch(function (e) {
 			if(DBG)console.warn(e)
 			p5UI__notifyAjaxCallback({ type: 'error', msg: e })
-			// _nodes.remove({ id: fakeLoadingNodeID })
-			// _edges.remove({ id: fakeLoadingNodeID })
 			_nodes.update({ id: featureID, label: makeShortLabel(selectedNodeId), _loaded: true })
 		})
 	} catch (e) {
@@ -505,3 +542,5 @@ function renderSelectedNode(node) {
 
 // global['FUNCTION_FETCH_CHILDRENS'] = 'refGraphFetchChildrens'
 // global['FUNCTION_FETCH_PARENTS'] = 'refGraphFetchParents'
+// global['_nodes'] = _nodes // TODO: DBG
+// global['_edges'] = _edges // TODO: DBG