original_string: public function createQueryStatement(
          array $selectPropertyIds,
          array $fromTypes,
          $whereClause = null,
          array $orderByPropertyIds = []
      ) {
          if (empty($selectPropertyIds)) {
              throw new CmisInvalidArgumentException('Select property IDs must not be empty');
          }
          if (empty($fromTypes)) {
              throw new CmisInvalidArgumentException('From types must not be empty');
          }
  
          return new QueryStatement($this, null, $selectPropertyIds, $fromTypes, $whereClause, $orderByPropertyIds);
      }
code: public function createQueryStatement(
          array $selectPropertyIds,
          array $fromTypes,
          $whereClause = null,
          array $orderByPropertyIds = []
      ) {
          if (empty($selectPropertyIds)) {
              throw new CmisInvalidArgumentException('Select property IDs must not be empty');
          }
          if (empty($fromTypes)) {
              throw new CmisInvalidArgumentException('From types must not be empty');
          }
  
          return new QueryStatement($this, null, $selectPropertyIds, $fromTypes, $whereClause, $orderByPropertyIds);
      }
code_tokens: public function createQueryStatement ( array $ selectPropertyIds , array $ fromTypes , $ whereClause = null , array $ orderByPropertyIds = [ ] ) { if ( empty ( $ selectPropertyIds ) ) { throw new CmisInvalidArgumentException ( 'Select property IDs must not be empty' ) ; } if ( empty ( $ fromTypes ) ) { throw new CmisInvalidArgumentException ( 'From types must not be empty' ) ; } return new QueryStatement ( $ this , null , $ selectPropertyIds , $ fromTypes , $ whereClause , $ orderByPropertyIds ) ; }
docstring: Creates a query statement for a query of one primary type joined by zero or more secondary types.
  
  Generates something like this:
  `SELECT d.cmis:name,s.SecondaryStringProp FROM cmis:document AS d JOIN MySecondaryType AS s ON
  d.cmis:objectId=s.cmis:objectId WHERE d.cmis:name LIKE ? ORDER BY d.cmis:name,s.SecondaryIntegerProp`
  
  @param string[] $selectPropertyIds the property IDs in the SELECT statement,
  if <code>null</code> all properties are selected
  @param string[] $fromTypes a Map of type aliases (keys) and type IDs (values), the Map must contain
  exactly one primary type and zero or more secondary types
  @param string|null $whereClause an optional WHERE clause with placeholders ('?'), see QueryStatement for details
  @param string[] $orderByPropertyIds an optional list of properties IDs for the ORDER BY clause
  @return QueryStatementInterface a new query statement object
  @throws CmisInvalidArgumentException
docstring_tokens: Creates a query statement for a query of one primary type joined by zero or more secondary types .