3 HCE project, Python bindings, Distributed Tasks Manager application. 4 FieldsSQLExpressionEvaluator Class content main functional of support 5 the SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER and SQL_EXPRESSION_FIELDS_UPDATE_PROCESSOR properties. 8 @file FieldsSQLExpressionEvaluator.py 9 @author Alexander Vybornyh <alexander.hce.cluster@gmail.com> 10 @link: http://hierarchical-cluster-engine.com/ 11 @copyright: Copyright © 2013-2016 IOIX Ukraine 12 @license: http://hierarchical-cluster-engine.com/license/ 28 OBJECT_NAME_SITE =
'Site' 29 OBJECT_NAME_URL =
'URL' 31 MACRO_CASE_ORIGINAL = 0
35 CAST_TYPE_TO_INTEGER = 0
36 CAST_TYPE_TO_STRING = 1
37 CAST_TYPE_TO_DATETIME = 2
56 def execute(siteProperties, dbWrapper, siteObj, urlObj, logger,
57 propertyName=APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER):
59 logger.debug(
"Execute enter.... property: '" + str(propertyName) +
"' is exist = " + \
60 str(
True if propertyName
in siteProperties
else False))
63 if dbWrapper
is not None:
65 if siteProperties
is not None and propertyName
in siteProperties:
67 propertyList = json.loads(siteProperties[propertyName])
68 except Exception, err:
69 logger.error(
"Load from site property error: %s, source: %s", str(err), str(propertyName))
71 if propertyList
is not None:
72 for propertyStruct
in propertyList:
73 if FieldsSQLExpressionEvaluator.OBJECT_NAME_SITE
in propertyStruct:
75 ret = FieldsSQLExpressionEvaluator.evaluateElement(dbWrapper, logger, siteObj, DB_CONSTS.siteDict,
76 propertyStruct[FieldsSQLExpressionEvaluator.\
78 elif FieldsSQLExpressionEvaluator.OBJECT_NAME_URL
in propertyStruct:
80 ret = FieldsSQLExpressionEvaluator.evaluateElement(dbWrapper, logger, urlObj, DB_CONSTS.URLTableDict,
81 propertyStruct[FieldsSQLExpressionEvaluator.\
84 logger.error(
"Not support name of object in inputted json")
99 logger.debug(
'evaluateElement enter.... \nobj: ' +
varDump(obj) +
'\nfieldsDict: ' + str(fieldsDict) + \
100 '\nobjPropertyStruct: ' + str(objPropertyStruct))
105 for key, value
in obj.__dict__.items():
106 if isinstance(value, basestring):
108 objFields[key.upper()] = dbWrapper.dbTask.dbConnections[DB_CONSTS.PRIMARY_DB_ID].escape_string(str(value))
110 objFields[key.upper()] = value
112 logger.debug(
'objFields: %s', str(objFields))
114 for fieldName, fieldValue
in objPropertyStruct.items():
115 logger.debug(
'fieldName: %s, fieldValue: %s', str(fieldName), str(fieldValue))
116 for sqlExpression, valueType
in fieldValue.items():
117 logger.debug(
'sqlExpression: %s, valueType: %s', str(sqlExpression), str(valueType))
118 sqlQuery =
'SELECT ' + \
119 FieldsSQLExpressionEvaluator.macroReplace(sqlExpression, objFields,
120 FieldsSQLExpressionEvaluator.REPLACE_MARKER,
122 logger.debug(
"sqlQuery: " + str(sqlQuery))
123 affectDB = dbWrapper.affect_db
124 dbWrapper.affect_db =
True 125 customResponse =
None 127 customResponse = dbWrapper.customRequest(sqlQuery, FieldsSQLExpressionEvaluator.DB_NAME)
128 except DatabaseException, err:
129 logger.error(
"Bad query: " + str(sqlQuery))
131 dbWrapper.affect_db = affectDB
132 logger.debug(
"customResponse: " + str(customResponse))
133 if customResponse
is not None and len(customResponse) > 0
and len(customResponse[0]) > 0:
136 if valueType == FieldsSQLExpressionEvaluator.CAST_TYPE_TO_INTEGER:
137 result = int(customResponse[0][0])
138 elif valueType == FieldsSQLExpressionEvaluator.CAST_TYPE_TO_STRING:
139 result = str(customResponse[0][0])
140 elif valueType == FieldsSQLExpressionEvaluator.CAST_TYPE_TO_DATETIME:
141 dt = DateTimeType.parse(customResponse[0][0])
143 result = dt.strftime(
"%Y-%m-%d %H:%M:%S")
145 logger.debug(
'Unknown type for cast: ' + str(valueType))
147 except Exception, err:
148 logger.error(
"Customization result by type failed, error: %s", str(err))
150 logger.debug(
'result after cast: ' + str(result) +
' type: ' + str(
type(result)))
152 if result
is not None:
153 for fieldObjName, fieldDBName
in fieldsDict.items():
154 if fieldDBName == fieldName
and hasattr(obj, fieldObjName):
155 logger.debug(
"Found attribute '" + str(fieldObjName) +
"' in object...")
156 ret[fieldObjName] = result
170 ret = copy.copy(pattern)
172 if values[key]
is not None:
173 if case == FieldsSQLExpressionEvaluator.MACRO_CASE_UPPER:
175 elif case == FieldsSQLExpressionEvaluator.MACRO_CASE_LOWER:
179 ret = ret.replace(marker + rkey + marker,
"'" + str(values[key]) +
"'" if isinstance(values[key], basestring) \
180 else str(values[key]))
195 logger.debug(
"evaluatePDateTime enter.... property: '" + str(APP_CONSTS.SQL_EXPRESSION_FIELDS_PDATE_TIME) + \
197 str(
True if APP_CONSTS.SQL_EXPRESSION_FIELDS_PDATE_TIME
in siteProperties
else False))
199 localUrlObj = copy.deepcopy(urlObj)
201 ret = defaultPubdateValue
203 if siteProperties
is not None and APP_CONSTS.SQL_EXPRESSION_FIELDS_PDATE_TIME
in siteProperties:
205 propertyList = json.loads(siteProperties[APP_CONSTS.SQL_EXPRESSION_FIELDS_PDATE_TIME])
206 logger.debug(
"propertyList: " +
varDump(propertyList) +
" type: " + str(
type(propertyList)))
207 except Exception, err:
208 logger.error(
"Load from site property '%s' has error: %s",
209 str(APP_CONSTS.SQL_EXPRESSION_FIELDS_PDATE_TIME), str(err))
211 if propertyList
is not None:
212 for propertyStruct
in propertyList:
213 if "pattern" in propertyStruct
and "value" in propertyStruct:
214 pattern = propertyStruct[
"pattern"]
215 value = propertyStruct[
"value"]
217 logger.debug(
"pattern: " + str(pattern))
218 logger.debug(
"value: " + str(value))
219 logger.debug(
"localUrlObj.url: " + str(localUrlObj.url))
220 if localUrlObj.pDate
is None:
221 localUrlObj.pDate = defaultPubdateValue
224 if re.search(pattern, localUrlObj.url, re.UNICODE)
is not None:
225 objPropertyStruct = {DB_CONSTS.URLTableDict[
'pDate']:\
226 {value:FieldsSQLExpressionEvaluator.CAST_TYPE_TO_STRING}}
228 resDict = FieldsSQLExpressionEvaluator.evaluateElement(dbWrapper, logger, localUrlObj, DB_CONSTS.URLTableDict,
230 logger.debug(
"!!! evaluatePDateTime resDict: %s", str(resDict))
231 if "pDate" in resDict:
232 rawDate = resDict[
"pDate"]
233 if rawDate.isdigit():
234 logger.debug(
"!!! Return numeric value: " + str(rawDate))
238 logger.debug(
"!!! Return string value: " + str(rawDate))
240 dt = DateTimeType.parse(rawDate,
True, logger,
False)
242 ret = dt.strftime(
"%Y-%m-%d %H:%M:%S")
246 logger.error(
"Not found mandatory fields for property '%s'", \
247 str(APP_CONSTS.SQL_EXPRESSION_FIELDS_PDATE_TIME))
249 logger.debug(
"!!! evaluatePDateTime ret: %s", str(ret))
def evaluatePDateTime(siteProperties, dbWrapper, urlObj, logger, defaultPubdateValue=None)
def evaluateElement(dbWrapper, logger, obj, fieldsDict, objPropertyStruct)
def varDump(obj, stringify=True, strTypeMaxLen=256, strTypeCutSuffix='...', stringifyType=1, ignoreErrors=False, objectsHash=None, depth=0, indent=2, ensure_ascii=False, maxDepth=10)
def macroReplace(pattern, values, marker, case=MACRO_CASE_ORIGINAL)
def execute(siteProperties, dbWrapper, siteObj, urlObj, logger, propertyName=APP_CONSTS.SQL_EXPRESSION_FIELDS_UPDATE_CRAWLER)