/* * * * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com) * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * * For more information: http://www.orientechnologies.com * */ package com.orientechnologies.orient.core.sql.functions.misc; import com.orientechnologies.common.exception.OException; import com.orientechnologies.orient.core.command.OCommandContext; import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal; import com.orientechnologies.orient.core.db.record.OIdentifiable; import com.orientechnologies.orient.core.exception.OQueryParsingException; import com.orientechnologies.orient.core.sql.functions.OSQLFunctionAbstract; import com.orientechnologies.orient.core.util.ODateHelper; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; /** * Builds a date object from the format passed. If no arguments are passed, than the system date is built (like sysdate() function) * * @author Luca Garulli (l.garulli--at--orientechnologies.com) * @see OSQLFunctionSysdate * */ public class OSQLFunctionDate extends OSQLFunctionAbstract { public static final String NAME = "date"; private Date date; private SimpleDateFormat format; /** * Get the date at construction to have the same date for all the iteration. */ public OSQLFunctionDate() { super(NAME, 0, 3); date = new Date(); } public Object execute(Object iThis, final OIdentifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParams, OCommandContext iContext) { if (iParams.length == 0) return date; if (iParams[0] == null) return null; if (iParams[0] instanceof Number) return new Date(((Number) iParams[0]).longValue()); if (format == null) { if (iParams.length > 1) { format = new SimpleDateFormat((String) iParams[1]); format.setTimeZone(ODateHelper.getDatabaseTimeZone()); } else format = ODatabaseRecordThreadLocal.INSTANCE.get().getStorage().getConfiguration().getDateTimeFormatInstance(); if (iParams.length == 3) format.setTimeZone(TimeZone.getTimeZone(iParams[2].toString())); } try { return format.parse((String) iParams[0]); } catch (ParseException e) { throw OException.wrapException(new OQueryParsingException("Error on formatting date '" + iParams[0] + "' using the format: " + format.toPattern()), e); } } public boolean aggregateResults(final Object[] configuredParameters) { return false; } public String getSyntax() { return "date([<date-as-string>] [,<format>] [,<timezone>])"; } @Override public Object getResult() { format = null; return null; } }