@SuppressWarnings("unchecked")
private boolean extractTargets() {
parserSkipWhiteSpaces();
if (parserIsEnded())
throw new OQueryParsingException("No query target found", parserText, 0);
final char c = parserGetCurrentChar();
if (c == '$') {
targetVariable = parserRequiredWord(false, "No valid target");
targetVariable = targetVariable.substring(1);
} else if (c == OStringSerializerHelper.LINK || Character.isDigit(c)) {
// UNIQUE RID
targetRecords = new ArrayList<OIdentifiable>();
((List<OIdentifiable>) targetRecords).add(new ORecordId(parserRequiredWord(true, "No valid RID")));
} else if (c == OStringSerializerHelper.EMBEDDED_BEGIN) {
// SUB QUERY
final StringBuilder subText = new StringBuilder(256);
parserSetCurrentPosition(OStringSerializerHelper.getEmbedded(parserText, parserGetCurrentPosition(), -1, subText) + 1);
final OCommandSQL subCommand = new OCommandSQLResultset(subText.toString());
final OCommandExecutorSQLResultsetDelegate executor = (OCommandExecutorSQLResultsetDelegate) OCommandManager.instance()
.getExecutor(subCommand);
executor.setProgressListener(subCommand.getProgressListener());
executor.parse(subCommand);
context.setChild(executor.getContext());
if (!(executor instanceof Iterable<?>))
throw new OCommandSQLParsingException("Sub-query cannot be iterated because doesn't implement the Iterable interface: "
+ subCommand);
targetQuery = executor;
targetRecords = (Iterable<? extends OIdentifiable>) executor;
} else if (c == OStringSerializerHelper.LIST_BEGIN) {
// COLLECTION OF RIDS
final List<String> rids = new ArrayList<String>();
parserSetCurrentPosition(OStringSerializerHelper.getCollection(parserText, parserGetCurrentPosition(), rids));
targetRecords = new ArrayList<OIdentifiable>();
for (String rid : rids)
((List<OIdentifiable>) targetRecords).add(new ORecordId(rid));
parserMoveCurrentPosition(1);
} else {
while (!parserIsEnded() && (targetClasses == null && targetClusters == null && targetIndex == null && targetIndexValues == null)) {
String originalSubjectName = parserRequiredWord(false, "Target not found");
String subjectName = originalSubjectName.toUpperCase();
final String alias;
if (subjectName.equals("AS"))
alias = parserRequiredWord(true, "Alias not found");
else
alias = subjectName;
final String subjectToMatch = subjectName;
if (subjectToMatch.startsWith(OCommandExecutorSQLAbstract.CLUSTER_PREFIX)) {
// REGISTER AS CLUSTER
if (targetClusters == null)
targetClusters = new HashMap<String, String>();
targetClusters.put(subjectName.substring(OCommandExecutorSQLAbstract.CLUSTER_PREFIX.length()), alias);
} else if (subjectToMatch.startsWith(OCommandExecutorSQLAbstract.INDEX_PREFIX)) {
// REGISTER AS INDEX
targetIndex = subjectName.substring(OCommandExecutorSQLAbstract.INDEX_PREFIX.length());
} else if (subjectToMatch.startsWith(OCommandExecutorSQLAbstract.METADATA_PREFIX)) {
// METADATA
final String metadataTarget = subjectName.substring(OCommandExecutorSQLAbstract.METADATA_PREFIX.length());
targetRecords = new ArrayList<OIdentifiable>();
if (metadataTarget.equals(OCommandExecutorSQLAbstract.METADATA_SCHEMA)) {
((ArrayList<OIdentifiable>) targetRecords).add(new ORecordId(ODatabaseRecordThreadLocal.INSTANCE.get().getStorage()
.getConfiguration().schemaRecordId));
} else if (metadataTarget.equals(OCommandExecutorSQLAbstract.METADATA_INDEXMGR)) {
((ArrayList<OIdentifiable>) targetRecords).add(new ORecordId(ODatabaseRecordThreadLocal.INSTANCE.get().getStorage()
.getConfiguration().indexMgrRecordId));
} else
throw new OQueryParsingException("Metadata element not supported: " + metadataTarget);
} else if (subjectToMatch.startsWith(OCommandExecutorSQLAbstract.DICTIONARY_PREFIX)) {
// DICTIONARY
final String key = originalSubjectName.substring(OCommandExecutorSQLAbstract.DICTIONARY_PREFIX.length());
targetRecords = new ArrayList<OIdentifiable>();