private void UpdateMetaPropertiesOfSingleVertexProperty(VertexSinglePropertyField vp) { string vertexId = vp.VertexProperty.Vertex.VertexId; JObject vertexDocument = this.Connection.RetrieveDocumentById(vertexId); JObject singleProperty = (JObject)((JArray)vertexDocument[vp.PropertyName]) .First(single => (string)single["_propId"] == vp.PropertyId); JObject meta = (JObject)singleProperty["_meta"]; foreach (WPropertyExpression property in this.updateProperties) { if (property.Cardinality == GremlinKeyword.PropertyCardinality.list || property.MetaProperties.Count > 0) { throw new Exception("Can't create meta property or duplicated property on vertex-property's meta property"); } meta[property.Key.Value] = property.Value.ToJValue(); } // Update vertex single property vp.Replace(singleProperty); // Upload to DocDB this.Connection.ReplaceOrDeleteDocumentAsync(vertexId, vertexDocument, (string)vertexDocument["_partition"]).Wait(); }
private void DropVertexSingleProperty(VertexSinglePropertyField vp) { // Update DocDB VertexField vertexField = vp.VertexProperty.Vertex; JObject vertexObject = this.connection.RetrieveDocumentById(vertexField.VertexId); Debug.Assert(vertexObject[vp.PropertyName] != null); JArray vertexProperty = (JArray)vertexObject[vp.PropertyName]; vertexProperty .First(singleProperty => (string)singleProperty["_propId"] == vp.PropertyId) .Remove(); if (vertexObject.Count == 0) { vertexProperty.Remove(); } this.connection.ReplaceOrDeleteDocumentAsync(vertexField.VertexId, vertexObject, (string)vertexObject["_partition"]).Wait(); // Update vertex field VertexPropertyField vertexPropertyField = vertexField.VertexProperties[vp.PropertyName]; bool found = vertexPropertyField.Multiples.Remove(vp.PropertyId); Debug.Assert(found); if (!vertexPropertyField.Multiples.Any()) { vertexField.VertexProperties.Remove(vp.PropertyName); } }
internal override List <RawRecord> CrossApply(RawRecord record) { List <RawRecord> results = new List <RawRecord>(); FieldObject target = record[this._targetIndex]; if (target != null) { VertexField vertex = target as VertexField; if (vertex != null) { RawRecord r = new RawRecord(); r.Append(new StringField(vertex.VertexMetaProperties[KW_DOC_ID].ToValue)); results.Add(r); } VertexSinglePropertyField vertexSingleProperty = target as VertexSinglePropertyField; if (vertexSingleProperty != null) { RawRecord r = new RawRecord(); r.Append(new StringField(vertexSingleProperty.PropertyId)); results.Add(r); } EdgeField edge = target as EdgeField; if (edge != null) { RawRecord r = new RawRecord(); r.Append(new StringField(edge.EdgeId)); results.Add(r); } } return(results); }
internal override List <RawRecord> CrossApply(RawRecord record) { List <RawRecord> results = new List <RawRecord>(); foreach (int propertyIndex in this.propertiesIndex) { FieldObject propertyObject = record[propertyIndex]; if (propertyObject == null) { continue; } VertexPropertyField vp = propertyObject as VertexPropertyField; if (vp != null) { foreach (VertexSinglePropertyField vsp in vp.Multiples.Values) { RawRecord r = new RawRecord(); r.Append(new StringField(vsp.PropertyValue, vsp.JsonDataType)); results.Add(r); } continue; } VertexSinglePropertyField singleVp = propertyObject as VertexSinglePropertyField; if (singleVp != null) { RawRecord r = new RawRecord(); r.Append(new StringField(singleVp.PropertyValue, singleVp.JsonDataType)); results.Add(r); continue; } EdgePropertyField edgePf = propertyObject as EdgePropertyField; if (edgePf != null) { RawRecord r = new RawRecord(); r.Append(new StringField(edgePf.PropertyValue, edgePf.JsonDataType)); results.Add(r); continue; } ValuePropertyField metaPf = propertyObject as ValuePropertyField; if (metaPf != null) { RawRecord r = new RawRecord(); r.Append(new StringField(metaPf.PropertyValue, metaPf.JsonDataType)); results.Add(r); continue; } Debug.Assert(false, "Should not get here."); } return(results); }
private void DropVertexPropertyMetaProperty(ValuePropertyField metaProperty) { Debug.Assert(metaProperty.Parent is VertexSinglePropertyField); VertexSinglePropertyField vertexSingleProperty = (VertexSinglePropertyField)metaProperty.Parent; VertexField vertexField = vertexSingleProperty.VertexProperty.Vertex; JObject vertexObject = this.connection.RetrieveDocumentById(vertexField.VertexId); Debug.Assert(vertexObject[vertexSingleProperty.PropertyName] != null); JToken propertyJToken = ((JArray)vertexObject[vertexSingleProperty.PropertyName]) .First(singleProperty => (string)singleProperty["_propId"] == vertexSingleProperty.PropertyId); JObject metaPropertyJObject = (JObject)propertyJToken?["_meta"]; metaPropertyJObject?.Property(metaProperty.PropertyName)?.Remove(); // Update DocDB this.connection.ReplaceOrDeleteDocumentAsync(vertexField.VertexId, vertexObject, (string)vertexObject["_partition"]).Wait(); // Update vertex field vertexSingleProperty.MetaProperties.Remove(metaProperty.PropertyName); }
internal override List <RawRecord> CrossApply(RawRecord record) { List <RawRecord> results = new List <RawRecord>(); FieldObject inputTarget = record[this.inputTargetIndex]; if (inputTarget is VertexField) { VertexField vertexField = (VertexField)inputTarget; foreach (VertexPropertyField property in vertexField.VertexProperties.Values) { string propertyName = property.PropertyName; Debug.Assert(!VertexField.IsVertexMetaProperty(propertyName)); Debug.Assert(propertyName == "_edge"); Debug.Assert(propertyName == "_reverse_edge"); switch (propertyName) { case "_rid": case "_self": case "_etag": case "_attachments": case "_ts": continue; default: foreach (VertexSinglePropertyField singleVp in property.Multiples.Values) { RawRecord r = new RawRecord(); r.Append(new StringField(singleVp.PropertyValue, singleVp.JsonDataType)); results.Add(r); } break; } } } else if (inputTarget is EdgeField) { EdgeField edgeField = (EdgeField)inputTarget; foreach (KeyValuePair <string, EdgePropertyField> propertyPair in edgeField.EdgeProperties) { string propertyName = propertyPair.Key; EdgePropertyField edgePropertyField = propertyPair.Value; switch (propertyName) { // Reserved properties for meta-data case "_edgeId": case "_offset": case "_srcV": case "_sinkV": case "_srcVLabel": case "_sinkVLabel": continue; default: RawRecord r = new RawRecord(); r.Append(new StringField(edgePropertyField.PropertyValue, edgePropertyField.JsonDataType)); results.Add(r); break; } } } else if (inputTarget is VertexSinglePropertyField) { VertexSinglePropertyField singleVp = inputTarget as VertexSinglePropertyField; foreach (KeyValuePair <string, ValuePropertyField> kvp in singleVp.MetaProperties) { RawRecord r = new RawRecord(); ValuePropertyField metaPropertyField = kvp.Value; r.Append(new StringField(metaPropertyField.PropertyValue, metaPropertyField.JsonDataType)); results.Add(r); } } else { throw new GraphViewException("The input of values() cannot be a meta or edge property."); } return(results); }
internal override List <RawRecord> CrossApply(RawRecord record) { List <RawRecord> results = new List <RawRecord>(); foreach (int propertyIndex in this.propertiesIndex) { FieldObject propertyObject = record[propertyIndex]; if (propertyObject == null) { continue; } VertexPropertyField vp = propertyObject as VertexPropertyField; if (vp != null) { foreach (VertexSinglePropertyField vsp in vp.Multiples.Values) { RawRecord r = new RawRecord(); r.Append(new VertexSinglePropertyField(vsp)); foreach (string metapropertyName in this.populateMetaproperties) { r.Append(vsp[metapropertyName]); } results.Add(r); } continue; } VertexSinglePropertyField singleVp = propertyObject as VertexSinglePropertyField; if (singleVp != null) { RawRecord r = new RawRecord(); r.Append(new VertexSinglePropertyField(singleVp)); foreach (string metapropertyName in this.populateMetaproperties) { r.Append(singleVp[metapropertyName]); } results.Add(r); continue; } EdgePropertyField edgePf = propertyObject as EdgePropertyField; if (edgePf != null) { if (this.populateMetaproperties.Count > 0) { throw new GraphViewException("An edge property cannot contain meta properties."); } RawRecord r = new RawRecord(); r.Append(new EdgePropertyField(edgePf)); results.Add(r); continue; } ValuePropertyField metaPf = propertyObject as ValuePropertyField; if (metaPf != null) { if (this.populateMetaproperties.Count > 0) { throw new GraphViewException("A meta property cannot contain meta properties."); } RawRecord r = new RawRecord(); r.Append(new ValuePropertyField(metaPf)); results.Add(r); continue; } Debug.Assert(false, "Should not get here."); } return(results); }
internal override List <RawRecord> CrossApply(RawRecord record) { MapField valueMap = new MapField(); FieldObject inputTarget = record[this.inputTargetIndex]; if (inputTarget is VertexField) { VertexField vertexField = (VertexField)inputTarget; if (this.propertyNameList.Any()) { foreach (string propertyName in this.propertyNameList) { FieldObject property = vertexField[propertyName]; if (property == null) { continue; } List <FieldObject> values = new List <FieldObject>(); VertexPropertyField vp = property as VertexPropertyField; if (vp != null) { foreach (VertexSinglePropertyField vsp in vp.Multiples.Values) { values.Add(vsp); } } valueMap.Add(new StringField(propertyName), new CollectionField(values)); } } else { foreach (VertexPropertyField property in vertexField.VertexProperties.Values) { string propertyName = property.PropertyName; Debug.Assert(!VertexField.IsVertexMetaProperty(propertyName)); Debug.Assert(!propertyName.Equals(KW_VERTEX_EDGE)); Debug.Assert(!propertyName.Equals(KW_VERTEX_REV_EDGE)); switch (propertyName) { case "_rid": case "_self": case "_etag": case "_attachments": case "_ts": continue; default: List <FieldObject> values = new List <FieldObject>(); foreach (VertexSinglePropertyField singleVp in property.Multiples.Values) { values.Add(singleVp); } valueMap.Add(new StringField(propertyName), new CollectionField(values)); break; } } } } else if (inputTarget is EdgeField) { EdgeField edgeField = (EdgeField)inputTarget; if (this.propertyNameList.Any()) { foreach (string propertyName in this.propertyNameList) { FieldObject property = edgeField[propertyName]; if (property == null) { continue; } EdgePropertyField edgePf = property as EdgePropertyField; if (edgePf != null) { valueMap.Add(new StringField(propertyName), edgePf); } } } else { foreach (KeyValuePair <string, EdgePropertyField> propertyPair in edgeField.EdgeProperties) { string propertyName = propertyPair.Key; EdgePropertyField edgePropertyField = propertyPair.Value; switch (propertyName) { // Reserved properties for meta-data case KW_EDGE_ID: //case KW_EDGE_OFFSET: case KW_EDGE_SRCV: case KW_EDGE_SINKV: case KW_EDGE_SRCV_LABEL: case KW_EDGE_SINKV_LABEL: continue; default: valueMap.Add(new StringField(propertyName), edgePropertyField); break; } } } } else if (inputTarget is VertexSinglePropertyField) { VertexSinglePropertyField singleVp = inputTarget as VertexSinglePropertyField; if (this.propertyNameList.Any()) { foreach (string propertyName in this.propertyNameList) { FieldObject property = singleVp[propertyName]; if (property == null) { continue; } ValuePropertyField metaPf = property as ValuePropertyField; if (metaPf != null) { valueMap.Add(new StringField(propertyName), metaPf); } } } else { foreach (KeyValuePair <string, ValuePropertyField> kvp in singleVp.MetaProperties) { valueMap.Add(new StringField(kvp.Key), kvp.Value); } } } else { throw new GraphViewException("The input of valueMap() cannot be a meta or edge property."); } RawRecord result = new RawRecord(); result.Append(valueMap); return(new List <RawRecord> { result }); }
internal override List <RawRecord> CrossApply(RawRecord record) { List <RawRecord> results = new List <RawRecord>(); FieldObject inputTarget = record[this.inputTargetIndex]; if (inputTarget is VertexField) { VertexField vertexField = (VertexField)inputTarget; foreach (VertexPropertyField property in vertexField.VertexProperties.Values) { string propertyName = property.PropertyName; Debug.Assert(!VertexField.IsVertexMetaProperty(propertyName)); Debug.Assert(!propertyName.Equals(KW_VERTEX_EDGE)); Debug.Assert(!propertyName.Equals(KW_VERTEX_REV_EDGE)); switch (propertyName) { case "_rid": case "_self": case "_etag": case "_attachments": case "_ts": continue; default: foreach (VertexSinglePropertyField singleVp in property.Multiples.Values) { RawRecord r = new RawRecord(); r.Append(new VertexSinglePropertyField(singleVp)); foreach (string metaPropertyName in this.populateMetaProperties) { r.Append(singleVp[metaPropertyName]); } results.Add(r); } break; } } } else if (inputTarget is EdgeField) { EdgeField edgeField = (EdgeField)inputTarget; foreach (KeyValuePair <string, EdgePropertyField> propertyPair in edgeField.EdgeProperties) { string propertyName = propertyPair.Key; EdgePropertyField edgePropertyField = propertyPair.Value; switch (propertyName) { // Reserved properties for meta-data case KW_EDGE_LABEL: case KW_EDGE_ID: //case KW_EDGE_OFFSET: case KW_EDGE_SRCV: case KW_EDGE_SINKV: case KW_EDGE_SRCV_LABEL: case KW_EDGE_SINKV_LABEL: continue; default: RawRecord r = new RawRecord(); r.Append(new EdgePropertyField(edgePropertyField)); results.Add(r); break; } } if (this.populateMetaProperties.Count > 0 && results.Count > 0) { throw new GraphViewException("An edge property cannot contain meta properties."); } } else if (inputTarget is VertexSinglePropertyField) { VertexSinglePropertyField singleVp = (VertexSinglePropertyField)inputTarget; foreach (KeyValuePair <string, ValuePropertyField> kvp in singleVp.MetaProperties) { RawRecord r = new RawRecord(); ValuePropertyField metaPropertyField = kvp.Value; r.Append(new ValuePropertyField(metaPropertyField)); results.Add(r); } if (this.populateMetaProperties.Count > 0 && results.Count > 0) { throw new GraphViewException("An edge property cannot contain meta properties."); } } else { throw new GraphViewException("The input of properties() cannot be a meta or edge property."); } return(results); }