public int[] GetOrderByAttributeIds(ClassInfo classInfo, IInternalQuery query) { var fieldNames = query.GetOrderByFieldNames(); var fieldIds = new int[fieldNames.Count]; for (var i = 0; i < fieldNames.Count; i++) fieldIds[i] = classInfo.GetAttributeId(fieldNames[i]); return fieldIds; }
/// <summary> /// Build a meta representation of an object /// <pre>warning: When an object has two fields with the same name /// (a private field with the same name in a parent class, the deeper field (of the parent) is ignored!)</pre> /// </summary> /// <returns> The ObjectInfo </returns> private AbstractObjectInfo GetObjectInfoInternal(AbstractObjectInfo nnoi, object o, ClassInfo classInfo, bool recursive, IDictionary<object, NonNativeObjectInfo> alreadyReadObjects, IIntrospectionCallback callback) { if (o == null) return NullNativeObjectInfo.GetInstance(); var clazz = o.GetType(); var type = OdbType.GetFromClass(clazz); if (type.IsNative()) return GetNativeObjectInfoInternal(type, o, recursive, alreadyReadObjects, callback); // sometimes the type.getName() may not match the ci.getClassName() // It happens when the attribute is an interface or superclass of the // real attribute class // In this case, ci must be updated to the real class info if (classInfo != null && !classInfo.FullClassName.Equals(OdbClassNameResolver.GetFullName(clazz))) { classInfo = GetClassInfo(clazz); nnoi = null; } var mainAoi = (NonNativeObjectInfo) nnoi; var isRootObject = false; if (alreadyReadObjects == null) { alreadyReadObjects = new OdbHashMap<object, NonNativeObjectInfo>(); isRootObject = true; } NonNativeObjectInfo cachedNnoi; alreadyReadObjects.TryGetValue(o, out cachedNnoi); if (cachedNnoi != null) return new ObjectReference(cachedNnoi); if (callback != null) callback.ObjectFound(o); if (mainAoi == null) mainAoi = BuildNnoi(o, classInfo); alreadyReadObjects[o] = mainAoi; var fields = ClassIntrospector.GetAllFieldsFrom(clazz); foreach (var field in fields) { try { var value = field.GetValue(o); var attributeId = classInfo.GetAttributeId(field.Name); if (attributeId == -1) { throw new OdbRuntimeException( NDatabaseError.ObjectIntrospectorNoFieldWithName.AddParameter(classInfo.FullClassName). AddParameter(field.Name)); } var valueType = OdbType.GetFromClass(value == null ? field.FieldType : value.GetType()); // for native fields AbstractObjectInfo abstractObjectInfo; if (valueType.IsNative()) { abstractObjectInfo = GetNativeObjectInfoInternal(valueType, value, recursive, alreadyReadObjects, callback); mainAoi.SetAttributeValue(attributeId, abstractObjectInfo); } else { // Non Native Objects if (value == null) { var classInfo1 = GetClassInfo(field.GetType()); abstractObjectInfo = new NonNativeNullObjectInfo(classInfo1); mainAoi.SetAttributeValue(attributeId, abstractObjectInfo); } else { var classInfo2 = GetClassInfo(value.GetType()); if (recursive) { abstractObjectInfo = GetObjectInfoInternal(null, value, classInfo2, true, alreadyReadObjects, callback); mainAoi.SetAttributeValue(attributeId, abstractObjectInfo); } else { // When it is not recursive, simply add the object // values.add(value); throw new OdbRuntimeException( NDatabaseError.InternalError.AddParameter( "Should not enter here - ObjectIntrospector - 'simply add the object'")); } } } } catch (ArgumentException e) { throw new OdbRuntimeException( NDatabaseError.InternalError.AddParameter("in getObjectInfoInternal"), e); } catch (MemberAccessException e) { throw new OdbRuntimeException(NDatabaseError.InternalError.AddParameter("getObjectInfoInternal"), e); } } if (isRootObject) alreadyReadObjects.Clear(); return mainAoi; }