コード例 #1
0
        public override IDictionary <string, object> GetProperties(params string[] names)
        {
            Objects.requireNonNull(names, "Properties keys should be not null array.");

            if (names.Length == 0)
            {
                return(Collections.emptyMap());
            }

            KernelTransaction transaction = SafeAcquireTransaction();

            int itemsToReturn = names.Length;
            IDictionary <string, object> properties = new Dictionary <string, object>(itemsToReturn);
            TokenRead token = transaction.TokenRead();

            //Find ids, note we are betting on that the number of keys
            //is small enough not to use a set here.
            int[] propertyIds = new int[itemsToReturn];
            for (int i = 0; i < itemsToReturn; i++)
            {
                string key = names[i];
                if (string.ReferenceEquals(key, null))
                {
                    throw new System.NullReferenceException(string.Format("Key {0:D} was null", i));
                }
                propertyIds[i] = token.PropertyKey(key);
            }

            PropertyCursor propertyCursor = transaction.AmbientPropertyCursor();

            transaction.DataRead().graphProperties(propertyCursor);
            int propertiesToFind = itemsToReturn;

            while (propertiesToFind > 0 && propertyCursor.Next())
            {
                //Do a linear check if this is a property we are interested in.
                int currentKey = propertyCursor.PropertyKey();
                for (int i = 0; i < itemsToReturn; i++)
                {
                    if (propertyIds[i] == currentKey)
                    {
                        properties[names[i]] = propertyCursor.PropertyValue().asObjectCopy();
                        propertiesToFind--;
                        break;
                    }
                }
            }
            return(properties);
        }
コード例 #2
0
        private Value[] GetValueTuple(NodeCursor node, PropertyCursor propertyCursor, int changedPropertyKeyId, Value changedValue, int[] indexPropertyIds, MutableIntObjectMap <Value> materializedValues)
        {
            Value[] values  = new Value[indexPropertyIds.Length];
            int     missing = 0;

            // First get whatever values we already have on the stack, like the value change that provoked this update in the first place
            // and already loaded values that we can get from the map of materialized values.
            for (int k = 0; k < indexPropertyIds.Length; k++)
            {
                values[k] = indexPropertyIds[k] == changedPropertyKeyId ? changedValue : materializedValues.get(indexPropertyIds[k]);
                if (values[k] == null)
                {
                    missing++;
                }
            }

            // If we couldn't get all values that we wanted we need to load from the node. While we're loading values
            // we'll place those values in the map so that other index updates from this change can just used them.
            if (missing > 0)
            {
                node.Properties(propertyCursor);
                while (missing > 0 && propertyCursor.Next())
                {
                    int k = ArrayUtils.IndexOf(indexPropertyIds, propertyCursor.PropertyKey());
                    if (k >= 0 && values[k] == null)
                    {
                        int  propertyKeyId            = indexPropertyIds[k];
                        bool thisIsTheChangedProperty = propertyKeyId == changedPropertyKeyId;
                        values[k] = thisIsTheChangedProperty ? changedValue : propertyCursor.PropertyValue();
                        if (!thisIsTheChangedProperty)
                        {
                            materializedValues.put(propertyKeyId, values[k]);
                        }
                        missing--;
                    }
                }
            }

            return(values);
        }
コード例 #3
0
 private bool HasProperties(NodeCursor cursor, PropertyCursor props)
 {
     cursor.Properties(props);
     return(props.Next());
 }
コード例 #4
0
 private bool HasProperties(NodeCursor node, PropertyCursor props)
 {
     node.Properties(props);
     return(props.Next());
 }