diff --git a/BimServer/src/org/bimserver/database/queries/DatabaseReadingStackFrame.java b/BimServer/src/org/bimserver/database/queries/DatabaseReadingStackFrame.java index 8ed0d8a227..e6850d1323 100644 --- a/BimServer/src/org/bimserver/database/queries/DatabaseReadingStackFrame.java +++ b/BimServer/src/org/bimserver/database/queries/DatabaseReadingStackFrame.java @@ -1,60 +1,60 @@ -package org.bimserver.database.queries; - -/****************************************************************************** - * Copyright (C) 2009-2019 BIMserver.org - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see {@literal}. - *****************************************************************************/ - -import java.nio.BufferOverflowException; -import java.nio.BufferUnderflowException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.Date; -import java.util.List; -import java.util.UUID; - -import org.bimserver.BimserverDatabaseException; -import org.bimserver.database.DatabaseSession.GetResult; -import org.bimserver.database.Record; -import org.bimserver.database.SearchingRecordIterator; -import org.bimserver.database.queries.om.CanInclude; -import org.bimserver.database.queries.om.Include; -import org.bimserver.database.queries.om.Include.TypeDef; -import org.bimserver.database.queries.om.QueryException; -import org.bimserver.database.queries.om.QueryPart; -import org.bimserver.database.queries.om.Reference; -import org.bimserver.emf.PackageMetaData; -import org.bimserver.shared.HashMapVirtualObject; -import org.bimserver.shared.HashMapWrappedVirtualObject; -import org.bimserver.shared.QueryContext; -import org.bimserver.shared.WrappedVirtualObject; -import org.bimserver.utils.BinUtils; -import org.eclipse.emf.ecore.EAttribute; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EClassifier; -import org.eclipse.emf.ecore.EDataType; -import org.eclipse.emf.ecore.EEnum; -import org.eclipse.emf.ecore.EEnumLiteral; -import org.eclipse.emf.ecore.EReference; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.EcorePackage; -import org.eclipse.emf.ecore.impl.EEnumImpl; -import org.slf4j.Logger; +package org.bimserver.database.queries; + +/****************************************************************************** + * Copyright (C) 2009-2019 BIMserver.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see {@literal}. + *****************************************************************************/ + +import java.nio.BufferOverflowException; +import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +import org.bimserver.BimserverDatabaseException; +import org.bimserver.database.DatabaseSession.GetResult; +import org.bimserver.database.Record; +import org.bimserver.database.SearchingRecordIterator; +import org.bimserver.database.queries.om.CanInclude; +import org.bimserver.database.queries.om.Include; +import org.bimserver.database.queries.om.Include.TypeDef; +import org.bimserver.database.queries.om.QueryException; +import org.bimserver.database.queries.om.QueryPart; +import org.bimserver.database.queries.om.Reference; +import org.bimserver.emf.PackageMetaData; +import org.bimserver.shared.HashMapVirtualObject; +import org.bimserver.shared.HashMapWrappedVirtualObject; +import org.bimserver.shared.QueryContext; +import org.bimserver.shared.WrappedVirtualObject; +import org.bimserver.utils.BinUtils; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EDataType; +import org.eclipse.emf.ecore.EEnum; +import org.eclipse.emf.ecore.EEnumLiteral; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.EcorePackage; +import org.eclipse.emf.ecore.impl.EEnumImpl; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class DatabaseReadingStackFrame extends StackFrame implements ObjectProvidingStackFrame { +public abstract class DatabaseReadingStackFrame extends StackFrame implements ObjectProvidingStackFrame { private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseReadingStackFrame.class); private final QueryContext reusable; private final QueryObjectProvider queryObjectProvider; @@ -88,27 +88,27 @@ public QueryPart getQueryPart() { return queryPart; } - protected void processPossibleIncludes(HashMapVirtualObject object, EClass previousType, CanInclude canInclude) throws QueryException, BimserverDatabaseException { - if (object != null && canInclude != null) { - if (canInclude.hasReferences()) { - for (Reference reference : canInclude.getReferences()) { - processPossibleInclude(object, canInclude, reference.getInclude()); + protected void processPossibleIncludes(HashMapVirtualObject object, EClass previousType, CanInclude canInclude) throws QueryException, BimserverDatabaseException { + if (object != null && canInclude != null) { + if (canInclude.hasReferences()) { + for (Reference reference : canInclude.getReferences()) { + processPossibleInclude(object, canInclude, reference.getInclude()); } } if (canInclude.hasIncludes()) { - for (Include include : canInclude.getIncludes()) { + for (Include include : canInclude.getIncludes()) { processPossibleInclude(object, canInclude, include); } - } + } if (canInclude.isIncludeAllFields()) { for (EReference eReference : object.eClass().getEAllReferences()) { Include include = new Include(reusable.getPackageMetaData()); include.addType(object.eClass(), false); - include.addField(eReference.getName()); - if (canInclude.hasIncludes()) { - for (Include include2 : canInclude.getIncludes()) { - include.addInclude(include2); - } + include.addField(eReference.getName()); + if (canInclude.hasIncludes()) { + for (Include include2 : canInclude.getIncludes()) { + include.addInclude(include2); + } } processPossibleInclude(object, canInclude, include); } @@ -121,45 +121,45 @@ protected void processPossibleIncludes(HashMapVirtualObject object, EClass previ protected void processPossibleInclude(HashMapVirtualObject object, CanInclude previousInclude, Include include) throws QueryException, BimserverDatabaseException { if (include.hasTypes()) { - for (TypeDef filterClass : include.getTypes()) { + for (TypeDef filterClass : include.getTypes()) { // TODO also exclude the possibly excluded types here if (!filterClass.geteClass().isSuperTypeOf(object.eClass())) { -// System.out.println(filterClass.getName() + " / " + currentObject.eClass().getName()); +// System.out.println(filterClass.getName() + " / " + currentObject.eClass().getName()); // TODO too many times queries are spending time here return; } } - } - if (include.hasDirectFields()) { - for (EReference eReference : include.getFieldsDirect()) { - Object ref = object.get(eReference.getName()); - if (ref != null) { - if (ref instanceof List) { - for (Long r : (List)ref) { - HashMapVirtualObject byOid = getByOid(r, true); - int index = object.addDirectListReference(eReference, byOid); - object.addUseForSerialization(eReference, index); - processPossibleIncludes(byOid, byOid.eClass(), include); - } - } else { - if (ref instanceof Long) { - HashMapVirtualObject byOid = getByOid((Long)ref, true); - if (byOid == null) { - throw new BimserverDatabaseException("Object with oid " + ref + " not found (" + queryObjectProvider.getDatabaseSession().getEClassForOid((Long)ref).getName() + ")"); - } - object.setDirectReference(eReference, byOid); - object.addUseForSerialization(eReference); - processPossibleIncludes(byOid, byOid.eClass(), include); - } else { - object.setDirectReference(eReference, (HashMapWrappedVirtualObject)ref); - } - } - } - } + } + if (include.hasDirectFields()) { + for (EReference eReference : include.getFieldsDirect()) { + Object ref = object.get(eReference.getName()); + if (ref != null) { + if (ref instanceof List) { + for (Long r : (List)ref) { + HashMapVirtualObject byOid = getByOid(r, true); + int index = object.addDirectListReference(eReference, byOid); + object.addUseForSerialization(eReference, index); + // processPossibleIncludes(byOid, byOid.eClass(), include); + } + } else { + if (ref instanceof Long) { + HashMapVirtualObject byOid = getByOid((Long)ref, true); + if (byOid == null) { + throw new BimserverDatabaseException("Object with oid " + ref + " not found (" + queryObjectProvider.getDatabaseSession().getEClassForOid((Long)ref).getName() + ")"); + } + object.setDirectReference(eReference, byOid); + object.addUseForSerialization(eReference); + // processPossibleIncludes(byOid, byOid.eClass(), include); + } else { + object.setDirectReference(eReference, (HashMapWrappedVirtualObject)ref); + } + } + } + } } if (include.hasFields() && !include.isExclude()) { - for (EStructuralFeature eStructuralFeature : include.getFields()) { - object.addUseForSerialization(eStructuralFeature); + for (EStructuralFeature eStructuralFeature : include.getFields()) { + object.addUseForSerialization(eStructuralFeature); } } @@ -188,18 +188,18 @@ public GetResult getMap(EClass originalQueryClass, EClass eClass, ByteBuffer buf } protected HashMapVirtualObject convertByteArrayToObject(EClass eClass, long oid, ByteBuffer buffer, int rid) throws BimserverDatabaseException { - try { + try { int unsettedLength = getPackageMetaData().getUnsettedLength(eClass); byte[] unsetted = new byte[unsettedLength]; buffer.get(unsetted); int fieldCounter = 0; - - HashMapVirtualObject idEObject = new HashMapVirtualObject(reusable, eClass, oid, new UUID(buffer.getLong(), buffer.getLong())); - - for (EStructuralFeature feature : eClass.getEAllStructuralFeatures()) { - try { + + HashMapVirtualObject idEObject = new HashMapVirtualObject(reusable, eClass, oid, new UUID(buffer.getLong(), buffer.getLong())); + + for (EStructuralFeature feature : eClass.getEAllStructuralFeatures()) { + try { if (getPackageMetaData().useForDatabaseStorage(eClass, feature)) { boolean isUnsetted = (unsetted[fieldCounter / 8] & (1 << (fieldCounter % 8))) != 0; if (isUnsetted) { @@ -227,7 +227,7 @@ protected HashMapVirtualObject convertByteArrayToObject(EClass eClass, long oid, } } } else if (feature.getEType() instanceof EClass) { - // EReference eReference = (EReference) feature; + // EReference eReference = (EReference) feature; buffer.order(ByteOrder.LITTLE_ENDIAN); short cid = buffer.getShort(); buffer.order(ByteOrder.BIG_ENDIAN); @@ -248,7 +248,7 @@ protected HashMapVirtualObject convertByteArrayToObject(EClass eClass, long oid, EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass(cid); if (referenceClass == null) { throw new BimserverDatabaseException("No eClass found for cid " + cid); - } + } buffer.position(buffer.position() - 2); newValue = readReference(buffer, feature, referenceClass); if ((Long)newValue != -1) { @@ -265,15 +265,15 @@ protected HashMapVirtualObject convertByteArrayToObject(EClass eClass, long oid, } else if (feature.getEType() instanceof EDataType) { newValue = readPrimitiveValue(feature.getEType(), buffer); } - if (newValue != null) { - if (feature instanceof EAttribute) { - idEObject.setAttribute((EAttribute) feature, newValue); - } else { - if (newValue instanceof Long) { - idEObject.setReference((EReference) feature, (Long)newValue); - } else { - idEObject.setReference((EReference) feature, (WrappedVirtualObject)newValue); - } + if (newValue != null) { + if (feature instanceof EAttribute) { + idEObject.setAttribute((EAttribute) feature, newValue); + } else { + if (newValue instanceof Long) { + idEObject.setReference((EReference) feature, (Long)newValue); + } else { + idEObject.setReference((EReference) feature, (WrappedVirtualObject)newValue); + } } } } @@ -300,15 +300,15 @@ private long readReference(ByteBuffer buffer, EStructuralFeature feature, EClass if (buffer.capacity() == 1 && buffer.get(0) == -1) { buffer.position(buffer.position() + 1); return -1; - } - buffer.order(ByteOrder.LITTLE_ENDIAN); + } + buffer.order(ByteOrder.LITTLE_ENDIAN); long oid = buffer.getLong(); - buffer.order(ByteOrder.BIG_ENDIAN); + buffer.order(ByteOrder.BIG_ENDIAN); return oid; } - private HashMapWrappedVirtualObject readWrappedValue(EStructuralFeature feature, ByteBuffer buffer, EClass eClass) throws BimserverDatabaseException { - EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature("wrappedValue"); + private HashMapWrappedVirtualObject readWrappedValue(EStructuralFeature feature, ByteBuffer buffer, EClass eClass) throws BimserverDatabaseException { + EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature("wrappedValue"); Object primitiveValue = readPrimitiveValue(eStructuralFeature.getEType(), buffer); HashMapWrappedVirtualObject eObject = new HashMapWrappedVirtualObject(eClass); eObject.setAttribute((EAttribute) eStructuralFeature, primitiveValue); @@ -317,29 +317,29 @@ private HashMapWrappedVirtualObject readWrappedValue(EStructuralFeature feature, Object stringVal = readPrimitiveValue(EcorePackage.eINSTANCE.getEString(), buffer); eObject.setAttribute((EAttribute) strFeature, stringVal); } - return eObject; + return eObject; } private HashMapWrappedVirtualObject readEmbeddedValue(EStructuralFeature feature, ByteBuffer buffer, EClass eClass) throws BimserverDatabaseException { HashMapWrappedVirtualObject eObject = new HashMapWrappedVirtualObject(eClass); for (EStructuralFeature eStructuralFeature : eClass.getEAllStructuralFeatures()) { - if (eStructuralFeature.isMany()) { - } else { - if (eStructuralFeature.getEType() instanceof EDataType) { + if (eStructuralFeature.isMany()) { + } else { + if (eStructuralFeature.getEType() instanceof EDataType) { Object primitiveValue = readPrimitiveValue(eStructuralFeature.getEType(), buffer); - eObject.setAttribute((EAttribute) eStructuralFeature, primitiveValue); - } else { - buffer.order(ByteOrder.LITTLE_ENDIAN); - short cid = buffer.getShort(); - buffer.order(ByteOrder.BIG_ENDIAN); - if (cid == -1) { - // null, do nothing - } else if (cid < 0) { - // negative cid means value is embedded in - // record - EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass((short) (-cid)); - eObject.setReference((EReference) eStructuralFeature, readEmbeddedValue(eStructuralFeature, buffer, referenceClass)); - } + eObject.setAttribute((EAttribute) eStructuralFeature, primitiveValue); + } else { + buffer.order(ByteOrder.LITTLE_ENDIAN); + short cid = buffer.getShort(); + buffer.order(ByteOrder.BIG_ENDIAN); + if (cid == -1) { + // null, do nothing + } else if (cid < 0) { + // negative cid means value is embedded in + // record + EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass((short) (-cid)); + eObject.setReference((EReference) eStructuralFeature, readEmbeddedValue(eStructuralFeature, buffer, referenceClass)); + } } } } @@ -390,60 +390,60 @@ public Object readPrimitiveValue(EClassifier classifier, ByteBuffer buffer) { } } - private Object readList(HashMapVirtualObject idEObject, ByteBuffer buffer, EStructuralFeature feature) throws BimserverDatabaseException { + private Object readList(HashMapVirtualObject idEObject, ByteBuffer buffer, EStructuralFeature feature) throws BimserverDatabaseException { if (feature.getEType() instanceof EEnum) { } else if (feature.getEType() instanceof EClass) { if (buffer.capacity() == 1 && buffer.get(0) == -1) { buffer.position(buffer.position() + 1); - } else { - int listSize = buffer.getInt(); - -// // DEBUG -// int limit = 2000; -// if (listSize > limit) { -// LOGGER.warn("List of size " + listSize + " > " + limit + ", probably an error"); + } else { + int listSize = buffer.getInt(); + +// // DEBUG +// int limit = 2000; +// if (listSize > limit) { +// LOGGER.warn("List of size " + listSize + " > " + limit + ", probably an error"); // } - for (int i = 0; i < listSize; i++) { + for (int i = 0; i < listSize; i++) { if (feature.getEAnnotation("twodimensionalarray") != null) { - HashMapVirtualObject newObject = new HashMapVirtualObject(reusable, (EClass) feature.getEType()); - EClass eClass = (EClass)feature.getEType(); - EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature("List"); - - buffer.order(ByteOrder.LITTLE_ENDIAN); - short cid = buffer.getShort(); - buffer.order(ByteOrder.BIG_ENDIAN); - EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass((short) (-cid)); - if (referenceClass == null) { - throw new BimserverDatabaseException("No class found for cid " + (-cid)); - } - + HashMapVirtualObject newObject = new HashMapVirtualObject(reusable, (EClass) feature.getEType()); + EClass eClass = (EClass)feature.getEType(); + EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature("List"); + + buffer.order(ByteOrder.LITTLE_ENDIAN); + short cid = buffer.getShort(); + buffer.order(ByteOrder.BIG_ENDIAN); + EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass((short) (-cid)); + if (referenceClass == null) { + throw new BimserverDatabaseException("No class found for cid " + (-cid)); + } + Object result = readList(newObject, buffer, eStructuralFeature); - if (eStructuralFeature.getEType() == EcorePackage.eINSTANCE.getEDouble() || eStructuralFeature.getEType() == EcorePackage.eINSTANCE.getEDoubleObject()) { - result = readList(newObject, buffer, eClass.getEStructuralFeature("ListAsString")); - } + if (eStructuralFeature.getEType() == EcorePackage.eINSTANCE.getEDouble() || eStructuralFeature.getEType() == EcorePackage.eINSTANCE.getEDoubleObject()) { + result = readList(newObject, buffer, eClass.getEStructuralFeature("ListAsString")); + } idEObject.setListItem(feature, i, newObject); - } else { + } else { buffer.order(ByteOrder.LITTLE_ENDIAN); short cid = buffer.getShort(); - buffer.order(ByteOrder.BIG_ENDIAN); + buffer.order(ByteOrder.BIG_ENDIAN); if (cid == -1) { // null, do nothing } else if (cid < 0) { // negative cid means value is // embedded - // in record + // in record EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass((short) (-cid)); if (referenceClass == null) { throw new BimserverDatabaseException("No class found for cid " + (-cid)); - } - EStructuralFeature wv = referenceClass.getEStructuralFeature("wrappedValue"); - if (wv != null && wv.isMany()) { - HashMapVirtualObject eObject = new HashMapVirtualObject(reusable, referenceClass); - readList(eObject, buffer, wv); - idEObject.setListItem(feature, i, eObject); - } else { - idEObject.setListItem(feature, i, readWrappedValue(feature, buffer, referenceClass)); + } + EStructuralFeature wv = referenceClass.getEStructuralFeature("wrappedValue"); + if (wv != null && wv.isMany()) { + HashMapVirtualObject eObject = new HashMapVirtualObject(reusable, referenceClass); + readList(eObject, buffer, wv); + idEObject.setListItem(feature, i, eObject); + } else { + idEObject.setListItem(feature, i, readWrappedValue(feature, buffer, referenceClass)); } idEObject.addUseForSerialization(feature, i); } else if (cid > 0) { @@ -452,27 +452,27 @@ private Object readList(HashMapVirtualObject idEObject, ByteBuffer buffer, EStru // to another record EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass(cid); if (referenceClass == null) { - throw new BimserverDatabaseException("Cannot find class with cid " + cid); + throw new BimserverDatabaseException("Cannot find class with cid " + cid); } buffer.position(buffer.position() - 2); long rf = readReference(buffer, feature, referenceClass); idEObject.setListItemReference(feature, i, referenceClass, rf, -1); if (rf != -1) { - if (queryObjectProvider.hasReadOrIsGoingToRead((rf)) || queryObjectProvider.hasReadOrIsGoingToRead(referenceClass)) { + if (queryObjectProvider.hasReadOrIsGoingToRead((rf)) || queryObjectProvider.hasReadOrIsGoingToRead(referenceClass)) { idEObject.addUseForSerialization(feature, i); } } -// } else if (cid == 0) { -// throw new BimserverDatabaseException("Cid cannot be 0"); +// } else if (cid == 0) { +// throw new BimserverDatabaseException("Cid cannot be 0"); } } } } } else if (feature.getEType() instanceof EDataType) { - int listSize = buffer.getInt(); - if (listSize < 0) { - throw new BimserverDatabaseException("Negative array size for " + feature.getEContainingClass().getName() + "." + feature.getName()); - } + int listSize = buffer.getInt(); + if (listSize < 0) { + throw new BimserverDatabaseException("Negative array size for " + feature.getEContainingClass().getName() + "." + feature.getName()); + } for (int i = 0; i < listSize; i++) { Object reference = readPrimitiveValue(feature.getEType(), buffer); if (reference != null) { @@ -483,15 +483,15 @@ private Object readList(HashMapVirtualObject idEObject, ByteBuffer buffer, EStru return null; } - public HashMapVirtualObject getByOid(long oid) throws BimserverDatabaseException { - return getByOid(oid, false); - } - - public HashMapVirtualObject getByOid(long oid, boolean useCache) throws BimserverDatabaseException { - HashMapVirtualObject byOid = getQueryObjectProvider().getFromCache((long)oid); - if (byOid != null) { - return byOid; - } + public HashMapVirtualObject getByOid(long oid) throws BimserverDatabaseException { + return getByOid(oid, false); + } + + public HashMapVirtualObject getByOid(long oid, boolean useCache) throws BimserverDatabaseException { + HashMapVirtualObject byOid = getQueryObjectProvider().getFromCache((long)oid); + if (byOid != null) { + return byOid; + } EClass eClass = getQueryObjectProvider().getDatabaseSession().getEClassForOid(oid); ByteBuffer mustStartWith = ByteBuffer.wrap(new byte[12]); mustStartWith.putInt(reusable.getPid()); @@ -520,10 +520,10 @@ public HashMapVirtualObject getByOid(long oid, boolean useCache) throws Bimserve return null; // deleted entity } else { - byOid = convertByteArrayToObject(eClass, keyOid, valueBuffer, keyRid); - if (byOid != null && useCache) { - getQueryObjectProvider().cache(byOid); - } + byOid = convertByteArrayToObject(eClass, keyOid, valueBuffer, keyRid); + if (byOid != null && useCache) { + getQueryObjectProvider().cache(byOid); + } return byOid; } } else { diff --git a/BimServer/src/org/bimserver/database/queries/json/ifc4-stdlib.json b/BimServer/src/org/bimserver/database/queries/json/ifc4-stdlib.json index 65ab1d6acc..8cc6a3f784 100644 --- a/BimServer/src/org/bimserver/database/queries/json/ifc4-stdlib.json +++ b/BimServer/src/org/bimserver/database/queries/json/ifc4-stdlib.json @@ -286,21 +286,7 @@ "ObjectPlacement": { "type": "IfcProduct", "field": "ObjectPlacement", - "includes": [ - "RelativePlacement", - { - "type": "IfcLocalPlacement", - "field": "RelativePlacement", - "include": { - "type": "IfcAxis2Placement3D", - "fields": [ - "Location", - "Axis", - "RefDirection" - ] - } - } - ] + "includes": [ "RelativePlacement" ] } } } \ No newline at end of file