Uploaded image for project: 'Chemistry (Retired)'
  1. Chemistry (Retired)
  2. CMIS-896

Improve how JSON response of CMIS query function is built

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Resolved
    • Minor
    • Resolution: Fixed
    • OpenCMIS 0.12.0
    • OpenCMIS 0.13.0
    • opencmis-server
    • None

    Description

      JSON responses of CMIS queries seems to be built in an inefficient way.

      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;
          }
      
      

      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):

      select * from cmis:document

      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.

      Attachments

        1. query.patch
          20 kB
          Nicolas Brandt

        Activity

          People

            fmui Florian Müller
            nbrandt Nicolas Brandt
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: