chemistry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Nicolas Brandt (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CMIS-896) Improve how JSON response of CMIS query function is built
Date Thu, 05 Mar 2015 18:13:38 GMT

    [ https://issues.apache.org/jira/browse/CMIS-896?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14349187#comment-14349187
] 

Nicolas Brandt commented on CMIS-896:
-------------------------------------

I don't doubt that there is a better way to do it than the one I submitted :).

And yes, we could provide cmis:objectTypeId but, unless I misunderstood the spec, it is only
allowed in this case (section 2.1.14.1.3 of the spec) :
{quote}
If the select clause of the query statement contains properties from a single type reference
then the repository
MAY represent these pseudo-objects with additional object information.
{quote}

So we can't do that for query like this one :\\
{noformat}select doc.cmis:objectId, sec.aProperty from cmis:document doc inner join aSecondaryType
sec on sec.cmis:objectId = doc.cmis:objectId{noformat}

And even if the end user add {{doc.cmis:objectTypeId}} into the SELECT clause of the previous
query, the performance slowdown is still here because of {{sec.aProperty}}.

> Improve how JSON response of CMIS query function is built
> ---------------------------------------------------------
>
>                 Key: CMIS-896
>                 URL: https://issues.apache.org/jira/browse/CMIS-896
>             Project: Chemistry
>          Issue Type: Improvement
>          Components: opencmis-server
>    Affects Versions: OpenCMIS 0.12.0
>            Reporter: Nicolas Brandt
>            Assignee: Florian Müller
>            Priority: Minor
>         Attachments: query.patch
>
>
> JSON responses of CMIS queries seems to be built in an inefficient way.
> {code:java|title=org.apache.chemistry.opencmis.commons.impl.JSONConverter.java}
>     /**
>      * Converts a bag of properties.
>      */
>     public static JSONObject convert(final Properties properties, final String objectId,
final TypeCache typeCache,
>             final PropertyMode propertyMode, final boolean succinct, final DateTimeFormat
dateTimeFormat) {
>         if (properties == null) {
>             return null;
>         }
>         // get the type
>         TypeDefinition type = null;
>         if (typeCache != null) {
>             PropertyData<?> typeProp = properties.getProperties().get(PropertyIds.OBJECT_TYPE_ID);
>             if (typeProp instanceof PropertyId) {
>                 String typeId = ((PropertyId) typeProp).getFirstValue();
>                 if (typeId != null) {
>                     type = typeCache.getTypeDefinition(typeId);
>                 }
>             }
>             if (type == null && objectId != null && propertyMode != PropertyMode.CHANGE)
{
>                 type = typeCache.getTypeDefinitionForObject(objectId);
>             }
>         }
>         JSONObject result = new JSONObject();
>         for (PropertyData<?> property : properties.getPropertyList()) {
>             assert property != null;
>             assert property.getId() != null;
>             PropertyDefinition<?> propDef = null;
>             if (typeCache != null) {
>                 propDef = typeCache.getPropertyDefinition(property.getId());
>             }
>             if (propDef == null && type != null) {
>                 propDef = type.getPropertyDefinitions().get(property.getId());
>             }
>             if (propDef == null && typeCache != null && objectId != null
&& propertyMode != PropertyMode.CHANGE) {
>                 typeCache.getTypeDefinitionForObject(objectId);
>                 propDef = typeCache.getPropertyDefinition(property.getId());
>             }
>             String propId = (propertyMode == PropertyMode.QUERY ? property.getQueryName()
: property.getId());
>             if (propId == null) {
>                 throw new CmisRuntimeException("No query name or alias for property '"
+ property.getId() + "'!");
>             }
>             result.put(propId, convert(property, propDef, succinct, dateTimeFormat));
>         }
>         return result;
>     }
> {code}
> According to the quoted source code, building the JSON response of query {{select cmis:objectId,
cmis:name from cmis:document}} requires to call the function ObjectService.getObjectById per
each row returned.
> When the query returns 1000 rows and the CMIS server is backed with a database it causes
a significant performance slowdown.
> For example with the two following queries (each of them returns 1000 rows):
>  bq. select * from cmis:document
>  bq. select cmis:objectId, cmis:name from cmis:document
> The second one is more than 5x slower than the first one.
> A solution may be to add PropertyType and Cardinality informations into PropertyData
objects, so it's no longer necessary to retrieve properties definitions.
> I have attached a svn diff file with the changes.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message