Exemple #1
0
    def proc(self, context: CommandContext):
        rows = []

        sql = self.__params.main_sql

        # Rowラッパーに変換
        rows = []
        if self.__params.batch_count <= 0:
            # まとめてインサート
            rows = [Row(row) for row in context.get_rows()]
            if len(rows) > 0:
                self.__dbService.execute_updates(self.__cursor, sql, rows)
                self.__db.commit()
                logger.info(f"executed {len(rows)} parameters..")
        else:
            # 指定件数ずつまとめて実行
            insRows = []
            for row in context.get_rows():
                insRows.append(Row(row))
                if len(insRows) == self.__params.batch_count:
                    rows = rows + insRows
                    self.__dbService.execute_updates(self.__cursor, sql,
                                                     insRows)
                    logger.info(f"executed {len(insRows)} parameters.")
                    insRows = []

                    self.__db.commit()

            if len(insRows) > 0:
                rows = rows + insRows
                self.__dbService.execute_updates(self.__cursor, sql, insRows)
                logger.info(f"executed {len(insRows)} parameters.")

        # 次のコマンドへ引渡し
        context.set_rows(rows)
Exemple #2
0
    def validate(self, params):

        # パラメータ定義のrequire: noのデフォルト値を取得する
        defaultValue = {}
        for key in self.specs.keys():
            spec = self.specs[key]
            if spec.require == False:
                if not key in params:
                    params[key] = spec.default

        r = Row(params)

        # 必須プロパティチェック
        for v in self.requires:
            if r.get(v.name) == None:
                raise Exception(
                    f'{self.commandName}: {v.name}プロパティが設定されていません。')

        # パラメータのキーを取得
        for key in params.keys():
            # パラメータ仕様にないパラメータ
            if not key in self.specs:
                raise Exception(
                    f'{self.commandName}: {key}プロパティは、パラメータ仕様に定義されていません。')
            # 値を取得
            value = r.get(key)
            # 値のチェックを行う
            self.specs[key].validate(value)
Exemple #3
0
    def proc(self, context: CommandContext):
        """
        メイン処理を行います。
        context.get_rows()を呼び出して、データ行を取得しながら、
        データ加工を行ってください。

        渡されてくるデータは、イテレータの場合もあるので、次に
        引き継ぐために、context.set_rows()で、データを引き渡してください。

        """

        # 次へ引き渡す行
        rows = []
        for row in iter(context.get_rows()):
            # Rowラッパーに変換
            row = Row(row)
            if self.__write_header == False:
                self.__write_header = True
                headers = self.__params.headers
                if len(self.__params.headers) == 0:
                    headers = row.keys()
                self.__headers = headers
                if self.__params.header:
                    self.__writer.writerow(headers)

            rows.append(row)
            # 行を追加
            self.__writer.writerow([row.get(x) for x in self.__headers])

        # 次のコマンドへ引渡し
        context.set_rows(rows)
Exemple #4
0
    def proc(self, context: CommandContext):
        targets = self.__args.target_keys

        newRows = [Row(row) for row in context.get_rows()]
        if len(newRows) == 0:
            return

        rowColumns = [len(r.keys()) for r in newRows]
        index = rowColumns.index(max(rowColumns))

        if len(newRows) == 0:
            return

        if len(targets) == 0:
            targets = newRows[index].keys()

        table = prettytable.PrettyTable(targets)

        # アラインの設定
        for key in targets:
            val = newRows[0].get(key)
            table.align[key] = 'l'
            if type(val) == int:
                table.align[key] = 'r'
            if type(val) == bool:
                table.align[key] = 'c'

        for row in newRows:
            table.add_row([row.get(target) for target in targets])

        print(table)
        context.set_rows(newRows)
Exemple #5
0
    def proc(self, context: CommandContext):
        """
        メイン処理を行います。
        context.get_rows()を呼び出して、データ行を取得しながら、
        データ加工を行ってください。

        渡されてくるデータは、イテレータの場合もあるので、次に
        引き継ぐために、context.set_rows()で、データを引き渡してください。

        """

        # 次へ引き渡す行
        rows = []
        for row in iter(context.get_rows()):
            # Rowラッパーに変換
            row = Row(row)
            print(row)
            rows.append(row)

        # 次のコマンドへ引渡し
        context.set_rows(rows)
Exemple #6
0
    def proc(self, context: CommandContext):
        """
        メイン処理を行います。
        context.get_rows()を呼び出して、データ行を取得しながら、
        データ加工を行ってください。

        渡されてくるデータは、イテレータの場合もあるので、次に
        引き継ぐために、context.set_rows()で、データを引き渡してください。s
        """

        # 親データを保存
        if self.__iter_parent == None:
            self.__iter_parent = iter([row for row in context.get_rows()])
            self.__has_parent_data = True

        # 親から1行取得する
        if self.__iter_current == None:
            try:
                self.__parent_row = {}
                if self.__has_parent_data:
                    self.__parent_row = Row(next(self.__iter_parent))
            except StopIteration:
                self.__has_parent_data = False
                self.__iter_parent = None
                context.set_rows([])
                return

        if self.__iter_current == None:
            # このコマンドが提供するデータの取得処理を行う。
            # 例)ファイルをオープンして、データを読み込む
            if not self.__has_parent_data:
                self.__has_current_data = False
                context.set_rows([])
                return

            # データ取得処理
            newRows = []
            newRows = self.get_new_data(self.__parent_row)

            # 取得したデータを、未加工のまま次の処理へ
            self.__iter_current = iter(newRows)

        retRows = []
        while True:
            try:
                row = {}
                row = next(self.__iter_current)
            except StopIteration:
                self.__iter_current = None
                self.__has_current_data = False
                context.set_rows(retRows)
                return

            # 返却データを追加
            newRow = self.create_new_row(row)
            if newRow == None:
                continue

            retRows.append(newRow)

            # フェッチサイズに達したらwhileループ終了
            if self.__fetch_size > 0 and len(retRows) == self.__fetch_size:
                break

        # データを設定
        context.set_rows(retRows)
Exemple #7
0
def validate_spec(commandName: str, specDict: dict, logger) -> dict:
    spec = Row(specDict)
    if spec.get('name') == None:
        logger.error(f'{commandName}.yml: nameプロパティが定義されていません')

    if spec.get('comment') == None:
        logger.error(f'{commandName}.yml: commentプロパティが定義されていません')

    if spec.get('parameters') == None:
        logger.error(f'{commandName}.yml: parameterプロパティが定義されていません')

    if spec.get('sample') == None:
        logger.error(f'{commandName}.yml: sampleプロパティが定義されていません')

    ret = ArgSpecs(commandName)
    for name in spec.get('parameters').keys():
        param = Row(spec.get('parameters')[name])

        if param.get('type') == None:
            logger.error(f'{commandName}.yml: {name}.typeが指定されていません')

        checkTypes = []
        if type(param.get('type')) == str:
            checkTypes.append(param.get('type'))
        elif type(param.get('type')) == list:
            checkTypes = param.get('type')

        if len(checkTypes) > 0:
            for typeValue in checkTypes:
                if not typeValue in [
                        'string', 'int', 'bool', 'enum', 'list', 'object',
                        'dict'
                ]:
                    logger.error(
                        f'{commandName}.yml: {name}.type は、string,int,bool,enum,list,dict,objectの何れかを指定してください'
                    )

        if param.get('type') == 'enum':
            if param.get('values') == None:
                logger.error(
                    f'{commandName}.yml: {name}.type がenumの時は、列挙値をvaluesに配列で記述してください'
                )

        if param.get('comment') == None:
            logger.error(
                f'{commandName}.yml: {name}.comment が定義されていません。パラメータの説明を記述してください'
            )

        if param.get('require') == None:
            logger.error(f'{commandName}.yml: {name}.require が定義されていません。')

        if param.get('default') == None:
            logger.error(f'{commandName}.yml: {name}.default が定義されていません。')

        ret.append(
            ArgSpec(name, param.get('type'), param.get('values'),
                    param.get('comment'), param.get('require'),
                    param.get('default')))
    return ret
Exemple #8
0
    def proc(self, context: CommandContext):
        """
        メイン処理を行います。
        context.get_rows()を呼び出して、データ行を取得しながら、
        データ加工を行ってください。

        渡されてくるデータは、イテレータの場合もあるので、次に
        引き継ぐために、context.set_rows()で、データを引き渡してください。

        """
        # 正規表現取得
        reg = self.__reg
        # マッチングターゲットキーを取得
        target_key = self.__params.target_key
        # 結果格納用のキーを取得
        match_result_key = self.__params.match_result_key
        # 出力用のフィールド
        output = self.__params.output_keys

        # 次へ引き渡す行
        rows = []
        for row in iter(context.get_rows()):
            if type(row) == dict:
                row = dict(row)
            if type(row) == Row:
                row = dict(row.raw())

            # Rowラッパーに変換
            row = Row(row)
            row.set(match_result_key, False)
            # 検索対象文字列を取得
            line = row.get(target_key)
            if line == None:
                continue

            newRow = dict(output)

            # 正規表現マッチング
            pos = None
            matchResult = reg.match(line)

            if matchResult:
                # マッチ結果を保存
                row.set(match_result_key, True)

                # グループ1の発見場所を保存
                groups = matchResult.groups()
                if len(groups) > 0:
                    pos = matchResult.start(1)

                if len(groups) > 0:
                    # 正規表現のマッチング結果を、置換します。
                    if self.__params.extract_type == 'index':
                        for key in self.__params.group_key_map:
                            index = int(self.__params.group_key_map[key])
                            newRow[key] = groups[index - 1]
                    else:
                        # ?Pで指定された正規表現のマッチ結果を抽出
                        d = matchResult.groupdict()
                        for key in d.keys():
                            newRow[key] = d[key]
            elif self.__params.skip_unmatch:
                continue

            row.set('pos', pos)

            # 結果をマージ
            for key in newRow.keys():
                row.set(key, newRow.get(key))

            rows.append(row.raw())

        # 次のコマンドへ引渡し
        context.set_rows(rows)